From 60df59bed1bee71c89997e91c77d4636d7b75a27 Mon Sep 17 00:00:00 2001 From: David Schleef Date: Tue, 21 Feb 2012 18:56:42 -0800 Subject: [PATCH 001/138] autogen.sh: avoid touching .po files during 'make' A simple workaround to deal with GNU gettext automake integration failing to deal with git. Fixes #669207 --- autogen.sh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/autogen.sh b/autogen.sh index 8a56c7acc1..a7f26dfe27 100755 --- a/autogen.sh +++ b/autogen.sh @@ -29,6 +29,10 @@ then ln -s ../../common/hooks/pre-commit.hook .git/hooks/pre-commit fi +# GNU gettext automake support doesn't get along with git. +# https://bugzilla.gnome.org/show_bug.cgi?id=661128 +touch -t 200001010000 po/$package-0.10.pot + CONFIGURE_DEF_OPT='--enable-maintainer-mode --enable-gtk-doc' autogen_options $@ From d4b24d9fa56fc24ec9b8d89b105a130fff69a8f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Thu, 23 Feb 2012 11:55:16 +0000 Subject: [PATCH 002/138] Bump version after release --- NEWS | 333 +- RELEASE | 518 +- configure.ac | 6 +- docs/plugins/gst-plugins-bad-plugins.args | 516 +- .../plugins/gst-plugins-bad-plugins.hierarchy | 290 +- .../gst-plugins-bad-plugins.interfaces | 6 + docs/plugins/inspect/plugin-adpcmdec.xml | 2 +- docs/plugins/inspect/plugin-adpcmenc.xml | 2 +- docs/plugins/inspect/plugin-aiff.xml | 2 +- docs/plugins/inspect/plugin-apexsink.xml | 2 +- docs/plugins/inspect/plugin-asfmux.xml | 2 +- docs/plugins/inspect/plugin-assrender.xml | 2 +- .../inspect/plugin-audiovisualizers.xml | 2 +- docs/plugins/inspect/plugin-autoconvert.xml | 2 +- docs/plugins/inspect/plugin-bayer.xml | 2 +- docs/plugins/inspect/plugin-bz2.xml | 2 +- docs/plugins/inspect/plugin-camerabin.xml | 2 +- docs/plugins/inspect/plugin-camerabin2.xml | 2 +- docs/plugins/inspect/plugin-cdaudio.xml | 2 +- docs/plugins/inspect/plugin-cdxaparse.xml | 2 +- docs/plugins/inspect/plugin-celt.xml | 2 +- docs/plugins/inspect/plugin-chromaprint.xml | 34 + docs/plugins/inspect/plugin-cog.xml | 2 +- docs/plugins/inspect/plugin-coloreffects.xml | 2 +- docs/plugins/inspect/plugin-colorspace.xml | 2 +- docs/plugins/inspect/plugin-curl.xml | 2 +- docs/plugins/inspect/plugin-dataurisrc.xml | 2 +- docs/plugins/inspect/plugin-dc1394.xml | 2 +- docs/plugins/inspect/plugin-dccp.xml | 2 +- docs/plugins/inspect/plugin-debugutilsbad.xml | 2 +- docs/plugins/inspect/plugin-decklink.xml | 6 +- docs/plugins/inspect/plugin-dfbvideosink.xml | 2 +- docs/plugins/inspect/plugin-dirac.xml | 2 +- docs/plugins/inspect/plugin-dtmf.xml | 2 +- docs/plugins/inspect/plugin-dtsdec.xml | 2 +- docs/plugins/inspect/plugin-dvb.xml | 2 +- docs/plugins/inspect/plugin-dvbsuboverlay.xml | 2 +- docs/plugins/inspect/plugin-dvdspu.xml | 2 +- docs/plugins/inspect/plugin-faac.xml | 6 +- docs/plugins/inspect/plugin-faad.xml | 4 +- docs/plugins/inspect/plugin-faceoverlay.xml | 2 +- docs/plugins/inspect/plugin-fbdevsink.xml | 2 +- docs/plugins/inspect/plugin-festival.xml | 2 +- docs/plugins/inspect/plugin-fieldanalysis.xml | 2 +- docs/plugins/inspect/plugin-fragmented.xml | 6 +- docs/plugins/inspect/plugin-freeverb.xml | 34 + docs/plugins/inspect/plugin-freeze.xml | 2 +- docs/plugins/inspect/plugin-frei0r.xml | 1983 +++- docs/plugins/inspect/plugin-gaudieffects.xml | 2 +- .../inspect/plugin-geometrictransform.xml | 4 +- docs/plugins/inspect/plugin-gsettings.xml | 2 +- docs/plugins/inspect/plugin-gsm.xml | 2 +- docs/plugins/inspect/plugin-gstsiren.xml | 2 +- docs/plugins/inspect/plugin-h264parse.xml | 2 +- docs/plugins/inspect/plugin-hdvparse.xml | 2 +- docs/plugins/inspect/plugin-id3tag.xml | 2 +- docs/plugins/inspect/plugin-inter.xml | 32 +- docs/plugins/inspect/plugin-interlace.xml | 2 +- docs/plugins/inspect/plugin-ivfparse.xml | 2 +- docs/plugins/inspect/plugin-jp2kdecimator.xml | 2 +- docs/plugins/inspect/plugin-jpegformat.xml | 2 +- docs/plugins/inspect/plugin-kate.xml | 29 +- docs/plugins/inspect/plugin-ladspa.xml | 8168 +---------------- .../plugins/inspect/plugin-legacyresample.xml | 2 +- docs/plugins/inspect/plugin-linsys.xml | 2 +- docs/plugins/inspect/plugin-liveadder.xml | 2 +- docs/plugins/inspect/plugin-mimic.xml | 2 +- docs/plugins/inspect/plugin-mms.xml | 2 +- docs/plugins/inspect/plugin-modplug.xml | 2 +- docs/plugins/inspect/plugin-mpeg2enc.xml | 2 +- docs/plugins/inspect/plugin-mpegdemux2.xml | 6 +- docs/plugins/inspect/plugin-mpegpsmux.xml | 4 +- docs/plugins/inspect/plugin-mpegtsdemux.xml | 4 +- docs/plugins/inspect/plugin-mpegtsmux.xml | 4 +- .../plugins/inspect/plugin-mpegvideoparse.xml | 2 +- docs/plugins/inspect/plugin-mplex.xml | 4 +- docs/plugins/inspect/plugin-musepack.xml | 4 +- docs/plugins/inspect/plugin-musicbrainz.xml | 2 +- docs/plugins/inspect/plugin-mve.xml | 2 +- docs/plugins/inspect/plugin-mxf.xml | 2 +- docs/plugins/inspect/plugin-mythtv.xml | 2 +- docs/plugins/inspect/plugin-neon.xml | 2 +- docs/plugins/inspect/plugin-nsf.xml | 2 +- docs/plugins/inspect/plugin-nuvdemux.xml | 2 +- docs/plugins/inspect/plugin-ofa.xml | 2 +- docs/plugins/inspect/plugin-patchdetect.xml | 2 +- docs/plugins/inspect/plugin-pcapparse.xml | 23 +- docs/plugins/inspect/plugin-pnm.xml | 2 +- docs/plugins/inspect/plugin-rawparse.xml | 2 +- docs/plugins/inspect/plugin-real.xml | 2 +- docs/plugins/inspect/plugin-removesilence.xml | 35 + docs/plugins/inspect/plugin-resindvd.xml | 2 +- docs/plugins/inspect/plugin-rfbsrc.xml | 2 +- docs/plugins/inspect/plugin-rsvg.xml | 2 +- docs/plugins/inspect/plugin-rtmp.xml | 2 +- docs/plugins/inspect/plugin-rtpmux.xml | 2 +- docs/plugins/inspect/plugin-rtpvp8.xml | 6 +- docs/plugins/inspect/plugin-scaletempo.xml | 2 +- docs/plugins/inspect/plugin-schro.xml | 6 +- docs/plugins/inspect/plugin-sdi.xml | 2 +- docs/plugins/inspect/plugin-sdp.xml | 2 +- docs/plugins/inspect/plugin-segmentclip.xml | 2 +- docs/plugins/inspect/plugin-shm.xml | 2 +- docs/plugins/inspect/plugin-smooth.xml | 34 + docs/plugins/inspect/plugin-sndfile.xml | 2 +- docs/plugins/inspect/plugin-soundtouch.xml | 2 +- docs/plugins/inspect/plugin-speed.xml | 2 +- docs/plugins/inspect/plugin-stereo.xml | 2 +- docs/plugins/inspect/plugin-subenc.xml | 23 +- docs/plugins/inspect/plugin-tta.xml | 2 +- docs/plugins/inspect/plugin-vcdsrc.xml | 2 +- docs/plugins/inspect/plugin-vdpau.xml | 2 +- .../inspect/plugin-videofiltersbad.xml | 2 +- docs/plugins/inspect/plugin-videomaxrate.xml | 2 +- docs/plugins/inspect/plugin-videomeasure.xml | 2 +- .../inspect/plugin-videoparsersbad.xml | 39 +- docs/plugins/inspect/plugin-videosignal.xml | 2 +- docs/plugins/inspect/plugin-vmnc.xml | 2 +- docs/plugins/inspect/plugin-vp8.xml | 2 +- docs/plugins/inspect/plugin-wildmidi.xml | 2 +- docs/plugins/inspect/plugin-xvid.xml | 4 +- docs/plugins/inspect/plugin-y4mdec.xml | 2 +- win32/common/config.h | 2 +- 123 files changed, 3851 insertions(+), 8504 deletions(-) create mode 100644 docs/plugins/inspect/plugin-chromaprint.xml create mode 100644 docs/plugins/inspect/plugin-freeverb.xml create mode 100644 docs/plugins/inspect/plugin-removesilence.xml create mode 100644 docs/plugins/inspect/plugin-smooth.xml diff --git a/NEWS b/NEWS index eb2c12f23c..4e7ab0830e 100644 --- a/NEWS +++ b/NEWS @@ -1,4 +1,335 @@ -This is GStreamer Bad Plug-ins 0.10.22, "Toy Piano" +This is GStreamer Bad Plug-ins 0.10.23, "The Game Has Changed" + +Changes since 0.10.22: + + * aiffparse: extract ID3 tags embedded in ID3 chunks + * amrwbenc: switch to the free vo-amrwbenc library + * apexsink: Add support for generation 2 AirTunes hardware + * applemedia: bump the rank of qtkitvideosrc to PRIMARY + * autoconvert: remove the initial-identity property from autoconvert, update for basetransform changes in core + * avcsrc: add AVC Video Services plugin for OS/X (captures DV or HDV video from Firewire port) + * basevideo: cater for format conversion + * basevideo: Fix locking, especially if both pads have different streaming threads + * basevideodecoder: add API to drop a frame and post a QoS message on the bus + * basevideodecoder: reverse playback support; limited legacy seeking support + * basevideodecoder: better caps handling; event handling fixes esp. discont and flush + * basevideoencoder: add support for new force-key-unit event API + * basevideoencoder: implement preset interface; enable clipping by default + * basevideoencoder: proxy the width/height/framerate/PAR constraints of downstream caps to upstream + * bayer2rgb: rewrite signal processing and convert to orc for better speed + * camerabin2: no longer experimental; add flags to disable conversion elements + * camerabin2: add "audio-filter" property; countless fixes + * camerabin: add "image-formatter" property + * camerabin: prevent audio source from providing clock; reset audiosrc timestamping + * camerabin: prevent captures from being lost when switching resolutions + * colorspace: Add JPEG YCbCr matrix + * colorspace: fix odd width and height handling in some fastpath cases + * colorspace: fix r210 writing only half a scanline + * d3dvideosink: new d3dvideosink element + * dc1394src: implement LATENCY query + * debugutils: new elements: compare (with memcmp and ssim method) and debugspy + * decklink: add more modes, connection type, "audio-input" and "subdevice" properties + * decklink: add support for Windows; properly set up analog input + * decklinksink: add audio support + * dfbvideosink: also consider non-accelerated DirectFB surfaces + * diracparse: make diracparse work correctly + * directdrawsink: handle pixel-aspect-ratio, lower rank to secondary + * dshowdecwrapper: fix COM initialization + * dtmf: post messages when starting to send/receive DTMF + * dtmfsrc: align DTMF sound buffers with last-stop from event + * dtmfsrc: reject start/stop requests that come out of order + * dvbsrc: add "timeout" property and use (interruptible) GstPoll + * element-templates: improve the audiofilter template + * faac: add properties for VBR encoding + * faac: add profile and level to the caps; negotiate output format from downstream caps + * facedetect: detect face features (mouth, nose, eyes) and drop faces that don't have them + * faceoverlay: add element that displays an SVG image over a detected face + * freeverb: new freeverb element (reverb effect) + * h263parse: also extract width and height into caps; propagate downstream caps + * h264parse: many negotiation and caps-related fixes; propagate downstream caps where appropriate + * h264parse: countless parsing and timestamping fixes + * hlsdemux: allow bandwidth switching during caching of fragments + * hlsdemux: make more error resilient + * hlsdemux: cache number of fragments we are required to cache + * hlsdemux: add seeking support (for streams that are not live) + * hlsdemux: implement duration and seeking queries; improved duration reporting + * hlsdemux: Send a flush-stop when switching pads. Fixes A -> A/V sync issue + * hlsdemux: implement buffering by posting buffering messages on the bus + * hlsdemux: send NEWSEGMENT events in TIME format + * hlsdemux: switch to higher/lower bitrate by more than one step at a time + * hsldemux: handle change of media types + * inter: new intermediate surface elements: inter{video,audio,sub}{sink,src} to decouple elements within the same pipeline + * invtelecine: Remove in favor of fieldanalysis + * irtspparse: add Interleaved RTSP parser element + * jifmux: change class to formatter, bump rank to secondary + * kate: do not consider an empty SPU to be a fatal error + * kateenc: don't error on empty input buffers + * kate: pass on timed event metadata as tags when we can + * kate: support for rendering on several YUV formats + * legacyh264parse: create correct avc codec-data + * legacyh264parse: delay pushing buffers until we have width/height + * legacyh264parse: fix output caps alignment for avc input + * modplug: fix modules playing as mono instead of stereo + * motioncells: new element to detect areas of motion + * mpeg2enc: support mjpegtools 2.0 + * mpeg4videoparse: properly handle profile and level in caps + * mpegpsdemux: timestamp handling and seeking fixes + * mpegpsmux: remember whether an incoming buffer is a keyunit or not + * mpegpsmux: add "aggregate-gops" property to aggregate GOPs into buffer lists + * mpegpsmux: put stream headers into output caps + * mpeg[pt]sdemux: Add support for AAC LATM/LOAS streams + * mpegtsbase: actually set seen_pat=TRUE when we see a PAT + * mpegtsdemux: always try to seek for to a keyframe; add accurate seeking support + * mpegtsdemux: fix frequent deadlock demuxing MPEG TS + * mpegtsdemux: fix scanning stopping too early + * mpegtsdemux: fix timestamps in newsegement event after seeking + * mpegtsdemux: implement key_unit seeking for MPEG2 video + * mpegtsdemux: payload parsing for H.264 + * mpegtsdemux: push based seeking based on PCR + * mpegtsmux: add support for force key unit events + * mpegtsmux: unset the current PCR stream when starting a new unit + * mpegtsparse: fix parsing of PSI table IDs + * mpegtsparse: support more character set encodings + * mpegts: stop scanning for keyframes as early as possible + * ofa: don't crash when there's no data to create a fingerprint from + * openal: new OpenAL sink and source elements: openalsrc, openalsink + * opencv: allow to build against 2.3.1 + * opus: new Opus audio codec elements: opusdec, opusenc, opusparsertpopusdepay, rtpopusay + * pcapparse: also support extracting tcp data; fix SLL parsing + * photography: add missing FLICKER_REDUCTION capability + * pvr2d: new pvrvideosink element + * psmux: fix writing of system header, which makes VLC not skip the adjacent PSM and play embedded H.264 streams + * removesilence: new plugin + * resindvdsrc: do not try to seek before the first chapter + * rotate: angle is in radians already, do not scale it + * rsvgdec: use input buffer timings if possible + * rtmp: add rtmpsink element for output to an RTMP server + * rtpdtmfmux: Add last-stop to dtmf-event upstream events + * rtpdtmfsrc: Correctly recognize the end of a buffer + * rtpdtmfsrc: Just error out if there is no clock + * rtpdtmfsrc: Make sure rtpdtmfsrc timestamps don't overlap + * rtpdtmfsrc: Put the inter digit interval at the end, not at the start + * rtpdtmfsrc: Respect ptime from the caps + * rtpdtmfsrc: Start at the last_stop from the start event if there was one + * rtpvp8: fix bitstream parsing using the wrong kind of bitreader + * rtpvp8: Reject unknown bitstream versions + * rtpvp8: Update the pay/depay to the ietf-draft-01 spec + * schroenc: balance encoder and video format alloc/dealloc + * schroenc: remove shape_output handling + * scopes: add a new element similar to synaesthesia + * scopes: add a simple fft based scope + * scopes: draw pixels with signle 32bit writes + * scopes: first version of a scopes plugin using a new baseclass + * scopes: fix elements descriptions + * shm: add ability to add uint64 tags on buffers + * shm: add buffer-time property + * smooth: new element, port to 0.10 + * soundtouch: Handling incoming rate when requested + * spacescope: add color-modes + * spacescope: use the drawhelpers and add a draw-style property + * spandsp: Adding spandsp plugin with spanplc element for packet loss concealment + * spectrascope: use add_pixel for non-white pixels + * subenc: Add webvttenc element + * teletextdec: New teletext decoder plugin based in zvbi + * tiger: add a "silent" property to skip rendering + * tsdemux: add explicit supported AAC stream-format in template caps + * tsdemux: countless fixes and improvements + * tta: decrease rank to NONE + * video: abstract surface API for HW accelerated codecs + * video: add GstVideoContext interface + * video: add libgstbasevideo PC file + * voaacenc: add new plugin for audio AAC encoder based on vo-aacenc lib + * voaacenc: add profile and level to the caps + * vp8dec: add check if we have legal aspect-ratio before reset it + * vp8dec: propagate downstream flow return to upstream + * vp8dec: use new basevideodecoder API to drop frames and get QoS messages posted + * vp8enc: add "lag-in-frames" and "min/maxsection-pct" options + * vp8enc: generate a timestamp for alt-ref frames + * wrappercamerabinsrc: push newsegments on video capture start + * xviddec: add video/mpeg,mpegversion=4 to the caps + * xvidenc: add profile/level to the caps and negotiate them with downstream + * xvidenc: add support for levels 4a/5/6 of the simple profile + * xvidenc: don't add the profile/level to the video/x-xvid caps + +Bugs fixed since 0.10.22: + + * 648021 : gst-plugins-bad/gst/nsf/ code not needed (can be replaced by ext/gme/) + * 655887 : gst_buffer_create_sub: assertion `buffer- > size > = offset + size' failed + * 597822 : Add removesilence plugin + * 608171 : [dvbsrc] many wake-ups in read_device on signal loss. + * 652677 : [bayer] compiler warning in orc-generated code + * 652956 : vp8enc: add more encoder options + * 654310 : FAAC VBR encoding support + * 655362 : [decklink] Add support for Windows + * 532820 : [mpegtsdemux] garbled display + * 550230 : A plug-in " openalsrc " for capture audio using OpenAL + * 569305 : [mgpegvideoparse] not all tags show up in gst.extend.discoverer + * 578926 : [h264parse] Make sure h264parse are autoplugged when required + * 589064 : resindvd doesn't behave right for " previous chapter " + * 599469 : resindvd: problems pre-rolling in the absence of audio + * 609639 : xviddec plugin caps does not allow MPEG 4 video - trivial fix + * 611046 : mpegtsmux: pcr problems + * 615615 : A plugin for audio output using OpenAL + * 615681 : [mpeg[pt]sdemux] do not support AAC LATM Stream type + * 616421 : celtenc/dec produces silent output with live sources + * 619739 : Teletext decoder element based on libzvbi + * 620119 : [dvdspu] Program received signal SIGSEGV, Segmentation fault. + * 625190 : Directshow decoders wrappers have COM initialization issues + * 625520 : dc1394src: timestamping problem + * 628284 : [rsvgdec] all buffer timestamps are set to zero + * 629244 : [opencv] Add motion detection element + * 631390 : dfbvideosink does not consider surfaces when blit is not accelerated + * 631416 : mpegpsdemux hits EOS too early + * 634582 : Localized menus when playing DVD + * 635917 : [mpegtsparse] don't parse and post all the EIT events. + * 640017 : basevideodecoder: add API to drop a frame and post a QoS message on the bus + * 641405 : [vp8enc] patch - allow to use best quality + * 641918 : [Camerabin2] Allow previewing without capture + * 642023 : [mpeg4videoparse] assertion `a_d != 0' failed + * 642759 : faceoverlay plugin: displays an SVG image over a detected face on a video stream + * 647055 : liveadder has a memory leak + * 647748 : [aacenc] add AAC audio encoder based on vo-aacenc lib + * 647842 : [faac] Detect ADTS/raw output in the downstream caps + * 648245 : mpegtsdemux: truncates last buffer + * 648478 : jpegparse: unit test for APP1/exif & comment parsing + * 648565 : clean_ups in opencv + * 648933 : [mpegvideoparse] Avoid searching for picture start codes when not needed + * 649391 : [jifmux] bump rank from none + * 649822 : wrappercamerabinsrc: add a filter property + * 649832 : [camerabin2]: negotiation problems when capturing + * 649931 : [apexsink] Allow to play to new, generation 2 AirTunes (AirPlay) hardware + * 650072 : [basevideoencoder] Fix use-after-free after state change transition + * 650171 : gst/dccp: fix build on newer mingw + * 650228 : Fix h264parse negotiation + * 650323 : [h264parse] leaks entire input if converting bytestream - > avc,au + * 650416 : [h264parse] Assertion failure: nal_size > =2 + * 650484 : h264parse should increase max allowed PPS id from 31 to 255 + * 650594 : [faac] AAC profile support in the caps + * 650595 : voaacenc needs profile caps support + * 650914 : decklink sink has no audio support + * 650970 : mpeg2enc: fix build with mjpegtools 2.0 + * 651050 : [mpegtsmux] error " Stream on pad xxx is not associated with any program " debug output incorrect pointer instead of padname + * 651779 : directdrawsink: keep aspect ratio + * 651782 : add d3dvideosink on windows + * 652035 : [d3dvideosink] Fix configure check and makefiles + * 652261 : xvidenc needs codec profiles in caps + * 652694 : rtpvp8pay fails on error-resilient stream + * 652902 : vp8dec: Add check if we have legal aspect-ratio before reset it. + * 652924 : [tta] playing white noise instead of file contents + * 652951 : vp8enc: Set correct timestamp/duration for altref/invisible frames + * 652995 : legacyh264parse wrong access-unit output + * 653013 : h264parse fails to create SPS when input uses 4 byte start code + * 653087 : [h264parse] Assertions on valid h264 streams when converting to stream-format=avc,alignment=nal + * 653161 : wininet.h checking during configure + * 653481 : tsdemux: Fail to sync to stream when input buffers lacks OFFSET + * 653544 : [basevideodecoder] Immediately forwards synchronized events + * 654293 : [basevideodecoder] Leaks coder_hook + * 654416 : [mpegtsmux] gst_buffer_unref () call segfaults + * 654572 : Set but unused warning + * 654657 : tsdemux: newsegment for push-mode is wrong + * 654666 : mpeg4videoparse: Fix failure to find frames on some streams + * 654799 : Add force-key-unit support to mpegtsmux + * 654805 : Missing gstdecklink.h in sys/decklink when doing a " make dist " + * 654806 : Missing dependencies for gst/intra + * 654840 : dfbvideosink: fix harmless typo in variable initialization + * 654844 : dtsdec: stream with jitter sounds broken + * 655112 : videomaxrate: add " max-rate " property and improve caps negotiation + * 655319 : hlsdemux: compilation problem on NetBSD caused by wrong GST_ELEMENT_ERROR usage + * 655361 : pcapparse: fix SLL parsing + * 655540 : mpegtsbase: gst_structure_id_get() called with wrong type + * 655804 : Play position advancing but frames not rendered + * 656107 : shmsink should have a buffer-time property. + * 656115 : mpegpsdemux: handle SCR jumps/discontinuities more gracefully + * 656164 : dirac triggers set but unused variable warnings + * 656166 : schroedinger: triggers set-but-not-used warnings from gcc + * 656226 : [faac] Does not passthrough downstream caps constraints to upstream + * 656641 : Segfault using ofa element + * 656686 : celtdec: make this compile with git libcelt + * 656928 : vp8: probe for the new tuning API to keep building with older libvpx + * 656929 : vp8: drop frames is a uint in the libvpx API, not a boolean + * 657033 : kate: emit timed metadata as tags + * 657091 : kate: do not clear out high bits from display area + * 657250 : rsndvdbin attempts to modify read only metadata + * 657363 : tests: make camerabin2 test build + * 657368 : basevideoencoder: fix element leak + * 657419 : basevideoenc: do not try to calculate latency from an unknown framerate + * 658251 : dccp: cross compile warning - " WINVER " redefined + * 658450 : mpegvideoparse: make this build with older glib + * 658800 : h264parse: do not try to read from a non existent VUI + * 658940 : kate: flush on seek, and ensure we cancel any waiting buffer + * 658973 : mpegvideoparse: avoid reading past a buffer + * 659061 : camerabin2: replace deprecated g_atomic_int_exchange_and_add + * 659087 : celt: various cleanups/fixes + * 659485 : mpegpsdemux: large MPEG PS file not working when seeking/transcoding with encodebin + * 659836 : Transcoding crash with new git master FAAC + * 659924 : Fix some MPEG-2 transport streams containing audio and private data + * 660118 : mpegtsdemux: keep CRC data in .rodata + * 660234 : [mpeg4videoparse] Use strings for the profile/level fields in caps + * 660364 : opus: misc cleanup/fixes + * 660406 : [rtpvp8] update rtp vp8 pay/depay to the latest IETF draft version 01 + * 660469 : opus/celt: fix calculation of filler data size + * 660528 : kate: rendering performance improvements + * 660630 : kate: fix race condition on PAUSED- > READY state change + * 660999 : opusenc: fix latency query + * 661053 : some patches to gsth264parse.c + * 661066 : Segfault when transcoding a file from Ogg to Quicktime + * 661098 : [rtmp] need to initialize winsock 2 dll + * 661113 : Some patches to h264parse + * 661614 : mplex configure check broken with mjpegtools 2.0.0 + * 662164 : vc1parser: fix parsing of FRMRTQ_POSTPROC, BITRTQ_POSTPROC and sequence layer + * 662321 : GstVideoContext to enable context sharing + * 662420 : Abstract surface API for HW accelerated decoders + * 662746 : vc1parser: fix parsing of RANGEREDFRM + * 662776 : vc1parser: do not overwrite buffer + * 662857 : tiger: add a 'silent' property to skip rendering + * 662949 : [h264parse] Doesn't use PAR from bitstream + * 663180 : h264parse tests are not valgrind clean + * 663203 : colorspace: fix r210 writing only half a scanline + * 663234 : tests: allow building with older versions of glib (g_list_free_full) + * 663235 : mpegvideoparser: input data is const, mark it so + * 663238 : colorspace: fix width/height mismatches + * 663309 : mpegvideoparse: Fix in picture header parse. + * 663346 : autoconvert: merge caps instead of using union + * 663552 : h264parse: conditional jump or or move depends on uninitialised value(s) + * 663768 : mimic, opencv, vp8, acmmp3dec, linsys: Don't build static plugins + * 663782 : Progressive support for gstmpegvideoparser + * 664048 : camerabin: Document requirement to be in PLAYING state for capture-start + * 664123 : [h264parse] Conversion from AVC to byte stream fails for nal_length_size != 4 + * 664257 : [mpegtsparse] Support UTF-16BE text encoding + * 664631 : Build error: gstsmooth.c:205:3: error: format '%d' expects type 'int', but argument 8 has type 'gulong' + * 664725 : aiffparse: extract embedded ID3 tags + * 664815 : opusenc: Fixing " Unused var " compiling error for opus codec + * 664817 : Adding opus RTP payloader/depayloader module + * 665078 : opus: work without the Ogg headers + * 665205 : rsndvd: sends buffers before newsegment event + * 665378 : Fail to compile xvidenc in ubuntu 11.04 uninstalled setup + * 665418 : h264parse produce AVC: nal size -1702885365 + * 665584 : [h264parse] Reduce latency and cpu usage for packetized input + * 665631 : mpeg4videoparse regressions + * 665703 : mpeg4videoparse: memory leak + * 665814 : mpegtsdemux: add a property to control whether to signal no-more-pads + * 666517 : Frequent deadlock while discovering a MPEG TS file + * 666584 : Invalid memory access in gsth264parse + * 666750 : Compiler warning- > error in faac + * 667560 : h264parse: H.264 reverse playback does not work anymore + * 668192 : codecparsers: h264: fix ref_pic_list_modification() + * 668311 : does pkg-config check for gst-plugins-good-0.10.pc which is not installed + * 668380 : [h264parse] [codecparsers] gst_h264_parse_hrd_parameters not reading cbr_flag + * 668381 : [h264parse] [codecparsers] SEI parsing fails when payload contains emulation_prevention_three_byte + * 668471 : [h264parse] Negotiation regression for autoplugging + * 668521 : REQUIREMENTS file doesn't list requirement for rtmp + * 668627 : [h264parse] conversion avc/au to byte-stream/au broken + * 668833 : kateenc provides wrong duration information when muxed in Matroska + * 669365 : rotate plugin docs say that 'angle' is in radians, yet seems to be in degrees + * 669697 : shmsink blocking forever + * 628609 : The qtwrapperaudiodec_samr decoder doesn't handle buffers containing many AMR frames properly + * 655318 : photography: add missing FLICKER_REDUCTION capability + +API additions since 0.10.22: + + * GstSurfaceBuffer, GstSurfaceConverter, GstDeviceContext + * codec parser library + * video decoder and encoder base class API Changes since 0.10.21: diff --git a/RELEASE b/RELEASE index 32685ce52a..d1f47072e1 100644 --- a/RELEASE +++ b/RELEASE @@ -1,5 +1,5 @@ -Release notes for GStreamer Bad Plug-ins 0.10.22 "Toy Piano" +Release notes for GStreamer Bad Plug-ins 0.10.23 "The Game Has Changed" @@ -60,148 +60,328 @@ contains a set of well-supported plug-ins, but might pose problems for Features of this release - * aiffparse: add support for 32 bit and 64 bit floating point formats - * aiffparse: the SSND header is 16 bytes large, not 8 + 16 bytes - * assrender: refactor blitting, avoid writing past end of buffer - * camerabin2: Add a property to select the encoding profile - * camerabin2: Add custom filter properties - * camerabin2: Add image-done message - * camerabin2: Adding audio support for video recordings - * camerabin2: Adding properties for image capture settings - * camerabin2: Add methods for preview image message posting - * camerabin2: Add preview-filter property - * camerabin2: Adds new idle property - * camerabin2: Add viewfinder caps related properties - * camerabin2: Add viewfinder-sink property - * camerabin2: Implement previewing - * camerabin2: Implement tagsetter interface - * camerabin2: Move preview helper functions to basecamerabinsrc - * camerabin2: Move to encodebin - * camerabin2: Moving preview image properties to basecamerasrc - * camerabin: adding audio related properties - * camerabin: Always take photo when preview-caps is set - * camerabin: don't rely on the application running the default GLib main loop - * camerabin: Events with select-all in input-selector - * camerabin: Fix corner case for preview posting - * camerabin: Use running time for muxing - * celtenc: Fix compilation with celt >= 0.11.0 - * colorspace: add 16-bit-per-channel handling - * colorspace: add dithering, add support for r210 and fix YUV->RGB matrixing - * curlsink: add libcurl-based sink element - * decklink: Add decklink plugin - * directdrawsink: avoid aspect-ratio borders overlying other windows - * directdrawsink: avoid rendering to invalid area - * dshowvideosink: update for latest GstXOverlay changes - * dvbsuboverlay: Fix using alpha values in blitting - * dvdspu: don't write clipped lines to the output buffer - * dvdsubdec: make up clut values if they weren't set - * fieldanalysis: new fieldanalysis element - * fpsdisplaysink: add "silent" property, fix "sync" property default value - * fpsdisplaysink: add "frames-dropped" and "frames-rendered" properties - * fpsdisplaysink: add "last-message" property and never print anything to stdout - * gme: fix infinite looping by fading out after two loops - * h263parse: add an h263parse element - * hlsdemux: Add HTTP live streaming parser/demuxer element - * id3mux: map new GST_TAG_ENCODED_BY to ID3v2 TENC frame - * jifmux: Add GstTagXmpWriter support - * jp2kdec, jp2kenc: add support v308 (4:4:4 YUV) - * jp2kdec: post proper error when the image's colour space is not supported - * jpegparse: misc. fixes - * linsys: Add plugin for Linear Systems SDI boards - * logoinsert: add "data" property; fix memleaks - * mpegtsdemux: new (not-yet autoplugged) MPEG TS demuxer rewrite - * mpegtsmux: add byte-stream to h264 template pad caps - * mpegtsmux: don't error out if downstream fails to handle the newsegment event - * mpegtspacketizer: Handle all ISO8859-x encodings in get_encoding() - * opencv: make work with openCV 2.2 - * patchdetect: new element - * rsvgoverlay: allow negative values for x/y/width/height - * rsvgoverlay: implement x/y/width/height (absolute and relative) positioning and dimensioning - * rtpvp8: Add simple payloaders and depayloaders for VP8 - * scenechange: new scene change detection element - * sdi: Add raw SDI muxing/demuxing elements - * shm: Allow ShmPipe to save a data pointer for applications - * shm: Keep the ShmPipe alive as long as there are blocks left - * shm: Make default perm u+rw g+r for shm area - * shmsink: ensure gst_poll_wait is called first on descriptors - * shmsink: Keep shmsink referenced while there are still buffers around - * shmsrc: Keep GstPoll for whole src lifetime - * shmsrc: Only connect to sink in PLAYING in live mode - * vdpau: fixup GstFlowReturn handling - * vdpausink: fix bug where we didn't setup vdpau on a user set window - * videoparsers: new h263parse element - * videoparsers: baseparse-based dirac parser, new baseparse-based h264parse - * xvidenc: proxy downstream caps restrictions upstream via get_caps() - * zebrastripe: New element + * aiffparse: extract ID3 tags embedded in ID3 chunks + * amrwbenc: switch to the free vo-amrwbenc library + * apexsink: Add support for generation 2 AirTunes hardware + * applemedia: bump the rank of qtkitvideosrc to PRIMARY + * autoconvert: remove the initial-identity property from autoconvert, update for basetransform changes in core + * avcsrc: add AVC Video Services plugin for OS/X (captures DV or HDV video from Firewire port) + * basevideo: cater for format conversion + * basevideo: Fix locking, especially if both pads have different streaming threads + * basevideodecoder: add API to drop a frame and post a QoS message on the bus + * basevideodecoder: reverse playback support; limited legacy seeking support + * basevideodecoder: better caps handling; event handling fixes esp. discont and flush + * basevideoencoder: add support for new force-key-unit event API + * basevideoencoder: implement preset interface; enable clipping by default + * basevideoencoder: proxy the width/height/framerate/PAR constraints of downstream caps to upstream + * bayer2rgb: rewrite signal processing and convert to orc for better speed + * camerabin2: no longer experimental; add flags to disable conversion elements + * camerabin2: add "audio-filter" property; countless fixes + * camerabin: add "image-formatter" property + * camerabin: prevent audio source from providing clock; reset audiosrc timestamping + * camerabin: prevent captures from being lost when switching resolutions + * colorspace: Add JPEG YCbCr matrix + * colorspace: fix odd width and height handling in some fastpath cases + * colorspace: fix r210 writing only half a scanline + * d3dvideosink: new d3dvideosink element + * dc1394src: implement LATENCY query + * debugutils: new elements: compare (with memcmp and ssim method) and debugspy + * decklink: add more modes, connection type, "audio-input" and "subdevice" properties + * decklink: add support for Windows; properly set up analog input + * decklinksink: add audio support + * dfbvideosink: also consider non-accelerated DirectFB surfaces + * diracparse: make diracparse work correctly + * directdrawsink: handle pixel-aspect-ratio, lower rank to secondary + * dshowdecwrapper: fix COM initialization + * dtmf: post messages when starting to send/receive DTMF + * dtmfsrc: align DTMF sound buffers with last-stop from event + * dtmfsrc: reject start/stop requests that come out of order + * dvbsrc: add "timeout" property and use (interruptible) GstPoll + * element-templates: improve the audiofilter template + * faac: add properties for VBR encoding + * faac: add profile and level to the caps; negotiate output format from downstream caps + * facedetect: detect face features (mouth, nose, eyes) and drop faces that don't have them + * faceoverlay: add element that displays an SVG image over a detected face + * freeverb: new freeverb element (reverb effect) + * h263parse: also extract width and height into caps; propagate downstream caps + * h264parse: many negotiation and caps-related fixes; propagate downstream caps where appropriate + * h264parse: countless parsing and timestamping fixes + * hlsdemux: allow bandwidth switching during caching of fragments + * hlsdemux: make more error resilient + * hlsdemux: cache number of fragments we are required to cache + * hlsdemux: add seeking support (for streams that are not live) + * hlsdemux: implement duration and seeking queries; improved duration reporting + * hlsdemux: Send a flush-stop when switching pads. Fixes A -> A/V sync issue + * hlsdemux: implement buffering by posting buffering messages on the bus + * hlsdemux: send NEWSEGMENT events in TIME format + * hlsdemux: switch to higher/lower bitrate by more than one step at a time + * hsldemux: handle change of media types + * inter: new intermediate surface elements: inter{video,audio,sub}{sink,src} to decouple elements within the same pipeline + * invtelecine: Remove in favor of fieldanalysis + * irtspparse: add Interleaved RTSP parser element + * jifmux: change class to formatter, bump rank to secondary + * kate: do not consider an empty SPU to be a fatal error + * kateenc: don't error on empty input buffers + * kate: pass on timed event metadata as tags when we can + * kate: support for rendering on several YUV formats + * legacyh264parse: create correct avc codec-data + * legacyh264parse: delay pushing buffers until we have width/height + * legacyh264parse: fix output caps alignment for avc input + * modplug: fix modules playing as mono instead of stereo + * motioncells: new element to detect areas of motion + * mpeg2enc: support mjpegtools 2.0 + * mpeg4videoparse: properly handle profile and level in caps + * mpegpsdemux: timestamp handling and seeking fixes + * mpegpsmux: remember whether an incoming buffer is a keyunit or not + * mpegpsmux: add "aggregate-gops" property to aggregate GOPs into buffer lists + * mpegpsmux: put stream headers into output caps + * mpeg[pt]sdemux: Add support for AAC LATM/LOAS streams + * mpegtsbase: actually set seen_pat=TRUE when we see a PAT + * mpegtsdemux: always try to seek for to a keyframe; add accurate seeking support + * mpegtsdemux: fix frequent deadlock demuxing MPEG TS + * mpegtsdemux: fix scanning stopping too early + * mpegtsdemux: fix timestamps in newsegement event after seeking + * mpegtsdemux: implement key_unit seeking for MPEG2 video + * mpegtsdemux: payload parsing for H.264 + * mpegtsdemux: push based seeking based on PCR + * mpegtsmux: add support for force key unit events + * mpegtsmux: unset the current PCR stream when starting a new unit + * mpegtsparse: fix parsing of PSI table IDs + * mpegtsparse: support more character set encodings + * mpegts: stop scanning for keyframes as early as possible + * ofa: don't crash when there's no data to create a fingerprint from + * openal: new OpenAL sink and source elements: openalsrc, openalsink + * opencv: allow to build against 2.3.1 + * opus: new Opus audio codec elements: opusdec, opusenc, opusparsertpopusdepay, rtpopusay + * pcapparse: also support extracting tcp data; fix SLL parsing + * photography: add missing FLICKER_REDUCTION capability + * pvr2d: new pvrvideosink element + * psmux: fix writing of system header, which makes VLC not skip the adjacent PSM and play embedded H.264 streams + * removesilence: new plugin + * resindvdsrc: do not try to seek before the first chapter + * rotate: angle is in radians already, do not scale it + * rsvgdec: use input buffer timings if possible + * rtmp: add rtmpsink element for output to an RTMP server + * rtpdtmfmux: Add last-stop to dtmf-event upstream events + * rtpdtmfsrc: Correctly recognize the end of a buffer + * rtpdtmfsrc: Just error out if there is no clock + * rtpdtmfsrc: Make sure rtpdtmfsrc timestamps don't overlap + * rtpdtmfsrc: Put the inter digit interval at the end, not at the start + * rtpdtmfsrc: Respect ptime from the caps + * rtpdtmfsrc: Start at the last_stop from the start event if there was one + * rtpvp8: fix bitstream parsing using the wrong kind of bitreader + * rtpvp8: Reject unknown bitstream versions + * rtpvp8: Update the pay/depay to the ietf-draft-01 spec + * schroenc: balance encoder and video format alloc/dealloc + * schroenc: remove shape_output handling + * scopes: add a new element similar to synaesthesia + * scopes: add a simple fft based scope + * scopes: draw pixels with signle 32bit writes + * scopes: first version of a scopes plugin using a new baseclass + * scopes: fix elements descriptions + * shm: add ability to add uint64 tags on buffers + * shm: add buffer-time property + * smooth: new element, port to 0.10 + * soundtouch: Handling incoming rate when requested + * spacescope: add color-modes + * spacescope: use the drawhelpers and add a draw-style property + * spandsp: Adding spandsp plugin with spanplc element for packet loss concealment + * spectrascope: use add_pixel for non-white pixels + * subenc: Add webvttenc element + * teletextdec: New teletext decoder plugin based in zvbi + * tiger: add a "silent" property to skip rendering + * tsdemux: add explicit supported AAC stream-format in template caps + * tsdemux: countless fixes and improvements + * tta: decrease rank to NONE + * video: abstract surface API for HW accelerated codecs + * video: add GstVideoContext interface + * video: add libgstbasevideo PC file + * voaacenc: add new plugin for audio AAC encoder based on vo-aacenc lib + * voaacenc: add profile and level to the caps + * vp8dec: add check if we have legal aspect-ratio before reset it + * vp8dec: propagate downstream flow return to upstream + * vp8dec: use new basevideodecoder API to drop frames and get QoS messages posted + * vp8enc: add "lag-in-frames" and "min/maxsection-pct" options + * vp8enc: generate a timestamp for alt-ref frames + * wrappercamerabinsrc: push newsegments on video capture start + * xviddec: add video/mpeg,mpegversion=4 to the caps + * xvidenc: add profile/level to the caps and negotiate them with downstream + * xvidenc: add support for levels 4a/5/6 of the simple profile + * xvidenc: don't add the profile/level to the video/x-xvid caps Bugs fixed in this release - * 646211 : [camerabin] state changes need to be made when recording a video - * 608786 : [mpegtsmux] Internal H.264 byte-stream wrapping isn't working correctly - * 334107 : xviddec: segmentation fault after a few frames - * 582167 : jacksink does not flush the jack port when going to READY - * 586848 : qtmux, asfmux: remuxing streams with different start times - * 591651 : dvbsrc: use better nicks for GstDvbSrcModulation and other enums - * 594035 : [hlsdemux] Add HTTP Live Streaming playback support - * 594280 : directdrawsink: avoid rendering to invalid area - * 602847 : [dvdspu] Segfaults on seeking in matroska file - * 611061 : [mpegtsmux] some buffers are forgotten to push in m2ts_mode - * 615655 : [camerabin] shouldn't rely on running GLib main loop - * 616814 : Photography interface extension: colour tone mode and noise reduction settings - * 617532 : [qtmux] Take into account new-segments for incoming streams - * 622276 : Add an h263parse element - * 626618 : jpegparse doesn't handle APP12 marker - * 632056 : Directdrawsink draws black stripes over the overlying dialog windows. - * 639502 : [camerabin] should not re-create preview pipeline when setting new preview caps - * 639763 : [dvbsuboverlay] Green borders around subtitles - * 639841 : examples: camerabin: Don't set default values for GstPhotography interface settings - * 640286 : elements/imagecapturebin check fails - * 640287 : camerabin2 checks fail - * 640327 : Add VP8 RTP payloaders and depayloaders - * 640561 : opencv textwrite element renaming and proper structuring: - * 640637 : Camerabin has warning: Internal GStreamer error: clock problem. - * 640885 : Permission problems building bad - * 641047 : [mpegaudioparse] Multiple issues with new mpegaudioparse element from -bad, lower rank? - * 641178 : rtpvp8: build problem, needs to link with libgstbase-0.10 - * 641496 : New plugin: curlsink - * 641530 : Camerabin should capture image if preview_caps is set even if filename is not set - * 641712 : XWindow is never created in gst-camerabin-test example application - * 641796 : opencv: make plugin work with opencv 2.2.0 release - * 641857 : baseparse: Update min/max bitrate before first posting them - * 641858 : mpegaudioparse: Post CBR bitrate as nominal bitrate - * 642116 : rsvgoverlay: add position/dimension parameters - * 642658 : rsvgoverlay: allow negative values for position/dimension parameters - * 642671 : fieldanalysis: New element for analysing video input to produce progressive output - * 643469 : fpsdisplaysink: add frames-dropped and frames-rendered properties - * 643471 : fpsdisplaysink: fix default sync property value - * 643607 : [celt] Doesn't compile with celt 0.11.1 - * 644176 : videofilters: needs to link against libm - * 644208 : dcaparse: add depth and endianness to dts caps to allow elements to negotiate on these certain stream format requirements - * 644429 : [mpegtsmux] in m2ts-mode, the tp_extra_header is incorrect - * 645006 : [mpegtsmux] in m2ts-mode, PAT is written only once - * 645053 : shm: multiple compile failures on Solaris 10 - * 645412 : [h264parse] h264parse doesn't set framed=True on src caps - * 645420 : [scaletempo] Incorrectly handles new segments with stop == -1 - * 645502 : [h264parse] leaks fatally on certain streams - * 645568 : aiffparse: doesn't play 24-bit AIFF properly - * 645711 : patchdetect: link error while using gcc-4.52 - * 646256 : qtmux " buffer without timestamp/duration " error message could be more helpful - * 646495 : hlsdemux: Add missing patches from my local branch - * 646840 : shmsink: ensure gst_poll_wait is the first gst_poll function called on a descriptor - * 646955 : dshowvideosink: Update to reflect latest GstXOverlay changes - * 647030 : [fpsdisplaysink] " silent " property - * 647364 : VGM files loop indefinately - * 647498 : xvidenc not forwarding caps - * 647564 : gst-plugins-bad configure.ac summary wrongly claims an exif plugin - * 647830 : assrender: crashes with very large subtitles - * 647852 : [schroenc] Crashes after some time when getting buffers after EOS - * 647853 : [schrodec] Impossible to play very short files - * 647854 : [schrodec] Allocates buffers with NULL caps from downstream - * 648001 : configure: Fix linsys/decklink checks for Linux - * 648929 : [tsdemux] Memory leaks everywhere - * 649005 : y4mdec: add plugin description - * 647751 : [hlsdemux] Fix usage of the element in players - * 621027 : mpegtsparse problem when parsing EIT and obtaining Transport Stream packet size + * 648021 : gst-plugins-bad/gst/nsf/ code not needed (can be replaced by ext/gme/) + * 655887 : gst_buffer_create_sub: assertion `buffer- > size > = offset + size' failed + * 597822 : Add removesilence plugin + * 608171 : [dvbsrc] many wake-ups in read_device on signal loss. + * 652677 : [bayer] compiler warning in orc-generated code + * 652956 : vp8enc: add more encoder options + * 654310 : FAAC VBR encoding support + * 655362 : [decklink] Add support for Windows + * 532820 : [mpegtsdemux] garbled display + * 550230 : A plug-in " openalsrc " for capture audio using OpenAL + * 569305 : [mgpegvideoparse] not all tags show up in gst.extend.discoverer + * 578926 : [h264parse] Make sure h264parse are autoplugged when required + * 589064 : resindvd doesn't behave right for " previous chapter " + * 599469 : resindvd: problems pre-rolling in the absence of audio + * 609639 : xviddec plugin caps does not allow MPEG 4 video - trivial fix + * 611046 : mpegtsmux: pcr problems + * 615615 : A plugin for audio output using OpenAL + * 615681 : [mpeg[pt]sdemux] do not support AAC LATM Stream type + * 616421 : celtenc/dec produces silent output with live sources + * 619739 : Teletext decoder element based on libzvbi + * 620119 : [dvdspu] Program received signal SIGSEGV, Segmentation fault. + * 625190 : Directshow decoders wrappers have COM initialization issues + * 625520 : dc1394src: timestamping problem + * 628284 : [rsvgdec] all buffer timestamps are set to zero + * 629244 : [opencv] Add motion detection element + * 631390 : dfbvideosink does not consider surfaces when blit is not accelerated + * 631416 : mpegpsdemux hits EOS too early + * 634582 : Localized menus when playing DVD + * 635917 : [mpegtsparse] don't parse and post all the EIT events. + * 640017 : basevideodecoder: add API to drop a frame and post a QoS message on the bus + * 641405 : [vp8enc] patch - allow to use best quality + * 641918 : [Camerabin2] Allow previewing without capture + * 642023 : [mpeg4videoparse] assertion `a_d != 0' failed + * 642759 : faceoverlay plugin: displays an SVG image over a detected face on a video stream + * 647055 : liveadder has a memory leak + * 647748 : [aacenc] add AAC audio encoder based on vo-aacenc lib + * 647842 : [faac] Detect ADTS/raw output in the downstream caps + * 648245 : mpegtsdemux: truncates last buffer + * 648478 : jpegparse: unit test for APP1/exif & comment parsing + * 648565 : clean_ups in opencv + * 648933 : [mpegvideoparse] Avoid searching for picture start codes when not needed + * 649391 : [jifmux] bump rank from none + * 649822 : wrappercamerabinsrc: add a filter property + * 649832 : [camerabin2]: negotiation problems when capturing + * 649931 : [apexsink] Allow to play to new, generation 2 AirTunes (AirPlay) hardware + * 650072 : [basevideoencoder] Fix use-after-free after state change transition + * 650171 : gst/dccp: fix build on newer mingw + * 650228 : Fix h264parse negotiation + * 650323 : [h264parse] leaks entire input if converting bytestream - > avc,au + * 650416 : [h264parse] Assertion failure: nal_size > =2 + * 650484 : h264parse should increase max allowed PPS id from 31 to 255 + * 650594 : [faac] AAC profile support in the caps + * 650595 : voaacenc needs profile caps support + * 650914 : decklink sink has no audio support + * 650970 : mpeg2enc: fix build with mjpegtools 2.0 + * 651050 : [mpegtsmux] error " Stream on pad xxx is not associated with any program " debug output incorrect pointer instead of padname + * 651779 : directdrawsink: keep aspect ratio + * 651782 : add d3dvideosink on windows + * 652035 : [d3dvideosink] Fix configure check and makefiles + * 652261 : xvidenc needs codec profiles in caps + * 652694 : rtpvp8pay fails on error-resilient stream + * 652902 : vp8dec: Add check if we have legal aspect-ratio before reset it. + * 652924 : [tta] playing white noise instead of file contents + * 652951 : vp8enc: Set correct timestamp/duration for altref/invisible frames + * 652995 : legacyh264parse wrong access-unit output + * 653013 : h264parse fails to create SPS when input uses 4 byte start code + * 653087 : [h264parse] Assertions on valid h264 streams when converting to stream-format=avc,alignment=nal + * 653161 : wininet.h checking during configure + * 653481 : tsdemux: Fail to sync to stream when input buffers lacks OFFSET + * 653544 : [basevideodecoder] Immediately forwards synchronized events + * 654293 : [basevideodecoder] Leaks coder_hook + * 654416 : [mpegtsmux] gst_buffer_unref () call segfaults + * 654572 : Set but unused warning + * 654657 : tsdemux: newsegment for push-mode is wrong + * 654666 : mpeg4videoparse: Fix failure to find frames on some streams + * 654799 : Add force-key-unit support to mpegtsmux + * 654805 : Missing gstdecklink.h in sys/decklink when doing a " make dist " + * 654806 : Missing dependencies for gst/intra + * 654840 : dfbvideosink: fix harmless typo in variable initialization + * 654844 : dtsdec: stream with jitter sounds broken + * 655112 : videomaxrate: add " max-rate " property and improve caps negotiation + * 655319 : hlsdemux: compilation problem on NetBSD caused by wrong GST_ELEMENT_ERROR usage + * 655361 : pcapparse: fix SLL parsing + * 655540 : mpegtsbase: gst_structure_id_get() called with wrong type + * 655804 : Play position advancing but frames not rendered + * 656107 : shmsink should have a buffer-time property. + * 656115 : mpegpsdemux: handle SCR jumps/discontinuities more gracefully + * 656164 : dirac triggers set but unused variable warnings + * 656166 : schroedinger: triggers set-but-not-used warnings from gcc + * 656226 : [faac] Does not passthrough downstream caps constraints to upstream + * 656641 : Segfault using ofa element + * 656686 : celtdec: make this compile with git libcelt + * 656928 : vp8: probe for the new tuning API to keep building with older libvpx + * 656929 : vp8: drop frames is a uint in the libvpx API, not a boolean + * 657033 : kate: emit timed metadata as tags + * 657091 : kate: do not clear out high bits from display area + * 657250 : rsndvdbin attempts to modify read only metadata + * 657363 : tests: make camerabin2 test build + * 657368 : basevideoencoder: fix element leak + * 657419 : basevideoenc: do not try to calculate latency from an unknown framerate + * 658251 : dccp: cross compile warning - " WINVER " redefined + * 658450 : mpegvideoparse: make this build with older glib + * 658800 : h264parse: do not try to read from a non existent VUI + * 658940 : kate: flush on seek, and ensure we cancel any waiting buffer + * 658973 : mpegvideoparse: avoid reading past a buffer + * 659061 : camerabin2: replace deprecated g_atomic_int_exchange_and_add + * 659087 : celt: various cleanups/fixes + * 659485 : mpegpsdemux: large MPEG PS file not working when seeking/transcoding with encodebin + * 659836 : Transcoding crash with new git master FAAC + * 659924 : Fix some MPEG-2 transport streams containing audio and private data + * 660118 : mpegtsdemux: keep CRC data in .rodata + * 660234 : [mpeg4videoparse] Use strings for the profile/level fields in caps + * 660364 : opus: misc cleanup/fixes + * 660406 : [rtpvp8] update rtp vp8 pay/depay to the latest IETF draft version 01 + * 660469 : opus/celt: fix calculation of filler data size + * 660528 : kate: rendering performance improvements + * 660630 : kate: fix race condition on PAUSED- > READY state change + * 660999 : opusenc: fix latency query + * 661053 : some patches to gsth264parse.c + * 661066 : Segfault when transcoding a file from Ogg to Quicktime + * 661098 : [rtmp] need to initialize winsock 2 dll + * 661113 : Some patches to h264parse + * 661614 : mplex configure check broken with mjpegtools 2.0.0 + * 662164 : vc1parser: fix parsing of FRMRTQ_POSTPROC, BITRTQ_POSTPROC and sequence layer + * 662321 : GstVideoContext to enable context sharing + * 662420 : Abstract surface API for HW accelerated decoders + * 662746 : vc1parser: fix parsing of RANGEREDFRM + * 662776 : vc1parser: do not overwrite buffer + * 662857 : tiger: add a 'silent' property to skip rendering + * 662949 : [h264parse] Doesn't use PAR from bitstream + * 663180 : h264parse tests are not valgrind clean + * 663203 : colorspace: fix r210 writing only half a scanline + * 663234 : tests: allow building with older versions of glib (g_list_free_full) + * 663235 : mpegvideoparser: input data is const, mark it so + * 663238 : colorspace: fix width/height mismatches + * 663309 : mpegvideoparse: Fix in picture header parse. + * 663346 : autoconvert: merge caps instead of using union + * 663552 : h264parse: conditional jump or or move depends on uninitialised value(s) + * 663768 : mimic, opencv, vp8, acmmp3dec, linsys: Don't build static plugins + * 663782 : Progressive support for gstmpegvideoparser + * 664048 : camerabin: Document requirement to be in PLAYING state for capture-start + * 664123 : [h264parse] Conversion from AVC to byte stream fails for nal_length_size != 4 + * 664257 : [mpegtsparse] Support UTF-16BE text encoding + * 664631 : Build error: gstsmooth.c:205:3: error: format '%d' expects type 'int', but argument 8 has type 'gulong' + * 664725 : aiffparse: extract embedded ID3 tags + * 664815 : opusenc: Fixing " Unused var " compiling error for opus codec + * 664817 : Adding opus RTP payloader/depayloader module + * 665078 : opus: work without the Ogg headers + * 665205 : rsndvd: sends buffers before newsegment event + * 665378 : Fail to compile xvidenc in ubuntu 11.04 uninstalled setup + * 665418 : h264parse produce AVC: nal size -1702885365 + * 665584 : [h264parse] Reduce latency and cpu usage for packetized input + * 665631 : mpeg4videoparse regressions + * 665703 : mpeg4videoparse: memory leak + * 665814 : mpegtsdemux: add a property to control whether to signal no-more-pads + * 666517 : Frequent deadlock while discovering a MPEG TS file + * 666584 : Invalid memory access in gsth264parse + * 666750 : Compiler warning- > error in faac + * 667560 : h264parse: H.264 reverse playback does not work anymore + * 668192 : codecparsers: h264: fix ref_pic_list_modification() + * 668311 : does pkg-config check for gst-plugins-good-0.10.pc which is not installed + * 668380 : [h264parse] [codecparsers] gst_h264_parse_hrd_parameters not reading cbr_flag + * 668381 : [h264parse] [codecparsers] SEI parsing fails when payload contains emulation_prevention_three_byte + * 668471 : [h264parse] Negotiation regression for autoplugging + * 668521 : REQUIREMENTS file doesn't list requirement for rtmp + * 668627 : [h264parse] conversion avc/au to byte-stream/au broken + * 668833 : kateenc provides wrong duration information when muxed in Matroska + * 669365 : rotate plugin docs say that 'angle' is in radians, yet seems to be in degrees + * 669697 : shmsink blocking forever + * 628609 : The qtwrapperaudiodec_samr decoder doesn't handle buffers containing many AMR frames properly + * 655318 : photography: add missing FLICKER_REDUCTION capability Download @@ -230,47 +410,81 @@ Applications Contributors to this release + * Alessandro Decina * Alexey Fisher * Andoni Morales Alastruey * Andreas Frisch * Arun Raghavan - * Benjamin Gaignard - * Byeong-ryeol Kim - * Carl-Anton Ingmarsson - * Chris E Jones + * Brad Smith + * Brian Gitonga Marete * Christian Fredrik Kalager Schaller + * Danilo Cesar Lemes de Paula + * David King * David Schleef + * Debarshi Ray * Edward Hervey - * Fabrizio Milo - * Haakon Sporsheim - * Hu Gang + * Felipe Contreras + * Gabriel Strimtu + * George Kiagiadakis + * Guillaume Emont + * Gwenole Beauchesne + * Götz Waschk * Jan Schmidt * Janne Grunau + * Jonas Larsson + * Josep Torra + * Joshua M. Doe + * Julien Isorce + * Julien MOUTTE + * Krzysztof Krakowiak * Lasse Laukkanen + * Laura Lucas Alday * Lauri Lehtinen + * Levente Farkas * Luciana Fujii Pontello * Luis de Bethencourt + * Marc-André Lureau * Mark Nauwelaerts * Mart Raudsepp - * Mihai Draghicioiu - * Olivier Aubert + * Martin Storsjo + * Matej Knopp + * Mukul Majmudar + * Nicola Murino + * Nicolas Dufresne + * Olaf Seibert + * Oleksij Rempel (Alexey Fisher) * Olivier Crête - * Patricia Muscalu - * Philip Jägenstedt - * Philippe Normand + * Pino Toscano + * Quentin Smith + * Rafael Diniz * Raimo Järvi + * Raluca Elena Podiuc * René Stadler * Reynaldo H. Verdejo Pinochet + * Rob Clark + * Robert Jobbagy * Robert Swain + * Sameer Naik * Sebastian Dröge + * Sebastian Pölsterl * Sjoerd Simons * Sreerenj Balachandran * Stefan Kost + * Stefan Sauer * Teemu Katajisto * Thiago Santos * Thibault Saunier + * Thijs Vermeir + * Tiago César Katcipis + * Tim 'mithro' Ansell * Tim-Philipp Müller + * Tom Deseyn + * Tommi Myöhänen + * Vincent Génieux * Vincent Penquerc'h * Víctor Manuel Jáquez Leal + * W. Michael Petullo + * Youness Alaoui + * Zhao Halley * benjamin gaignard   \ No newline at end of file diff --git a/configure.ac b/configure.ac index a0f0c39358..63a0104920 100644 --- a/configure.ac +++ b/configure.ac @@ -3,7 +3,7 @@ AC_PREREQ(2.60) dnl initialize autoconf dnl when going to/from release please set the nano (fourth number) right ! dnl releases only do Wall, cvs and prerelease does Werror too -AC_INIT(GStreamer Bad Plug-ins, 0.10.22.1, +AC_INIT(GStreamer Bad Plug-ins, 0.10.23.1, http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer, gst-plugins-bad) @@ -52,8 +52,8 @@ AC_LIBTOOL_WIN32_DLL AM_PROG_LIBTOOL dnl *** required versions of GStreamer stuff *** -GST_REQ=0.10.35.1 -GSTPB_REQ=0.10.35.1 +GST_REQ=0.10.36 +GSTPB_REQ=0.10.36 dnl *** autotools stuff **** diff --git a/docs/plugins/gst-plugins-bad-plugins.args b/docs/plugins/gst-plugins-bad-plugins.args index 2640dd488c..a52f378a0d 100644 --- a/docs/plugins/gst-plugins-bad-plugins.args +++ b/docs/plugins/gst-plugins-bad-plugins.args @@ -38,10 +38,20 @@ 1 + +GstPitch::output-rate +gfloat +[0.1,10] +rw +Output Rate +Output rate on downstream segment events. +1 + + GstXvidEnc::averaging-period gint -[-1,100] +[G_MAXULONG,100] rw Averaging Period [CBR] Number of frames for which XviD averages bitrate. @@ -91,7 +101,7 @@ GstXvidEnc::buffer gint ->= -1 +>= G_MAXULONG rw Buffer Size [CBR] Size of the video buffers. @@ -121,7 +131,7 @@ GstXvidEnc::container-frame-overhead gint -[-1,100] +[G_MAXULONG,100] rw Container Frame Overhead [PASS2] Average container overhead per frame. @@ -151,7 +161,7 @@ GstXvidEnc::flow-control-strength gint -[-1,100] +[G_MAXULONG,100] rw Flow Control Strength [PASS2] Overflow control strength per frame. @@ -211,7 +221,7 @@ GstXvidEnc::keyframe-reduction gint -[-1,100] +[G_MAXULONG,100] rw Keyframe Reduction [PASS2] Keyframe size reduction in % of those within threshold. @@ -221,7 +231,7 @@ GstXvidEnc::keyframe-threshold gint -[-1,100] +[G_MAXULONG,100] rw Keyframe Threshold [PASS2] Distance between keyframes not to be subject to reduction. @@ -281,7 +291,7 @@ GstXvidEnc::max-overflow-degradation gint -[-1,100] +[G_MAXULONG,100] rw Max Overflow Degradation [PASS2] Amount in % that flow control can decrease frame size compared to ideal curve. @@ -291,7 +301,7 @@ GstXvidEnc::max-overflow-improvement gint -[-1,100] +[G_MAXULONG,100] rw Max Overflow Improvement [PASS2] Amount in % that flow control can increase frame size compared to ideal curve. @@ -421,7 +431,7 @@ GstXvidEnc::reaction-delay-factor gint -[-1,100] +[G_MAXULONG,100] rw Reaction Delay Factor [CBR] Reaction delay factor. @@ -1092,9 +1102,9 @@ GstFaac::bitrate gint [8000,320000] -rw +rwx Bitrate (bps) -Bitrate in bits/sec. +Average Bitrate (ABR) in bits/sec. 128000 @@ -1102,7 +1112,7 @@ GstFaac::midside gboolean -rw +rwx Midside Allow mid/side encoding. TRUE @@ -1132,7 +1142,7 @@ GstFaac::shortctl GstFaacShortCtl -rw +rwx Block type Block type encorcing. SHORTCTL_NORMAL @@ -1142,12 +1152,32 @@ GstFaac::tns gboolean -rw +rwx TNS Use temporal noise shaping. FALSE + +GstFaac::quality +gint +[1,1000] +rwx +Quality (%) +Variable bitrate (VBR) quantizer quality in %. +100 + + + +GstFaac::rate-control +GstFaacBrtype + +rwx +Rate Control (ABR/VBR) +Encoding bitrate type (VBR/ABR). +VBR + + GstDtsDec::drc gboolean @@ -10165,7 +10195,7 @@ rwx Effect-cutoff-freq Effect-cutoff-freq. -32.6377 +32.6376 @@ -12091,7 +12121,7 @@ ladspa-gate::Output-select gint -[-1,1] +[G_MAXULONG,1] rwx Output-select Output-select. @@ -22343,6 +22373,16 @@ + +GstPcapParse::ts-offset +gint64 +>= G_MAXULONG +rw +Timestamp Offset +Relative timestamp offset (ns) to apply (-1 = use absolute packet time). +-1 + + MpegTsMux::m2ts-mode gboolean @@ -23170,7 +23210,7 @@ rw Flags Flags to control behaviour. -Enable source crop and scale|Enable scale for viewfinder|Enable audio conversion for video capture|Enable colorspace conversion for still image|Enable colorspace conversion for video capture +Enable source crop and scale|Enable colorspace conversion for viewfinder|Enable scale for viewfinder|Enable audio conversion for video capture|Enable colorspace conversion for still image|Enable colorspace conversion for video capture @@ -26630,7 +26670,7 @@ rw physics water density: from 1 to 4. --5.83036e+303 +7.7486e-304 @@ -26670,7 +26710,7 @@ rw splash make a big splash in the center. -4.77773e-299 +8.20074e-304 @@ -26710,7 +26750,7 @@ rw ratiox x-ratio. -1.21136e-314 +1.82049e-316 @@ -26720,7 +26760,7 @@ rw ratioy y-ratio. -2.33156e-310 +-3.77929e+138 @@ -26730,7 +26770,7 @@ rw DelayTime the delay time. -1.37974e-309 +0 @@ -26780,7 +26820,7 @@ rw Color-R the color of the image. -0 +1.30952e-37 @@ -27110,7 +27150,7 @@ rw lredscale multiplier for downscaling non-edge brightness. -0 +2.34986e-310 @@ -27120,7 +27160,7 @@ rw lthresh threshold for edge lightening. -6.9235e+228 +2.34969e-310 @@ -27130,7 +27170,7 @@ rw lupscale multiplier for upscaling edge brightness. -8.20074e-304 +1.59292e-316 @@ -27300,7 +27340,7 @@ rw blend blend factor. -7.75037e-304 +0 @@ -27310,7 +27350,7 @@ rw fader the fader position. -3.84008e-315 +0 @@ -27490,7 +27530,7 @@ rw HSync the hsync offset. -1 +0 @@ -27913,6 +27953,16 @@ 1 + +GstKateTiger::silent +gboolean + +rw +silent +Whether to render the stream. +FALSE + + GstSchroEnc::au-distance gint @@ -27930,7 +27980,7 @@ rw bitrate bitrate. -13824000 +0 @@ -28030,7 +28080,7 @@ rw enable_multiquant enable_multiquant. -TRUE +FALSE @@ -28116,11 +28166,11 @@ GstSchroEnc::horiz-slices gint ->= 1 +>= 0 rw horiz_slices horiz_slices. -8 +0 @@ -28130,7 +28180,7 @@ rw inter_wavelet inter_wavelet. -le_gall_5_3 +desl_dubuc_9_7 @@ -28220,7 +28270,7 @@ rw magic_chroma_lambda_scale magic_chroma_lambda_scale. -0.01 +0.1 @@ -28320,7 +28370,7 @@ rw magic_scene_change_threshold magic_scene_change_threshold. -0.2 +3 @@ -28490,17 +28540,17 @@ rw transform_depth transform_depth. -4 +3 GstSchroEnc::vert-slices gint ->= 1 +>= 0 rw vert_slices vert_slices. -6 +0 @@ -45686,7 +45736,7 @@ GstVP8Enc::speed gint -[0,2] +[0,7] rw Speed Speed. @@ -45710,7 +45760,7 @@ rw Multipass Cache File Multipass cache file. -NULL +"multipass.cache" @@ -45753,6 +45803,106 @@ 0 + +GstVP8Enc::drop-frame +gint +[0,100] +rw +Drop Frame +Drop Frame. +0 + + + +GstVP8Enc::lag-in-frames +guint +<= 64 +rw +Max number of frames to lag +If set, this value allows the encoder to consume a number of input frames before producing output frames. +0 + + + +GstVP8Enc::maxsection-pct +guint +[200,800] +rw +maximum percentage allocation per section +The numbers represent a percentage of the average allocation per section (frame). +800 + + + +GstVP8Enc::minsection-pct +guint +<= 20 +rw +minimum percentage allocation per section +The numbers represent a percentage of the average allocation per section (frame). +5 + + + +GstVP8Enc::noise-sensitivity +gint +[0,6] +rw +Noise Sensitivity +Noise Sensitivity. +0 + + + +GstVP8Enc::resize-allowed +gboolean + +rw +Resize Allowed +Resize Allowed. +TRUE + + + +GstVP8Enc::sharpness +gint +[0,7] +rw +Sharpness +Sharpness. +0 + + + +GstVP8Enc::static-threshold +gint +[0,1000] +rw +Static Threshold +Static Threshold. +0 + + + +GstVP8Enc::token-parts +gint +[0,3] +rw +Token Parts +Token Parts. +0 + + + +GstVP8Enc::tune +GstVP8EncTune + +rw +Tune +Tune. +Tune for PSNR + + GstPhotography::aperture guint @@ -46163,6 +46313,16 @@ TRUE + +GstShmSink::buffer-time +guint64 + +rwx +Buffer Time of the shm buffer +Maximum Size of the shm buffer in nanoseconds (-1 to disable). +18446744073709551615 + + GstRTMPSrc::location gchar* @@ -47643,6 +47803,16 @@ + +GstViewfinderBin::disable-converters +gboolean + +rw +Disable conversion elements +If video converters should be disabled (must be set on NULL). +FALSE + + GstImageCaptureBin::image-encoder GstElement* @@ -47820,7 +47990,7 @@ rw Post Previews If capture preview images should be posted to the bus. -TRUE +FALSE @@ -47963,6 +48133,26 @@ + +GstCameraBin2::audio-filter +GstElement* + +rw +Audio filter +The element that will process captured audio buffers when recording. (Should be set on NULL state). + + + + +GstCameraBin2::flags +GstCamFlags + +rw +Flags +Flags to control behaviour. + + + GstZebraStripe::threshold gint @@ -57500,7 +57690,7 @@ rw Compare Meta Indicates which metadata should be compared. -GST_BUFFER_COPY_FLAGS|GST_BUFFER_COPY_TIMESTAMPS|GST_BUFFER_COPY_CAPS +GST_BUFFER_COPY_FLAGS|GST_BUFFER_COPY_TIMESTAMPS|GST_BUFFER_COPY_CAPS|GST_BUFFER_COPY_QDATA @@ -57643,6 +57833,26 @@ ntsc + +GstDecklinkSrc::audio-input +GstDecklinkAudioConnection + +rwx +Audio Input +Audio Input Connection. +auto + + + +GstDecklinkSrc::subdevice +gint +[0,3] +rwx +Subdevice +Subdevice. +0 + + GstDecklinkSink::mode GstDecklinkModes @@ -57653,3 +57863,223 @@ ntsc + +GstWebvttEnc::duration +gint64 + +rw +Offset for the duration +Offset for the duration of the subtitles. +0 + + + +GstWebvttEnc::timestamp +gint64 + +rw +Offset for the starttime +Offset for the starttime for the subtitles. +0 + + + +MpegPsMux::aggregate-gops +gboolean + +rw +Aggregate GOPs +Whether to aggregate GOPs and push them out as buffer lists. +FALSE + + + +GstFreeverb::damping +gfloat +[0,1] +rwx +Damping +Damping of high frequencies. +0.2 + + + +GstFreeverb::level +gfloat +[0,1] +rwx +Level +dry/wet level. +0.5 + + + +GstFreeverb::room-size +gfloat +[0,1] +rwx +Room size +Size of the simulated room. +0.5 + + + +GstFreeverb::width +gfloat +[0,1] +rwx +Width +Stereo panorama width. +1 + + + +GstInterVideoSrc::channel +gchar* + +rw +Channel +Channel name to match inter src and sink elements. +"default" + + + +GstInterVideoSink::channel +gchar* + +rw +Channel +Channel name to match inter src and sink elements. +"default" + + + +GstInterAudioSrc::channel +gchar* + +rw +Channel +Channel name to match inter src and sink elements. +"default" + + + +GstInterAudioSink::channel +gchar* + +rw +Channel +Channel name to match inter src and sink elements. +"default" + + + +GstSmooth::active +gboolean + +rw +active +process video. +TRUE + + + +GstSmooth::filter-size +gint + +rw +filter-size +size of media filter. +0 + + + +GstSmooth::luma-only +gboolean + +rw +luma-only +only filter luma part. +TRUE + + + +GstSmooth::tolerance +gint + +rw +tolerance +contrast tolerance for smoothing. +0 + + + +GstIRTSPParse::channel-id +gint +[0,255] +rw +channel-id +Channel Identifier. +0 + + + +GstWaveScope::style +GstWaveScopeStyle + +rwx +drawing style +Drawing styles for the wave form display. +draw dots (default) + + + +GstSpaceScope::style +GstSpaceScopeStyle + +rwx +drawing style +Drawing styles for the space scope display. +draw dots (default) + + + +GstRemoveSilence::hysteresis +guint64 +>= 1 +rw +Hysteresis +Set the hysteresis (on samples) used on the internal VAD. +480 + + + +GstRemoveSilence::remove +gboolean + +rw +Remove +Set to true to remove silence from the stream, false otherwhise. +FALSE + + + +GstChromaprint::duration +guint + +rw +Duration limit +Number of seconds of audio to use for fingerprinting. +120 + + + +GstChromaprint::fingerprint +gchar* + +r +Resulting fingerprint +Resulting fingerprint. +NULL + + diff --git a/docs/plugins/gst-plugins-bad-plugins.hierarchy b/docs/plugins/gst-plugins-bad-plugins.hierarchy index ef9c6f37b6..a8cbd2fa6f 100644 --- a/docs/plugins/gst-plugins-bad-plugins.hierarchy +++ b/docs/plugins/gst-plugins-bad-plugins.hierarchy @@ -1,5 +1,4 @@ GObject - GstAdapter GstColorBalanceChannel GstObject GstBus @@ -7,13 +6,22 @@ GObject GstSystemClock GstAudioClock GstElement - ADPCMDec - ADPCMEnc GstAiffMux GstAiffParse GstAsfMux GstAsfParse GstAssRender + GstAudioDecoder + ADPCMDec + GstCeltDec + GstDtsDec + GstFaad + GstGSMDec + GstAudioEncoder + ADPCMEnc + GstCeltEnc + GstFaac + GstGSMEnc GstBaseAudioVisualizer GstSpaceScope GstSpectraScope @@ -23,6 +31,7 @@ GObject GstDiracParse GstH263Parse GstH264Parse + GstIRTSPParse GstMpeg4VParse GstMpegvParse GstBaseRTPDepayload @@ -35,25 +44,26 @@ GObject GstBaseAudioSink GstAudioSink GstApExSink - GstNasSink - GstSDLAudioSink GstChecksumSink + GstCurlSink GstDCCPClientSink GstDCCPServerSink GstFBDEVSink GstInterAudioSink + GstInterSubSink GstInterVideoSink GstLinsysSdiSink + GstRTMPSink GstSFSink GstShmSink GstVideoSink GstDfbVideoSink - GstSDLVideoSink + VdpSink GstBaseSrc GstDTMFSrc GstDataURISrc - GstFliteTestSrc GstInterAudioSrc + GstInterSubSrc GstInterVideoSrc GstLinsysSdiSrc GstPushSrc @@ -62,14 +72,24 @@ GObject GstDc1394 GstDvbSrc GstMMS + GstMythtvSrc + GstNeonhttpSrc + GstRTMPSrc GstRfbSrc GstShmSrc GstVCDSrc + frei0r-src-ising0r + frei0r-src-lissajous0r + frei0r-src-nois0r + frei0r-src-onecol0r + frei0r-src-partik0l + frei0r-src-plasma GstRTPDTMFSrc GstSFSrc GstBaseTransform GstAudioFilter GstBPMDetect + GstChromaprint GstOFA GstStereo GstBayer2RGB @@ -79,12 +99,14 @@ GObject GstColorconvert GstDebugSpy GstDtmfDetect + GstFreeverb GstHDVParse GstLegacyresample GstLogoinsert GstMeasureCollector GstPatchdetect GstRGB2Bayer + GstRemoveSilence GstScaletempo GstVideoFilter GaussBlur @@ -114,10 +136,62 @@ GObject GstRotate GstSquare GstRsvgOverlay + GstSmooth GstSolarize GstVideoAnalyse GstVideoDetect GstVideoMark + frei0r-filter-3-point-color-balance + frei0r-filter-3dflippo + frei0r-filter-b + frei0r-filter-baltan + frei0r-filter-bluescreen0r + frei0r-filter-brightness + frei0r-filter-bw0r + frei0r-filter-cartoon + frei0r-filter-color-distance + frei0r-filter-contrast0r + frei0r-filter-curves + frei0r-filter-dealygrab + frei0r-filter-delay0r + frei0r-filter-distort0r + frei0r-filter-edgeglow + frei0r-filter-equaliz0r + frei0r-filter-flippo + frei0r-filter-g + frei0r-filter-gamma + frei0r-filter-glow + frei0r-filter-hueshift0r + frei0r-filter-invert0r + frei0r-filter-k-means-clustering + frei0r-filter-lens-correction + frei0r-filter-letterb0xed + frei0r-filter-levels + frei0r-filter-luminance + frei0r-filter-mask0mate + frei0r-filter-nervous + frei0r-filter-nosync0r + frei0r-filter-opencvfacedetect + frei0r-filter-perspective + frei0r-filter-pixeliz0r + frei0r-filter-primaries + frei0r-filter-r + frei0r-filter-rgb-parade + frei0r-filter-saturat0r + frei0r-filter-scale0tilt + frei0r-filter-scanline0r + frei0r-filter-sobel + frei0r-filter-squareblur + frei0r-filter-tehroxx0r + frei0r-filter-threelay0r + frei0r-filter-threshold0r + frei0r-filter-tint0r + frei0r-filter-transparency + frei0r-filter-twolay0r + frei0r-filter-vectorscope + frei0r-filter-vertigo + frei0r-filter-water + frei0r-filter-white-balance GstVideoFilter2 GstSceneChange GstZebraStripe @@ -125,9 +199,11 @@ GObject GstBaseVideoCodec GstBaseVideoDecoder GstSchroDec + GstVP8Dec GstBaseVideoEncoder GstDiracEnc GstSchroEnc + GstVP8Enc GstBin DvbBaseBin GstAutoConvert @@ -136,6 +212,12 @@ GObject GstWrapperCameraBinSrc GstFPSDisplaySink GstFaceOverlay + GstGSettingsSwitchSink + GstGSettingsAudioSink + GstGSettingsVideoSink + GstGSettingsSwitchSrc + GstGSettingsAudioSrc + GstGSettingsVideoSrc GstPipeline GstCameraBin GstCameraBin2 @@ -146,25 +228,16 @@ GObject GstBz2enc GstCDAudio GstCDXAParse - GstCeltDec - GstCeltEnc GstChopMyData GstCompare GstDVBSubOverlay GstDVDSpu GstDecklinkSink GstDecklinkSrc - GstDtsDec - GstFaad GstFestival GstFieldAnalysis GstFreeze - GstGSMDec - GstGSMEnc - GstGmeDec GstHLSDemux - GstId3BaseMux - GstId3Mux GstInterlace GstIvfParse GstJP2kDecimator @@ -174,6 +247,7 @@ GObject GstKateEnc GstKateParse GstKateTag + GstKateTiger GstLegacyH264Parse GstLiveAdder GstMSE @@ -182,8 +256,10 @@ GObject GstMimDec GstMimEnc GstModPlug + GstMpeg2enc GstMpegPSDemux GstMpegTSDemux + GstMplex GstMusepackDec GstMveDemux GstMveMux @@ -208,26 +284,170 @@ GObject GstAudioSegmentClip GstVideoSegmentClip GstSignalProcessor + ladspa-Chorus1 + ladspa-Chorus2 + ladspa-G2reverb + ladspa-Mvchpf-1 + ladspa-Mvclpf-1 + ladspa-Mvclpf-2 + ladspa-Mvclpf-3 + ladspa-Mvclpf-4 + ladspa-Phaser1 + ladspa-Phaser1+LFO + ladspa-TripleChorus + ladspa-alias + ladspa-allpass-c + ladspa-allpass-l + ladspa-allpass-n + ladspa-amPitchshift + ladspa-amp ladspa-amp-mono ladspa-amp-stereo + ladspa-analogueOsc + ladspa-artificialLatency + ladspa-autoPhaser + ladspa-bandpass-a-iir + ladspa-bandpass-iir + ladspa-bodeShifter + ladspa-bodeShifterCV + ladspa-butthigh-iir + ladspa-buttlow-iir + ladspa-bwxover-iir + ladspa-chebstortion + ladspa-comb + ladspa-comb-c + ladspa-comb-l + ladspa-comb-n + ladspa-combSplitter + ladspa-const + ladspa-crossoverDist + ladspa-dcRemove + ladspa-decay + ladspa-decimator + ladspa-declip ladspa-delay-5s + ladspa-delay-c + ladspa-delay-l + ladspa-delay-n + ladspa-delayorama + ladspa-diode + ladspa-divider + ladspa-dj-eq + ladspa-dj-eq-mono + ladspa-djFlanger + ladspa-dysonCompress + ladspa-fadDelay + ladspa-fastLookaheadLimiter + ladspa-flanger + ladspa-fmOsc + ladspa-foldover + ladspa-fourByFourPole + ladspa-foverdrive + ladspa-freqTracker + ladspa-gate + ladspa-giantFlange + ladspa-gong + ladspa-gongBeater + ladspa-gsm + ladspa-gverb + ladspa-hardLimiter + ladspa-harmonicGen + ladspa-hermesFilter + ladspa-highpass-iir + ladspa-hilbert ladspa-hpf + ladspa-imp + ladspa-impulse-fc + ladspa-inv + ladspa-karaoke + ladspa-lcrDelay + ladspa-lfoPhaser + ladspa-lowpass-iir ladspa-lpf + ladspa-lsFilter + ladspa-matrixMSSt + ladspa-matrixSpatialiser + ladspa-matrixStMS + ladspa-mbeq + ladspa-modDelay + ladspa-multivoiceChorus ladspa-noise-white + ladspa-notch-iir + ladspa-pitchScale + ladspa-pitchScaleHQ + ladspa-plate + ladspa-pointerCastDistortion + ladspa-rateShifter + ladspa-retroFlange + ladspa-revdelay + ladspa-ringmod-1i1o1l + ladspa-ringmod-2i1o + ladspa-satanMaximiser + ladspa-sc1 + ladspa-sc2 + ladspa-sc3 + ladspa-sc4 + ladspa-sc4m + ladspa-se4 + ladspa-shaper + ladspa-sifter + ladspa-sinCos ladspa-sine-faaa ladspa-sine-faac ladspa-sine-fcaa ladspa-sine-fcac + ladspa-singlePara + ladspa-sinusWavewrapper + ladspa-smoothDecimate + ladspa-split + ladspa-stepMuxer + ladspa-surroundEncoder + ladspa-svf + ladspa-tap-autopan + ladspa-tap-chorusflanger + ladspa-tap-deesser + ladspa-tap-doubler + ladspa-tap-dynamics-m + ladspa-tap-dynamics-st + ladspa-tap-equalizer + ladspa-tap-equalizer-bw + ladspa-tap-limiter + ladspa-tap-pinknoise + ladspa-tap-pitch + ladspa-tap-reflector + ladspa-tap-reverb + ladspa-tap-rotspeak + ladspa-tap-sigmoid + ladspa-tap-stereo-echo + ladspa-tap-tremolo + ladspa-tap-tubewarmth + ladspa-tap-vibrato + ladspa-tapeDelay + ladspa-transient + ladspa-triplePara + ladspa-valve + ladspa-valveRect + ladspa-vynil + ladspa-waveTerrain + ladspa-xfade + ladspa-xfade4 + ladspa-zm1 GstSirenDec GstSirenEnc GstSpeed GstSrtEnc GstTRM + GstTagMux + GstId3Mux GstTtaDec GstTtaParse GstVMncDec GstVcdParse + GstVdpVideoPostProcess + GstWebvttEnc GstWildmidi + GstXvidDec + GstXvidEnc GstY4mDec MpegPsMux MpegTSBase @@ -236,7 +456,44 @@ GObject MpegTSParse MpegTsMux MpegVideoParse + SatBaseVideoDecoder + GstVdpDecoder + GstVdpH264Dec + GstVdpMpeg4Dec + GstVdpMpegDec + frei0r-mixer-addition + frei0r-mixer-alpha-injection + frei0r-mixer-alphaatop + frei0r-mixer-alphain + frei0r-mixer-alphaout + frei0r-mixer-alphaover + frei0r-mixer-alphaxor + frei0r-mixer-blend + frei0r-mixer-burn + frei0r-mixer-color-only + frei0r-mixer-composition + frei0r-mixer-darken + frei0r-mixer-difference + frei0r-mixer-divide + frei0r-mixer-dodge + frei0r-mixer-grain-extract + frei0r-mixer-grain-merge + frei0r-mixer-hardlight + frei0r-mixer-hue + frei0r-mixer-lighten + frei0r-mixer-multiply + frei0r-mixer-overlay + frei0r-mixer-rgb + frei0r-mixer-saturation + frei0r-mixer-screen + frei0r-mixer-softlight + frei0r-mixer-subtract + frei0r-mixer-uv-map + frei0r-mixer-value + frei0r-mixer-xfade0r GstPad + GstVdpOutputSrcPad + GstVdpVideoSrcPad GstPadTemplate GstSignalProcessorPadTemplate GstPlugin @@ -250,6 +507,7 @@ GObject GstTask GstTaskPool GstSignalObject + GstVdpDevice MpegTsPatInfo MpegTsPmtInfo GInterface diff --git a/docs/plugins/gst-plugins-bad-plugins.interfaces b/docs/plugins/gst-plugins-bad-plugins.interfaces index c62655fbdb..994ac3c9df 100644 --- a/docs/plugins/gst-plugins-bad-plugins.interfaces +++ b/docs/plugins/gst-plugins-bad-plugins.interfaces @@ -1,7 +1,9 @@ +ADPCMEnc GstPreset DvbBaseBin GstChildProxy GstURIHandler GstAmrWbEnc GstPreset GstApExSink GstImplementsInterface GstMixer GstAsfMux GstTagSetter +GstAudioEncoder GstPreset GstAutoConvert GstChildProxy GstAutoVideoConvert GstChildProxy GstBaseCameraSrc GstChildProxy @@ -10,6 +12,7 @@ GstBin GstChildProxy GstCDAudio GstURIHandler GstCameraBin GstChildProxy GstImplementsInterface GstColorBalance GstTagSetter GstCameraBin2 GstChildProxy GstTagSetter +GstCeltEnc GstPreset GstTagSetter GstCeltEnc GstTagSetter GstPreset GstDataURISrc GstURIHandler GstDfbVideoSink GstImplementsInterface GstNavigation GstColorBalance @@ -17,6 +20,8 @@ GstDiracEnc GstPreset GstFPSDisplaySink GstChildProxy GstFaac GstPreset GstFaceOverlay GstChildProxy +GstFreeverb GstPreset +GstGSMEnc GstPreset GstGSettingsAudioSink GstChildProxy GstGSettingsAudioSrc GstChildProxy GstGSettingsSwitchSink GstChildProxy @@ -38,6 +43,7 @@ GstRTMPSrc GstURIHandler GstSDLVideoSink GstImplementsInterface GstXOverlay GstNavigation GstSDPDemux GstChildProxy GstSchroEnc GstPreset +GstTagMux GstTagSetter GstVCDSrc GstURIHandler GstVP8Enc GstPreset GstTagSetter GstVP8Enc GstTagSetter GstPreset diff --git a/docs/plugins/inspect/plugin-adpcmdec.xml b/docs/plugins/inspect/plugin-adpcmdec.xml index cfaf8767c3..6c14c7ca57 100644 --- a/docs/plugins/inspect/plugin-adpcmdec.xml +++ b/docs/plugins/inspect/plugin-adpcmdec.xml @@ -3,7 +3,7 @@ ADPCM decoder ../../gst/adpcmdec/.libs/libgstadpcmdec.so libgstadpcmdec.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins git diff --git a/docs/plugins/inspect/plugin-adpcmenc.xml b/docs/plugins/inspect/plugin-adpcmenc.xml index de83e4b7f1..6931a29eb7 100644 --- a/docs/plugins/inspect/plugin-adpcmenc.xml +++ b/docs/plugins/inspect/plugin-adpcmenc.xml @@ -3,7 +3,7 @@ ADPCM encoder ../../gst/adpcmenc/.libs/libgstadpcmenc.so libgstadpcmenc.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins git diff --git a/docs/plugins/inspect/plugin-aiff.xml b/docs/plugins/inspect/plugin-aiff.xml index e31c7d9714..b6ed5362fc 100644 --- a/docs/plugins/inspect/plugin-aiff.xml +++ b/docs/plugins/inspect/plugin-aiff.xml @@ -3,7 +3,7 @@ Create and parse Audio Interchange File Format (AIFF) files ../../gst/aiff/.libs/libgstaiff.so libgstaiff.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins git diff --git a/docs/plugins/inspect/plugin-apexsink.xml b/docs/plugins/inspect/plugin-apexsink.xml index 2af03ecc17..ae6e639bcf 100644 --- a/docs/plugins/inspect/plugin-apexsink.xml +++ b/docs/plugins/inspect/plugin-apexsink.xml @@ -3,7 +3,7 @@ Apple AirPort Express Plugin ../../ext/apexsink/.libs/libgstapexsink.so libgstapexsink.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins git diff --git a/docs/plugins/inspect/plugin-asfmux.xml b/docs/plugins/inspect/plugin-asfmux.xml index 5fd6129799..20f137b211 100644 --- a/docs/plugins/inspect/plugin-asfmux.xml +++ b/docs/plugins/inspect/plugin-asfmux.xml @@ -3,7 +3,7 @@ ASF Muxer Plugin ../../gst/asfmux/.libs/libgstasfmux.so libgstasfmux.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins git diff --git a/docs/plugins/inspect/plugin-assrender.xml b/docs/plugins/inspect/plugin-assrender.xml index 4e7fff501a..b719d19e73 100644 --- a/docs/plugins/inspect/plugin-assrender.xml +++ b/docs/plugins/inspect/plugin-assrender.xml @@ -3,7 +3,7 @@ ASS/SSA subtitle renderer ../../ext/assrender/.libs/libgstassrender.so libgstassrender.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins git diff --git a/docs/plugins/inspect/plugin-audiovisualizers.xml b/docs/plugins/inspect/plugin-audiovisualizers.xml index 8f8f2bcadc..39663fb878 100644 --- a/docs/plugins/inspect/plugin-audiovisualizers.xml +++ b/docs/plugins/inspect/plugin-audiovisualizers.xml @@ -3,7 +3,7 @@ Creates video visualizations of audio input ../../gst/audiovisualizers/.libs/libgstaudiovisualizers.so libgstaudiovisualizers.so - 0.10.22.1 + 0.10.23.1 GPL gst-plugins-bad GStreamer Bad Plug-ins git diff --git a/docs/plugins/inspect/plugin-autoconvert.xml b/docs/plugins/inspect/plugin-autoconvert.xml index 648b34ae1d..7083feddb8 100644 --- a/docs/plugins/inspect/plugin-autoconvert.xml +++ b/docs/plugins/inspect/plugin-autoconvert.xml @@ -3,7 +3,7 @@ Selects convertor element based on caps ../../gst/autoconvert/.libs/libgstautoconvert.so libgstautoconvert.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins git diff --git a/docs/plugins/inspect/plugin-bayer.xml b/docs/plugins/inspect/plugin-bayer.xml index bab7e6a5d8..8352a7c915 100644 --- a/docs/plugins/inspect/plugin-bayer.xml +++ b/docs/plugins/inspect/plugin-bayer.xml @@ -3,7 +3,7 @@ Elements to convert Bayer images ../../gst/bayer/.libs/libgstbayer.so libgstbayer.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins git diff --git a/docs/plugins/inspect/plugin-bz2.xml b/docs/plugins/inspect/plugin-bz2.xml index d5588302f1..75ceedd88f 100644 --- a/docs/plugins/inspect/plugin-bz2.xml +++ b/docs/plugins/inspect/plugin-bz2.xml @@ -3,7 +3,7 @@ Compress or decompress streams ../../ext/bz2/.libs/libgstbz2.so libgstbz2.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins git diff --git a/docs/plugins/inspect/plugin-camerabin.xml b/docs/plugins/inspect/plugin-camerabin.xml index 4dd64ab3a9..b9d6b0e521 100644 --- a/docs/plugins/inspect/plugin-camerabin.xml +++ b/docs/plugins/inspect/plugin-camerabin.xml @@ -3,7 +3,7 @@ High level api for DC (Digital Camera) application ../../gst/camerabin/.libs/libgstcamerabin.so libgstcamerabin.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins git diff --git a/docs/plugins/inspect/plugin-camerabin2.xml b/docs/plugins/inspect/plugin-camerabin2.xml index 0814d04b2d..f61bb7c940 100644 --- a/docs/plugins/inspect/plugin-camerabin2.xml +++ b/docs/plugins/inspect/plugin-camerabin2.xml @@ -3,7 +3,7 @@ camerabin2 ../../gst/camerabin2/.libs/libgstcamerabin2.so libgstcamerabin2.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins git diff --git a/docs/plugins/inspect/plugin-cdaudio.xml b/docs/plugins/inspect/plugin-cdaudio.xml index 1b4e2d5651..0bb15d0f31 100644 --- a/docs/plugins/inspect/plugin-cdaudio.xml +++ b/docs/plugins/inspect/plugin-cdaudio.xml @@ -3,7 +3,7 @@ Play CD audio through the CD Drive ../../ext/cdaudio/.libs/libgstcdaudio.so libgstcdaudio.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins git diff --git a/docs/plugins/inspect/plugin-cdxaparse.xml b/docs/plugins/inspect/plugin-cdxaparse.xml index a0443a5afc..f870744092 100644 --- a/docs/plugins/inspect/plugin-cdxaparse.xml +++ b/docs/plugins/inspect/plugin-cdxaparse.xml @@ -3,7 +3,7 @@ Parse a .dat file (VCD) into raw mpeg1 ../../gst/cdxaparse/.libs/libgstcdxaparse.so libgstcdxaparse.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins git diff --git a/docs/plugins/inspect/plugin-celt.xml b/docs/plugins/inspect/plugin-celt.xml index da3e8989f1..d13e89670c 100644 --- a/docs/plugins/inspect/plugin-celt.xml +++ b/docs/plugins/inspect/plugin-celt.xml @@ -3,7 +3,7 @@ CELT plugin library ../../ext/celt/.libs/libgstcelt.so libgstcelt.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins git diff --git a/docs/plugins/inspect/plugin-chromaprint.xml b/docs/plugins/inspect/plugin-chromaprint.xml new file mode 100644 index 0000000000..0e88b0a04f --- /dev/null +++ b/docs/plugins/inspect/plugin-chromaprint.xml @@ -0,0 +1,34 @@ + + chromaprint + Calculate Chromaprint fingerprint from audio files + ../../ext/chromaprint/.libs/libgstchromaprint.so + libgstchromaprint.so + 0.10.23.1 + LGPL + gst-plugins-bad + GStreamer Bad Plug-ins git + Unknown package origin + + + chromaprint + Chromaprint fingerprinting element + Filter/Analyzer/Audio + Find an audio fingerprint using the Chromaprint library + Lukáš Lalinský <lalinsky@gmail.com> + + + sink + sink + always +
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-int, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2 ], endianness=(int){ 1234 }, width=(int){ 16 }, depth=(int){ 16 }, signed=(boolean)true
+
+
+
+
+
\ No newline at end of file diff --git a/docs/plugins/inspect/plugin-cog.xml b/docs/plugins/inspect/plugin-cog.xml index 51bbcd37b8..7b613c53c7 100644 --- a/docs/plugins/inspect/plugin-cog.xml +++ b/docs/plugins/inspect/plugin-cog.xml @@ -3,7 +3,7 @@ Cog plugin ../../ext/cog/.libs/libgstcog.so libgstcog.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins git diff --git a/docs/plugins/inspect/plugin-coloreffects.xml b/docs/plugins/inspect/plugin-coloreffects.xml index 7d2d235ccf..e7291b4115 100644 --- a/docs/plugins/inspect/plugin-coloreffects.xml +++ b/docs/plugins/inspect/plugin-coloreffects.xml @@ -3,7 +3,7 @@ Color Look-up Table filters ../../gst/coloreffects/.libs/libgstcoloreffects.so libgstcoloreffects.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins git diff --git a/docs/plugins/inspect/plugin-colorspace.xml b/docs/plugins/inspect/plugin-colorspace.xml index a5cf26c219..55b0b136b5 100644 --- a/docs/plugins/inspect/plugin-colorspace.xml +++ b/docs/plugins/inspect/plugin-colorspace.xml @@ -3,7 +3,7 @@ Colorspace conversion ../../gst/colorspace/.libs/libgstcolorspace.so libgstcolorspace.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad diff --git a/docs/plugins/inspect/plugin-curl.xml b/docs/plugins/inspect/plugin-curl.xml index 4074b87cb1..4d315bd6c4 100644 --- a/docs/plugins/inspect/plugin-curl.xml +++ b/docs/plugins/inspect/plugin-curl.xml @@ -3,7 +3,7 @@ libcurl-based elements ../../ext/curl/.libs/libgstcurl.so libgstcurl.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins git diff --git a/docs/plugins/inspect/plugin-dataurisrc.xml b/docs/plugins/inspect/plugin-dataurisrc.xml index 3d8114206a..038ab353b4 100644 --- a/docs/plugins/inspect/plugin-dataurisrc.xml +++ b/docs/plugins/inspect/plugin-dataurisrc.xml @@ -3,7 +3,7 @@ data: URI source ../../gst/dataurisrc/.libs/libgstdataurisrc.so libgstdataurisrc.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins git diff --git a/docs/plugins/inspect/plugin-dc1394.xml b/docs/plugins/inspect/plugin-dc1394.xml index 425a6237db..e9988675bc 100644 --- a/docs/plugins/inspect/plugin-dc1394.xml +++ b/docs/plugins/inspect/plugin-dc1394.xml @@ -3,7 +3,7 @@ 1394 IIDC Video Source ../../ext/dc1394/.libs/libgstdc1394.so libgstdc1394.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins git diff --git a/docs/plugins/inspect/plugin-dccp.xml b/docs/plugins/inspect/plugin-dccp.xml index 8beb7089da..5d9181adda 100644 --- a/docs/plugins/inspect/plugin-dccp.xml +++ b/docs/plugins/inspect/plugin-dccp.xml @@ -3,7 +3,7 @@ transfer data over the network via DCCP. ../../gst/dccp/.libs/libgstdccp.so libgstdccp.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad DCCP diff --git a/docs/plugins/inspect/plugin-debugutilsbad.xml b/docs/plugins/inspect/plugin-debugutilsbad.xml index a9e8270aa5..76e6440003 100644 --- a/docs/plugins/inspect/plugin-debugutilsbad.xml +++ b/docs/plugins/inspect/plugin-debugutilsbad.xml @@ -3,7 +3,7 @@ Collection of elements that may or may not be useful for debugging ../../gst/debugutils/.libs/libgstdebugutilsbad.so libgstdebugutilsbad.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins git diff --git a/docs/plugins/inspect/plugin-decklink.xml b/docs/plugins/inspect/plugin-decklink.xml index a72e850795..d04375f70c 100644 --- a/docs/plugins/inspect/plugin-decklink.xml +++ b/docs/plugins/inspect/plugin-decklink.xml @@ -3,7 +3,7 @@ Blackmagic Decklink plugin ../../sys/decklink/.libs/libgstdecklink.so libgstdecklink.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins @@ -26,7 +26,7 @@ videosink sink always -
video/x-raw-yuv, format=(fourcc)UYVY, width=(int)720, height=(int)486, framerate=(fraction)30000/1001, interlaced=(boolean)true; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)720, height=(int)486, framerate=(fraction)24000/1001, interlaced=(boolean)true; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)720, height=(int)576, framerate=(fraction)25/1, interlaced=(boolean)true; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)720, height=(int)486, framerate=(fraction)30000/1001, interlaced=(boolean)false; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)720, height=(int)576, framerate=(fraction)25/1, interlaced=(boolean)false; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)1920, height=(int)1080, framerate=(fraction)24000/1001, interlaced=(boolean)false; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)1920, height=(int)1080, framerate=(fraction)24/1, interlaced=(boolean)false; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)1920, height=(int)1080, framerate=(fraction)25/1, interlaced=(boolean)false; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)1920, height=(int)1080, framerate=(fraction)30000/1001, interlaced=(boolean)false; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)1920, height=(int)1080, framerate=(fraction)30/1, interlaced=(boolean)false; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)1920, height=(int)1080, framerate=(fraction)25/1, interlaced=(boolean)true; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)1920, height=(int)1080, framerate=(fraction)30000/1001, interlaced=(boolean)true; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)1920, height=(int)1080, framerate=(fraction)30/1, interlaced=(boolean)true; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)1920, height=(int)1080, framerate=(fraction)50/1, interlaced=(boolean)false; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)1920, height=(int)1080, framerate=(fraction)60000/1001, interlaced=(boolean)false; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)1920, height=(int)1080, framerate=(fraction)60/1, interlaced=(boolean)false; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)1280, height=(int)720, framerate=(fraction)50/1, interlaced=(boolean)false; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)1280, height=(int)720, framerate=(fraction)60000/1001, interlaced=(boolean)false; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)1280, height=(int)720, framerate=(fraction)60/1, interlaced=(boolean)false
+
video/x-raw-yuv, format=(fourcc){ UYVY, v210 }, width=(int)720, height=(int)486, framerate=(fraction)30000/1001, interlaced=(boolean)true; video/x-raw-yuv, format=(fourcc){ UYVY, v210 }, width=(int)720, height=(int)486, framerate=(fraction)24000/1001, interlaced=(boolean)true; video/x-raw-yuv, format=(fourcc){ UYVY, v210 }, width=(int)720, height=(int)576, framerate=(fraction)25/1, interlaced=(boolean)true; video/x-raw-yuv, format=(fourcc){ UYVY, v210 }, width=(int)720, height=(int)486, framerate=(fraction)30000/1001, interlaced=(boolean)false; video/x-raw-yuv, format=(fourcc){ UYVY, v210 }, width=(int)720, height=(int)576, framerate=(fraction)25/1, interlaced=(boolean)false; video/x-raw-yuv, format=(fourcc){ UYVY, v210 }, width=(int)1920, height=(int)1080, framerate=(fraction)24000/1001, interlaced=(boolean)false; video/x-raw-yuv, format=(fourcc){ UYVY, v210 }, width=(int)1920, height=(int)1080, framerate=(fraction)24/1, interlaced=(boolean)false; video/x-raw-yuv, format=(fourcc){ UYVY, v210 }, width=(int)1920, height=(int)1080, framerate=(fraction)25/1, interlaced=(boolean)false; video/x-raw-yuv, format=(fourcc){ UYVY, v210 }, width=(int)1920, height=(int)1080, framerate=(fraction)30000/1001, interlaced=(boolean)false; video/x-raw-yuv, format=(fourcc){ UYVY, v210 }, width=(int)1920, height=(int)1080, framerate=(fraction)30/1, interlaced=(boolean)false; video/x-raw-yuv, format=(fourcc){ UYVY, v210 }, width=(int)1920, height=(int)1080, framerate=(fraction)25/1, interlaced=(boolean)true; video/x-raw-yuv, format=(fourcc){ UYVY, v210 }, width=(int)1920, height=(int)1080, framerate=(fraction)30000/1001, interlaced=(boolean)true; video/x-raw-yuv, format=(fourcc){ UYVY, v210 }, width=(int)1920, height=(int)1080, framerate=(fraction)30/1, interlaced=(boolean)true; video/x-raw-yuv, format=(fourcc){ UYVY, v210 }, width=(int)1920, height=(int)1080, framerate=(fraction)50/1, interlaced=(boolean)false; video/x-raw-yuv, format=(fourcc){ UYVY, v210 }, width=(int)1920, height=(int)1080, framerate=(fraction)60000/1001, interlaced=(boolean)false; video/x-raw-yuv, format=(fourcc){ UYVY, v210 }, width=(int)1920, height=(int)1080, framerate=(fraction)60/1, interlaced=(boolean)false; video/x-raw-yuv, format=(fourcc){ UYVY, v210 }, width=(int)1280, height=(int)720, framerate=(fraction)50/1, interlaced=(boolean)false; video/x-raw-yuv, format=(fourcc){ UYVY, v210 }, width=(int)1280, height=(int)720, framerate=(fraction)60000/1001, interlaced=(boolean)false; video/x-raw-yuv, format=(fourcc){ UYVY, v210 }, width=(int)1280, height=(int)720, framerate=(fraction)60/1, interlaced=(boolean)false
@@ -47,7 +47,7 @@ videosrc source always -
video/x-raw-yuv, format=(fourcc)UYVY, width=(int)720, height=(int)486, framerate=(fraction)30000/1001, interlaced=(boolean)true, pixel-aspect-ratio=(fraction)10/11, color-matrix=(string)sdtv, chroma-site=(string)mpeg2; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)720, height=(int)486, framerate=(fraction)24000/1001, interlaced=(boolean)true, pixel-aspect-ratio=(fraction)10/11, color-matrix=(string)sdtv, chroma-site=(string)mpeg2; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)720, height=(int)576, framerate=(fraction)25/1, interlaced=(boolean)true, pixel-aspect-ratio=(fraction)12/11, color-matrix=(string)sdtv, chroma-site=(string)mpeg2; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)720, height=(int)486, framerate=(fraction)30000/1001, interlaced=(boolean)false, pixel-aspect-ratio=(fraction)10/11, color-matrix=(string)sdtv, chroma-site=(string)mpeg2; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)720, height=(int)576, framerate=(fraction)25/1, interlaced=(boolean)false, pixel-aspect-ratio=(fraction)12/11, color-matrix=(string)sdtv, chroma-site=(string)mpeg2; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)1920, height=(int)1080, framerate=(fraction)24000/1001, interlaced=(boolean)false, pixel-aspect-ratio=(fraction)12/11, color-matrix=(string)hdtv, chroma-site=(string)mpeg2; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)1920, height=(int)1080, framerate=(fraction)24/1, interlaced=(boolean)false, pixel-aspect-ratio=(fraction)12/11, color-matrix=(string)hdtv, chroma-site=(string)mpeg2; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)1920, height=(int)1080, framerate=(fraction)25/1, interlaced=(boolean)false, pixel-aspect-ratio=(fraction)12/11, color-matrix=(string)hdtv, chroma-site=(string)mpeg2; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)1920, height=(int)1080, framerate=(fraction)30000/1001, interlaced=(boolean)false, pixel-aspect-ratio=(fraction)12/11, color-matrix=(string)hdtv, chroma-site=(string)mpeg2; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)1920, height=(int)1080, framerate=(fraction)30/1, interlaced=(boolean)false, pixel-aspect-ratio=(fraction)12/11, color-matrix=(string)hdtv, chroma-site=(string)mpeg2; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)1920, height=(int)1080, framerate=(fraction)25/1, interlaced=(boolean)true, pixel-aspect-ratio=(fraction)12/11, color-matrix=(string)hdtv, chroma-site=(string)mpeg2; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)1920, height=(int)1080, framerate=(fraction)30000/1001, interlaced=(boolean)true, pixel-aspect-ratio=(fraction)12/11, color-matrix=(string)hdtv, chroma-site=(string)mpeg2; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)1920, height=(int)1080, framerate=(fraction)30/1, interlaced=(boolean)true, pixel-aspect-ratio=(fraction)12/11, color-matrix=(string)hdtv, chroma-site=(string)mpeg2; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)1920, height=(int)1080, framerate=(fraction)50/1, interlaced=(boolean)false, pixel-aspect-ratio=(fraction)12/11, color-matrix=(string)hdtv, chroma-site=(string)mpeg2; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)1920, height=(int)1080, framerate=(fraction)30000/1001, interlaced=(boolean)false, pixel-aspect-ratio=(fraction)12/11, color-matrix=(string)hdtv, chroma-site=(string)mpeg2; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)1920, height=(int)1080, framerate=(fraction)60/1, interlaced=(boolean)false, pixel-aspect-ratio=(fraction)12/11, color-matrix=(string)hdtv, chroma-site=(string)mpeg2; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)1280, height=(int)720, framerate=(fraction)50/1, interlaced=(boolean)false, pixel-aspect-ratio=(fraction)12/11, color-matrix=(string)hdtv, chroma-site=(string)mpeg2; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)1280, height=(int)720, framerate=(fraction)60000/1001, interlaced=(boolean)false, pixel-aspect-ratio=(fraction)12/11, color-matrix=(string)hdtv, chroma-site=(string)mpeg2; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)1280, height=(int)720, framerate=(fraction)60/1, interlaced=(boolean)false, pixel-aspect-ratio=(fraction)12/11, color-matrix=(string)hdtv, chroma-site=(string)mpeg2
+
video/x-raw-yuv, format=(fourcc)UYVY, width=(int)720, height=(int)486, framerate=(fraction)30000/1001, interlaced=(boolean)true, pixel-aspect-ratio=(fraction)10/11, color-matrix=(string)sdtv, chroma-site=(string)mpeg2; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)720, height=(int)486, framerate=(fraction)24000/1001, interlaced=(boolean)true, pixel-aspect-ratio=(fraction)10/11, color-matrix=(string)sdtv, chroma-site=(string)mpeg2; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)720, height=(int)576, framerate=(fraction)25/1, interlaced=(boolean)true, pixel-aspect-ratio=(fraction)12/11, color-matrix=(string)sdtv, chroma-site=(string)mpeg2; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)720, height=(int)486, framerate=(fraction)30000/1001, interlaced=(boolean)false, pixel-aspect-ratio=(fraction)10/11, color-matrix=(string)sdtv, chroma-site=(string)mpeg2; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)720, height=(int)576, framerate=(fraction)25/1, interlaced=(boolean)false, pixel-aspect-ratio=(fraction)12/11, color-matrix=(string)sdtv, chroma-site=(string)mpeg2; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)1920, height=(int)1080, framerate=(fraction)24000/1001, interlaced=(boolean)false, pixel-aspect-ratio=(fraction)1/1, color-matrix=(string)hdtv, chroma-site=(string)mpeg2; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)1920, height=(int)1080, framerate=(fraction)24/1, interlaced=(boolean)false, pixel-aspect-ratio=(fraction)1/1, color-matrix=(string)hdtv, chroma-site=(string)mpeg2; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)1920, height=(int)1080, framerate=(fraction)25/1, interlaced=(boolean)false, pixel-aspect-ratio=(fraction)1/1, color-matrix=(string)hdtv, chroma-site=(string)mpeg2; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)1920, height=(int)1080, framerate=(fraction)30000/1001, interlaced=(boolean)false, pixel-aspect-ratio=(fraction)1/1, color-matrix=(string)hdtv, chroma-site=(string)mpeg2; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)1920, height=(int)1080, framerate=(fraction)30/1, interlaced=(boolean)false, pixel-aspect-ratio=(fraction)1/1, color-matrix=(string)hdtv, chroma-site=(string)mpeg2; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)1920, height=(int)1080, framerate=(fraction)25/1, interlaced=(boolean)true, pixel-aspect-ratio=(fraction)1/1, color-matrix=(string)hdtv, chroma-site=(string)mpeg2; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)1920, height=(int)1080, framerate=(fraction)30000/1001, interlaced=(boolean)true, pixel-aspect-ratio=(fraction)1/1, color-matrix=(string)hdtv, chroma-site=(string)mpeg2; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)1920, height=(int)1080, framerate=(fraction)30/1, interlaced=(boolean)true, pixel-aspect-ratio=(fraction)1/1, color-matrix=(string)hdtv, chroma-site=(string)mpeg2; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)1920, height=(int)1080, framerate=(fraction)50/1, interlaced=(boolean)false, pixel-aspect-ratio=(fraction)1/1, color-matrix=(string)hdtv, chroma-site=(string)mpeg2; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)1920, height=(int)1080, framerate=(fraction)30000/1001, interlaced=(boolean)false, pixel-aspect-ratio=(fraction)1/1, color-matrix=(string)hdtv, chroma-site=(string)mpeg2; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)1920, height=(int)1080, framerate=(fraction)60/1, interlaced=(boolean)false, pixel-aspect-ratio=(fraction)1/1, color-matrix=(string)hdtv, chroma-site=(string)mpeg2; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)1280, height=(int)720, framerate=(fraction)50/1, interlaced=(boolean)false, pixel-aspect-ratio=(fraction)1/1, color-matrix=(string)hdtv, chroma-site=(string)mpeg2; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)1280, height=(int)720, framerate=(fraction)60000/1001, interlaced=(boolean)false, pixel-aspect-ratio=(fraction)1/1, color-matrix=(string)hdtv, chroma-site=(string)mpeg2; video/x-raw-yuv, format=(fourcc)UYVY, width=(int)1280, height=(int)720, framerate=(fraction)60/1, interlaced=(boolean)false, pixel-aspect-ratio=(fraction)1/1, color-matrix=(string)hdtv, chroma-site=(string)mpeg2
diff --git a/docs/plugins/inspect/plugin-dfbvideosink.xml b/docs/plugins/inspect/plugin-dfbvideosink.xml index 1469567b68..d9451a4ba8 100644 --- a/docs/plugins/inspect/plugin-dfbvideosink.xml +++ b/docs/plugins/inspect/plugin-dfbvideosink.xml @@ -3,7 +3,7 @@ DirectFB video output plugin ../../ext/directfb/.libs/libgstdfbvideosink.so libgstdfbvideosink.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins git diff --git a/docs/plugins/inspect/plugin-dirac.xml b/docs/plugins/inspect/plugin-dirac.xml index 6df76dcde6..8918e7907d 100644 --- a/docs/plugins/inspect/plugin-dirac.xml +++ b/docs/plugins/inspect/plugin-dirac.xml @@ -3,7 +3,7 @@ Dirac plugin ../../ext/dirac/.libs/libgstdirac.so libgstdirac.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins git diff --git a/docs/plugins/inspect/plugin-dtmf.xml b/docs/plugins/inspect/plugin-dtmf.xml index a4d4b34aca..0e34206f21 100644 --- a/docs/plugins/inspect/plugin-dtmf.xml +++ b/docs/plugins/inspect/plugin-dtmf.xml @@ -3,7 +3,7 @@ DTMF plugins ../../gst/dtmf/.libs/libgstdtmf.so libgstdtmf.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins git diff --git a/docs/plugins/inspect/plugin-dtsdec.xml b/docs/plugins/inspect/plugin-dtsdec.xml index c79cccb3e3..d6ba5e15ac 100644 --- a/docs/plugins/inspect/plugin-dtsdec.xml +++ b/docs/plugins/inspect/plugin-dtsdec.xml @@ -3,7 +3,7 @@ Decodes DTS audio streams ../../ext/dts/.libs/libgstdtsdec.so libgstdtsdec.so - 0.10.22.1 + 0.10.23.1 GPL gst-plugins-bad GStreamer Bad Plug-ins git diff --git a/docs/plugins/inspect/plugin-dvb.xml b/docs/plugins/inspect/plugin-dvb.xml index 3f74b7a032..42788ff09b 100644 --- a/docs/plugins/inspect/plugin-dvb.xml +++ b/docs/plugins/inspect/plugin-dvb.xml @@ -3,7 +3,7 @@ DVB elements ../../sys/dvb/.libs/libgstdvb.so libgstdvb.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins git diff --git a/docs/plugins/inspect/plugin-dvbsuboverlay.xml b/docs/plugins/inspect/plugin-dvbsuboverlay.xml index 30a7068d31..9a9dd5f4c1 100644 --- a/docs/plugins/inspect/plugin-dvbsuboverlay.xml +++ b/docs/plugins/inspect/plugin-dvbsuboverlay.xml @@ -3,7 +3,7 @@ DVB subtitle renderer ../../gst/dvbsuboverlay/.libs/libgstdvbsuboverlay.so libgstdvbsuboverlay.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins git diff --git a/docs/plugins/inspect/plugin-dvdspu.xml b/docs/plugins/inspect/plugin-dvdspu.xml index 91afbdaaf1..7c4e6c30cb 100644 --- a/docs/plugins/inspect/plugin-dvdspu.xml +++ b/docs/plugins/inspect/plugin-dvdspu.xml @@ -3,7 +3,7 @@ DVD Sub-picture Overlay element ../../gst/dvdspu/.libs/libgstdvdspu.so libgstdvdspu.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins git diff --git a/docs/plugins/inspect/plugin-faac.xml b/docs/plugins/inspect/plugin-faac.xml index 22394b7b6d..ccf870fc79 100644 --- a/docs/plugins/inspect/plugin-faac.xml +++ b/docs/plugins/inspect/plugin-faac.xml @@ -3,7 +3,7 @@ Free AAC Encoder (FAAC) ../../ext/faac/.libs/libgstfaac.so libgstfaac.so - 0.10.21.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins git @@ -20,13 +20,13 @@ 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, 6 ]
+
audio/x-raw-int, endianness=(int)1234, signed=(boolean)true, width=(int)16, depth=(int)16, rate=(int){ 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000, 64000, 88200, 96000 }, channels=(int)[ 1, 6 ]
src source always -
audio/mpeg, mpegversion=(int){ 4, 2 }, channels=(int)[ 1, 6 ], rate=(int)[ 8000, 96000 ], stream-format=(string){ adts, raw }
+
audio/mpeg, mpegversion=(int)4, channels=(int)[ 1, 6 ], rate=(int){ 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000, 64000, 88200, 96000 }, stream-format=(string){ adts, raw }, base-profile=(string){ main, lc, ssr, ltp }; audio/mpeg, mpegversion=(int)2, channels=(int)[ 1, 6 ], rate=(int){ 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000, 64000, 88200, 96000 }, stream-format=(string){ adts, raw }, profile=(string){ main, lc }
diff --git a/docs/plugins/inspect/plugin-faad.xml b/docs/plugins/inspect/plugin-faad.xml index c5d91e1329..a36935b2a9 100644 --- a/docs/plugins/inspect/plugin-faad.xml +++ b/docs/plugins/inspect/plugin-faad.xml @@ -3,7 +3,7 @@ Free AAC Decoder (FAAD) ../../ext/faad/.libs/libgstfaad.so libgstfaad.so - 0.10.22.1 + 0.10.23.1 GPL gst-plugins-bad GStreamer Bad Plug-ins git @@ -20,7 +20,7 @@ sink sink always -
audio/mpeg, mpegversion=(int){ 2, 4 }
+
audio/mpeg, mpegversion=(int)2; audio/mpeg, mpegversion=(int)4, stream-format=(string){ raw, adts }
src diff --git a/docs/plugins/inspect/plugin-faceoverlay.xml b/docs/plugins/inspect/plugin-faceoverlay.xml index cab7839aea..970bf2fc38 100644 --- a/docs/plugins/inspect/plugin-faceoverlay.xml +++ b/docs/plugins/inspect/plugin-faceoverlay.xml @@ -3,7 +3,7 @@ SVG Face Overlay ../../gst/faceoverlay/.libs/libgstfaceoverlay.so libgstfaceoverlay.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer diff --git a/docs/plugins/inspect/plugin-fbdevsink.xml b/docs/plugins/inspect/plugin-fbdevsink.xml index 6544ef5e04..09db197f36 100644 --- a/docs/plugins/inspect/plugin-fbdevsink.xml +++ b/docs/plugins/inspect/plugin-fbdevsink.xml @@ -3,7 +3,7 @@ linux framebuffer video sink ../../sys/fbdev/.libs/libgstfbdevsink.so libgstfbdevsink.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins git diff --git a/docs/plugins/inspect/plugin-festival.xml b/docs/plugins/inspect/plugin-festival.xml index f793f1315c..d3d21ffdf9 100644 --- a/docs/plugins/inspect/plugin-festival.xml +++ b/docs/plugins/inspect/plugin-festival.xml @@ -3,7 +3,7 @@ Synthesizes plain text into audio ../../gst/festival/.libs/libgstfestival.so libgstfestival.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins git diff --git a/docs/plugins/inspect/plugin-fieldanalysis.xml b/docs/plugins/inspect/plugin-fieldanalysis.xml index 185a188813..27a32cb042 100644 --- a/docs/plugins/inspect/plugin-fieldanalysis.xml +++ b/docs/plugins/inspect/plugin-fieldanalysis.xml @@ -3,7 +3,7 @@ Video field analysis ../../gst/fieldanalysis/.libs/libgstfieldanalysis.so libgstfieldanalysis.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer diff --git a/docs/plugins/inspect/plugin-fragmented.xml b/docs/plugins/inspect/plugin-fragmented.xml index 1103511e74..62650d67d2 100644 --- a/docs/plugins/inspect/plugin-fragmented.xml +++ b/docs/plugins/inspect/plugin-fragmented.xml @@ -3,7 +3,7 @@ Fragmented streaming plugins ../../gst/hls/.libs/libgstfragmented.so libgstfragmented.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins @@ -24,9 +24,9 @@ Andoni Morales Alastruey <ylatuya@gmail.com>
application/x-hls
- src + src%d source - always + sometimes
ANY
diff --git a/docs/plugins/inspect/plugin-freeverb.xml b/docs/plugins/inspect/plugin-freeverb.xml new file mode 100644 index 0000000000..e96a89265b --- /dev/null +++ b/docs/plugins/inspect/plugin-freeverb.xml @@ -0,0 +1,34 @@ + + freeverb + Reverberation/room effect + ../../gst/freeverb/.libs/libgstfreeverb.so + libgstfreeverb.so + 0.10.23.1 + LGPL + gst-plugins-bad + GStreamer Bad Plug-ins git + Unknown package origin + + + freeverb + Stereo positioning + Filter/Effect/Audio + Reverberation/room effect + Stefan Sauer <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
+
+
+
+
+
\ No newline at end of file diff --git a/docs/plugins/inspect/plugin-freeze.xml b/docs/plugins/inspect/plugin-freeze.xml index 0028326f59..eaab6ab4f6 100644 --- a/docs/plugins/inspect/plugin-freeze.xml +++ b/docs/plugins/inspect/plugin-freeze.xml @@ -3,7 +3,7 @@ Stream freezer ../../gst/freeze/.libs/libgstfreeze.so libgstfreeze.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins git diff --git a/docs/plugins/inspect/plugin-frei0r.xml b/docs/plugins/inspect/plugin-frei0r.xml index ca9f6fe57e..ab8fbfadce 100644 --- a/docs/plugins/inspect/plugin-frei0r.xml +++ b/docs/plugins/inspect/plugin-frei0r.xml @@ -3,11 +3,1992 @@ frei0r plugin library ../../gst/frei0r/.libs/libgstfrei0r.so libgstfrei0r.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins git Unknown package origin + + frei0r-filter-3-point-color-balance + 3 point color balance + Filter/Effect/Video + Adjust color balance with 3 color points + Sebastian Dröge <sebastian.droege@collabora.co.uk>, Maksim Golovkin + + + 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 ]
+
+ + 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 ]
+
+
+
+ + frei0r-filter-3dflippo + 3dflippo + Filter/Effect/Video + Frame rotation in 3d-space + Sebastian Dröge <sebastian.droege@collabora.co.uk>, c.e. prelz AS FLUIDO <fluido@fluido.as> + + + sink + sink + always +
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)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)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)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 ]; 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)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)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)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)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 ]; video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+
+ + frei0r-filter-b + B + Filter/Effect/Video + Extracts Blue from Image + Sebastian Dröge <sebastian.droege@collabora.co.uk>, Richard Spindler + + + 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 ]
+
+ + 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 ]
+
+
+
+ + frei0r-filter-baltan + Baltan + Filter/Effect/Video + delayed alpha smoothed blit of time + Sebastian Dröge <sebastian.droege@collabora.co.uk>, Kentaro, Jaromil + + + sink + sink + always +
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)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 ]
+
+
+
+ + frei0r-filter-bluescreen0r + bluescreen0r + Filter/Effect/Video + Color to alpha (blit SRCALPHA) + Sebastian Dröge <sebastian.droege@collabora.co.uk>, Hedde Bosman + + + sink + sink + always +
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)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 ]
+
+
+
+ + frei0r-filter-brightness + Brightness + Filter/Effect/Video + Adjusts the brightness of a source image + Sebastian Dröge <sebastian.droege@collabora.co.uk>, Jean-Sebastien Senecal + + + 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 ]
+
+ + 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 ]
+
+
+
+ + frei0r-filter-bw0r + bw0r + Filter/Effect/Video + Turns image black/white. + Sebastian Dröge <sebastian.droege@collabora.co.uk>, coma@gephex.org + + + 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 ]
+
+ + 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 ]
+
+
+
+ + frei0r-filter-cartoon + Cartoon + Filter/Effect/Video + Cartoonify video, do a form of edge detect + Sebastian Dröge <sebastian.droege@collabora.co.uk>, Dries Pruimboom, Jaromil + + + sink + sink + always +
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)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 ]
+
+
+
+ + frei0r-filter-color-distance + Color Distance + Filter/Effect/Video + + Sebastian Dröge <sebastian.droege@collabora.co.uk>, Richard Spindler + + + 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 ]
+
+ + 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 ]
+
+
+
+ + frei0r-filter-contrast0r + Contrast0r + Filter/Effect/Video + Adjusts the contrast of a source image + Sebastian Dröge <sebastian.droege@collabora.co.uk>, Jean-Sebastien Senecal + + + 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 ]
+
+ + 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 ]
+
+
+
+ + frei0r-filter-curves + Curves + Filter/Effect/Video + Adjust luminance or color channel intensity with curve level mapping + Sebastian Dröge <sebastian.droege@collabora.co.uk>, Maksim Golovkin + + + 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 ]
+
+ + 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 ]
+
+
+
+ + frei0r-filter-dealygrab + Dealygrab + Filter/Effect/Video + delayed frame blitting mapped on a time bitmap + Sebastian Dröge <sebastian.droege@collabora.co.uk>, Bill Spinhover, Andreas Schiffler, Jaromil + + + sink + sink + always +
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)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 ]
+
+
+
+ + frei0r-filter-delay0r + delay0r + Filter/Effect/Video + video delay + Sebastian Dröge <sebastian.droege@collabora.co.uk>, Martin Bayer + + + sink + sink + always +
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)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 ]
+
+
+
+ + frei0r-filter-distort0r + Distort0r + Filter/Effect/Video + Plasma + Sebastian Dröge <sebastian.droege@collabora.co.uk>, Gephex crew + + + sink + sink + always +
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)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 ]
+
+
+
+ + frei0r-filter-edgeglow + Edgeglow + Filter/Effect/Video + Edgeglow filter + Sebastian Dröge <sebastian.droege@collabora.co.uk>, Salsaman + + + 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 ]
+
+ + 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 ]
+
+
+
+ + frei0r-filter-equaliz0r + Equaliz0r + Filter/Effect/Video + Equalizes the intensity histograms + Sebastian Dröge <sebastian.droege@collabora.co.uk>, Jean-Sebastien Senecal (Drone) + + + 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 ]
+
+ + 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 ]
+
+
+
+ + frei0r-filter-flippo + Flippo + Filter/Effect/Video + Flipping in x and y axis + Sebastian Dröge <sebastian.droege@collabora.co.uk>, Carlo Emilio, Jean-Sebastien Senecal + + + sink + sink + always +
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)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)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)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 ]; 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)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)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)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)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 ]; video/x-raw-yuv, format=(fourcc)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+
+ + frei0r-filter-g + G + Filter/Effect/Video + Extracts Green from Image + Sebastian Dröge <sebastian.droege@collabora.co.uk>, Richard Spindler + + + 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 ]
+
+ + 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 ]
+
+
+
+ + frei0r-filter-gamma + Gamma + Filter/Effect/Video + Adjusts the gamma value of a source image + Sebastian Dröge <sebastian.droege@collabora.co.uk>, Jean-Sebastien Senecal + + + 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 ]
+
+ + 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 ]
+
+
+
+ + frei0r-filter-glow + Glow + Filter/Effect/Video + Creates a Glamorous Glow + Sebastian Dröge <sebastian.droege@collabora.co.uk>, Richard Spindler + + + 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 ]
+
+ + 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 ]
+
+
+
+ + frei0r-filter-hueshift0r + Hueshift0r + Filter/Effect/Video + Shifts the hue of a source image + Sebastian Dröge <sebastian.droege@collabora.co.uk>, Jean-Sebastien Senecal + + + sink + sink + always +
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)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 ]
+
+
+
+ + frei0r-filter-invert0r + Invert0r + Filter/Effect/Video + Inverts all colors of a source image + Sebastian Dröge <sebastian.droege@collabora.co.uk>, Gephex crew + + + 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 ]
+
+ + 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 ]
+
+
+
+ + frei0r-filter-k-means-clustering + K-Means Clustering + Filter/Effect/Video + Clusters of a source image by color and spatial distance + Sebastian Dröge <sebastian.droege@collabora.co.uk>, binarymillenium + + + sink + sink + always +
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)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 ]
+
+
+
+ + frei0r-filter-lens-correction + Lens Correction + Filter/Effect/Video + Allows compensation of lens distortion + Sebastian Dröge <sebastian.droege@collabora.co.uk>, Richard Spindler + + + 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 ]
+
+ + 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 ]
+
+
+
+ + frei0r-filter-letterb0xed + LetterB0xed + Filter/Effect/Video + Adds Black Borders at top and bottom for Cinema Look + Sebastian Dröge <sebastian.droege@collabora.co.uk>, Richard Spindler + + + 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 ]
+
+ + 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 ]
+
+
+
+ + frei0r-filter-levels + Levels + Filter/Effect/Video + Adjust luminance or color channel intensity + Sebastian Dröge <sebastian.droege@collabora.co.uk>, Maksim Golovkin + + + 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 ]
+
+ + 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 ]
+
+
+
+ + frei0r-filter-luminance + Luminance + Filter/Effect/Video + Creates a luminance map of the image + Sebastian Dröge <sebastian.droege@collabora.co.uk>, Richard Spindler + + + 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 ]
+
+ + 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 ]
+
+
+
+ + frei0r-filter-mask0mate + Mask0Mate + Filter/Effect/Video + Creates an square alpha-channel mask + Sebastian Dröge <sebastian.droege@collabora.co.uk>, Richard Spindler + + + 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 ]
+
+ + 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 ]
+
+
+
+ + frei0r-filter-nervous + Nervous + Filter/Effect/Video + flushes frames in time in a nervous way + Sebastian Dröge <sebastian.droege@collabora.co.uk>, Tannenbaum, Kentaro, Jaromil + + + sink + sink + always +
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)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 ]
+
+
+
+ + frei0r-filter-nosync0r + nosync0r + Filter/Effect/Video + broken tv + Sebastian Dröge <sebastian.droege@collabora.co.uk>, Martin Bayer + + + sink + sink + always +
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)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 ]
+
+
+
+ + frei0r-filter-opencvfacedetect + opencvfacedetect + Filter/Effect/Video + detect faces + Sebastian Dröge <sebastian.droege@collabora.co.uk>, binarymillenium + + + sink + sink + always +
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)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 ]
+
+
+
+ + frei0r-filter-perspective + Perspective + Filter/Effect/Video + Distorts the image for a pseudo perspective + Sebastian Dröge <sebastian.droege@collabora.co.uk>, Richard Spindler + + + 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 ]
+
+ + 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 ]
+
+
+
+ + frei0r-filter-pixeliz0r + pixeliz0r + Filter/Effect/Video + Pixelize input image. + Sebastian Dröge <sebastian.droege@collabora.co.uk>, Gephex crew + + + sink + sink + always +
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)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 ]
+
+
+
+ + frei0r-filter-primaries + primaries + Filter/Effect/Video + Reduce image to primary colors + Sebastian Dröge <sebastian.droege@collabora.co.uk>, Hedde Bosman + + + sink + sink + always +
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)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 ]
+
+
+
+ + frei0r-filter-r + R + Filter/Effect/Video + Extracts Red from Image + Sebastian Dröge <sebastian.droege@collabora.co.uk>, Richard Spindler + + + 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 ]
+
+ + 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 ]
+
+
+
+ + frei0r-filter-rgb-parade + RGB-Parade + Filter/Effect/Video + Displays a histogram of R, G and B of the video-data + Sebastian Dröge <sebastian.droege@collabora.co.uk>, Albert Frisch + + + 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 ]
+
+ + 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 ]
+
+
+
+ + frei0r-filter-saturat0r + Saturat0r + Filter/Effect/Video + Adjusts the saturation of a source image + Sebastian Dröge <sebastian.droege@collabora.co.uk>, Jean-Sebastien Senecal + + + 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 ]
+
+ + 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 ]
+
+
+
+ + frei0r-filter-scale0tilt + Scale0Tilt + Filter/Effect/Video + Scales, Tilts and Crops an Image + Sebastian Dröge <sebastian.droege@collabora.co.uk>, Richard Spindler + + + 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 ]
+
+ + 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 ]
+
+
+
+ + frei0r-filter-scanline0r + scanline0r + Filter/Effect/Video + interlaced blak lines + Sebastian Dröge <sebastian.droege@collabora.co.uk>, Martin Bayer + + + sink + sink + always +
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)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 ]
+
+
+
+ + frei0r-filter-sobel + Sobel + Filter/Effect/Video + Sobel filter + Sebastian Dröge <sebastian.droege@collabora.co.uk>, Jean-Sebastien Senecal (Drone) + + + 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 ]
+
+ + 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 ]
+
+
+
+ + frei0r-filter-squareblur + Squareblur + Filter/Effect/Video + Variable-size square blur + Sebastian Dröge <sebastian.droege@collabora.co.uk>, Drone + + + 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 ]
+
+ + 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 ]
+
+
+
+ + frei0r-filter-tehroxx0r + TehRoxx0r + Filter/Effect/Video + Something videowall-ish + Sebastian Dröge <sebastian.droege@collabora.co.uk>, Coma + + + sink + sink + always +
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)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 ]
+
+
+
+ + frei0r-filter-threelay0r + threelay0r + Filter/Effect/Video + dynamic 3 level thresholding + Sebastian Dröge <sebastian.droege@collabora.co.uk>, Hedde Bosman + + + sink + sink + always +
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)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 ]
+
+
+
+ + frei0r-filter-threshold0r + Threshold0r + Filter/Effect/Video + Thresholds a source image + Sebastian Dröge <sebastian.droege@collabora.co.uk>, Jean-Sebastien Senecal + + + 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 ]
+
+ + 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 ]
+
+
+
+ + frei0r-filter-tint0r + Tint0r + Filter/Effect/Video + Tint a source image with specified color + Sebastian Dröge <sebastian.droege@collabora.co.uk>, Maksim Golovkin + + + 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 ]
+
+ + 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 ]
+
+
+
+ + frei0r-filter-transparency + Transparency + Filter/Effect/Video + Tunes the alpha channel. + Sebastian Dröge <sebastian.droege@collabora.co.uk>, Richard Spindler + + + 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 ]
+
+ + 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 ]
+
+
+
+ + frei0r-filter-twolay0r + Twolay0r + Filter/Effect/Video + dynamic thresholding + Sebastian Dröge <sebastian.droege@collabora.co.uk>, Martin Bayer + + + sink + sink + always +
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)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 ]
+
+
+
+ + frei0r-filter-vectorscope + Vectorscope + Filter/Effect/Video + Displays the vectorscope of the video-data + Sebastian Dröge <sebastian.droege@collabora.co.uk>, Albert Frisch + + + 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 ]
+
+ + 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 ]
+
+
+
+ + frei0r-filter-vertigo + Vertigo + Filter/Effect/Video + alpha blending with zoomed and rotated images + Sebastian Dröge <sebastian.droege@collabora.co.uk>, Fukuchi Kentarou + + + 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 ]
+
+ + 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 ]
+
+
+
+ + frei0r-filter-water + Water + Filter/Effect/Video + water drops on a video surface + Sebastian Dröge <sebastian.droege@collabora.co.uk>, Jaromil + + + sink + sink + always +
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)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 ]
+
+
+
+ + frei0r-filter-white-balance + White Balance + Filter/Effect/Video + Adjust the white balance / color temperature + Sebastian Dröge <sebastian.droege@collabora.co.uk>, Dan Dennedy + + + 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 ]
+
+ + 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 ]
+
+
+
+ + frei0r-mixer-addition + addition + Filter/Editor/Video + Perform an RGB[A] addition operation of the pixel sources. + Sebastian Dröge <sebastian.droege@collabora.co.uk>, Jean-Sebastien Senecal + + + sink_0 + 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 ]
+
+ + sink_1 + 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 ]
+
+ + 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 ]
+
+
+
+ + frei0r-mixer-alpha-injection + Alpha Injection + Filter/Editor/Video + Averages Input 1 and uses this as Alpha Channel on Input 2 + Sebastian Dröge <sebastian.droege@collabora.co.uk>, Richard Spindler + + + sink_0 + 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 ]
+
+ + sink_1 + 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 ]
+
+ + 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 ]
+
+
+
+ + frei0r-mixer-alphaatop + alphaatop + Filter/Editor/Video + the alpha ATOP operation + Sebastian Dröge <sebastian.droege@collabora.co.uk>, Jean-Sebastien Senecal + + + sink_0 + 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 ]
+
+ + sink_1 + 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 ]
+
+ + 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 ]
+
+
+
+ + frei0r-mixer-alphain + alphain + Filter/Editor/Video + the alpha IN operation + Sebastian Dröge <sebastian.droege@collabora.co.uk>, Jean-Sebastien Senecal + + + sink_0 + 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 ]
+
+ + sink_1 + 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 ]
+
+ + 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 ]
+
+
+
+ + frei0r-mixer-alphaout + alphaout + Filter/Editor/Video + the alpha OUT operation + Sebastian Dröge <sebastian.droege@collabora.co.uk>, Jean-Sebastien Senecal + + + sink_0 + 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 ]
+
+ + sink_1 + 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 ]
+
+ + 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 ]
+
+
+
+ + frei0r-mixer-alphaover + alphaover + Filter/Editor/Video + the alpha OVER operation + Sebastian Dröge <sebastian.droege@collabora.co.uk>, Jean-Sebastien Senecal + + + sink_0 + 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 ]
+
+ + sink_1 + 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 ]
+
+ + 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 ]
+
+
+
+ + frei0r-mixer-alphaxor + alphaxor + Filter/Editor/Video + the alpha XOR operation + Sebastian Dröge <sebastian.droege@collabora.co.uk>, Jean-Sebastien Senecal + + + sink_0 + 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 ]
+
+ + sink_1 + 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 ]
+
+ + 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 ]
+
+
+
+ + frei0r-mixer-blend + blend + Filter/Editor/Video + Perform a blend operation between two sources + Sebastian Dröge <sebastian.droege@collabora.co.uk>, Jean-Sebastien Senecal + + + sink_0 + 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 ]
+
+ + sink_1 + 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 ]
+
+ + 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 ]
+
+
+
+ + frei0r-mixer-burn + burn + Filter/Editor/Video + Perform an RGB[A] dodge operation between the pixel sources, using the generalised algorithm: +D = saturation of 255 or depletion of 0, of ((255 - A) * 256) / (B + 1) + Sebastian Dröge <sebastian.droege@collabora.co.uk>, Jean-Sebastien Senecal + + + sink_0 + 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 ]
+
+ + sink_1 + 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 ]
+
+ + 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 ]
+
+
+
+ + frei0r-mixer-color-only + color_only + Filter/Editor/Video + Perform a conversion to color only of the source input1 using the hue and saturation values of input2. + Sebastian Dröge <sebastian.droege@collabora.co.uk>, Jean-Sebastien Senecal + + + sink_0 + 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 ]
+
+ + sink_1 + 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 ]
+
+ + 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 ]
+
+
+
+ + frei0r-mixer-composition + Composition + Filter/Editor/Video + Composites Image 2 onto Image 1 according to its Alpha Channel + Sebastian Dröge <sebastian.droege@collabora.co.uk>, Richard Spindler + + + sink_0 + 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 ]
+
+ + sink_1 + 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 ]
+
+ + 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 ]
+
+
+
+ + frei0r-mixer-darken + darken + Filter/Editor/Video + Perform a darken operation between two sources (minimum value of both sources). + Sebastian Dröge <sebastian.droege@collabora.co.uk>, Jean-Sebastien Senecal + + + sink_0 + 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 ]
+
+ + sink_1 + 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 ]
+
+ + 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 ]
+
+
+
+ + frei0r-mixer-difference + difference + Filter/Editor/Video + Perform an RGB[A] difference operation between the pixel sources. + Sebastian Dröge <sebastian.droege@collabora.co.uk>, Jean-Sebastien Senecal + + + sink_0 + 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 ]
+
+ + sink_1 + 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 ]
+
+ + 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 ]
+
+
+
+ + frei0r-mixer-divide + divide + Filter/Editor/Video + Perform an RGB[A] divide operation between the pixel sources: input1 is the numerator, input2 the denominator + Sebastian Dröge <sebastian.droege@collabora.co.uk>, Jean-Sebastien Senecal + + + sink_0 + 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 ]
+
+ + sink_1 + 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 ]
+
+ + 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 ]
+
+
+
+ + frei0r-mixer-dodge + dodge + Filter/Editor/Video + Perform an RGB[A] dodge operation between the pixel sources, using the generalised algorithm: +D = saturation of 255 or (A * 256) / (256 - B) + Sebastian Dröge <sebastian.droege@collabora.co.uk>, Jean-Sebastien Senecal + + + sink_0 + 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 ]
+
+ + sink_1 + 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 ]
+
+ + 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 ]
+
+
+
+ + frei0r-mixer-grain-extract + grain_extract + Filter/Editor/Video + Perform an RGB[A] grain-extract operation between the pixel sources. + Sebastian Dröge <sebastian.droege@collabora.co.uk>, Jean-Sebastien Senecal + + + sink_0 + 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 ]
+
+ + sink_1 + 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 ]
+
+ + 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 ]
+
+
+
+ + frei0r-mixer-grain-merge + grain_merge + Filter/Editor/Video + Perform an RGB[A] grain-merge operation between the pixel sources. + Sebastian Dröge <sebastian.droege@collabora.co.uk>, Jean-Sebastien Senecal + + + sink_0 + 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 ]
+
+ + sink_1 + 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 ]
+
+ + 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 ]
+
+
+
+ + frei0r-mixer-hardlight + hardlight + Filter/Editor/Video + Perform an RGB[A] hardlight operation between the pixel sources + Sebastian Dröge <sebastian.droege@collabora.co.uk>, Jean-Sebastien Senecal + + + sink_0 + 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 ]
+
+ + sink_1 + 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 ]
+
+ + 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 ]
+
+
+
+ + frei0r-mixer-hue + hue + Filter/Editor/Video + Perform a conversion to hue only of the source input1 using the hue of input2. + Sebastian Dröge <sebastian.droege@collabora.co.uk>, Jean-Sebastien Senecal + + + sink_0 + 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 ]
+
+ + sink_1 + 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 ]
+
+ + 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 ]
+
+
+
+ + frei0r-mixer-lighten + lighten + Filter/Editor/Video + Perform a lighten operation between two sources (maximum value of both sources). + Sebastian Dröge <sebastian.droege@collabora.co.uk>, Jean-Sebastien Senecal + + + sink_0 + 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 ]
+
+ + sink_1 + 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 ]
+
+ + 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 ]
+
+
+
+ + frei0r-mixer-multiply + multiply + Filter/Editor/Video + Perform an RGB[A] multiply operation between the pixel sources. + Sebastian Dröge <sebastian.droege@collabora.co.uk>, Jean-Sebastien Senecal + + + sink_0 + 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 ]
+
+ + sink_1 + 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 ]
+
+ + 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 ]
+
+
+
+ + frei0r-mixer-overlay + overlay + Filter/Editor/Video + Perform an RGB[A] overlay operation between the pixel sources, using the generalised algorithm: +D = A * (B + (2 * B) * (255 - A)) + Sebastian Dröge <sebastian.droege@collabora.co.uk>, Jean-Sebastien Senecal + + + sink_0 + 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 ]
+
+ + sink_1 + 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 ]
+
+ + 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 ]
+
+
+
+ + frei0r-mixer-rgb + RGB + Filter/Editor/Video + Averages each Input and uses each as R, G or B channel of the Output + Sebastian Dröge <sebastian.droege@collabora.co.uk>, Richard Spindler + + + sink_0 + 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 ]
+
+ + sink_1 + 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 ]
+
+ + sink_2 + 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 ]
+
+ + 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 ]
+
+
+
+ + frei0r-mixer-saturation + saturation + Filter/Editor/Video + Perform a conversion to saturation only of the source input1 using the saturation level of input2. + Sebastian Dröge <sebastian.droege@collabora.co.uk>, Jean-Sebastien Senecal + + + sink_0 + 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 ]
+
+ + sink_1 + 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 ]
+
+ + 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 ]
+
+
+
+ + frei0r-mixer-screen + screen + Filter/Editor/Video + Perform an RGB[A] screen operation between the pixel sources, using the generalised algorithm: +D = 255 - (255 - A) * (255 - B) + Sebastian Dröge <sebastian.droege@collabora.co.uk>, Jean-Sebastien Senecal + + + sink_0 + 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 ]
+
+ + sink_1 + 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 ]
+
+ + 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 ]
+
+
+
+ + frei0r-mixer-softlight + softlight + Filter/Editor/Video + Perform an RGB[A] softlight operation between the pixel sources. + Sebastian Dröge <sebastian.droege@collabora.co.uk>, Jean-Sebastien Senecal + + + sink_0 + 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 ]
+
+ + sink_1 + 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 ]
+
+ + 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 ]
+
+
+
+ + frei0r-mixer-subtract + subtract + Filter/Editor/Video + Perform an RGB[A] subtract operation of the pixel source input2 from input1. + Sebastian Dröge <sebastian.droege@collabora.co.uk>, Jean-Sebastien Senecal + + + sink_0 + 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 ]
+
+ + sink_1 + 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 ]
+
+ + 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 ]
+
+
+
+ + frei0r-mixer-uv-map + UV Map + Filter/Editor/Video + Uses Input 1 as UV Map to distort Input 2 + Sebastian Dröge <sebastian.droege@collabora.co.uk>, Richard Spindler + + + sink_0 + 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 ]
+
+ + sink_1 + 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 ]
+
+ + 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 ]
+
+
+
+ + frei0r-mixer-value + value + Filter/Editor/Video + Perform a conversion to value only of the source input1 using the value of input2. + Sebastian Dröge <sebastian.droege@collabora.co.uk>, Jean-Sebastien Senecal + + + sink_0 + 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 ]
+
+ + sink_1 + 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 ]
+
+ + 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 ]
+
+
+
+ + frei0r-mixer-xfade0r + xfade0r + Filter/Editor/Video + a simple xfader + Sebastian Dröge <sebastian.droege@collabora.co.uk>, Martin Bayer + + + sink_0 + sink + always +
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 ]
+
+ + sink_1 + sink + always +
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)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 ]
+
+
+
+ + frei0r-src-ising0r + Ising0r + Src/Video + Generates ising noise + Sebastian Dröge <sebastian.droege@collabora.co.uk>, Gephex crew + + + src + source + always +
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 ]
+
+
+
+ + frei0r-src-lissajous0r + Lissajous0r + Src/Video + Generates Lissajous0r images + Sebastian Dröge <sebastian.droege@collabora.co.uk>, Martin Bayer + + + src + source + always +
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 ]
+
+
+
+ + frei0r-src-nois0r + Nois0r + Src/Video + Generates white noise images + Sebastian Dröge <sebastian.droege@collabora.co.uk>, Martin Bayer + + + src + source + always +
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 ]
+
+
+
+ + frei0r-src-onecol0r + onecol0r + Src/Video + image with just one color + Sebastian Dröge <sebastian.droege@collabora.co.uk>, Martin Bayer + + + src + source + always +
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 ]
+
+
+
+ + frei0r-src-partik0l + Partik0l + Src/Video + Particles generated on prime number sinusoidal blossoming + Sebastian Dröge <sebastian.droege@collabora.co.uk>, Jaromil + + + src + source + always +
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 ]
+
+
+
+ + frei0r-src-plasma + Plasma + Src/Video + Demo scene 8bit plasma + Sebastian Dröge <sebastian.droege@collabora.co.uk>, Jaromil + + + src + source + always +
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 ]
+
+
+
\ No newline at end of file diff --git a/docs/plugins/inspect/plugin-gaudieffects.xml b/docs/plugins/inspect/plugin-gaudieffects.xml index a46a4965f8..c458ac8b2f 100644 --- a/docs/plugins/inspect/plugin-gaudieffects.xml +++ b/docs/plugins/inspect/plugin-gaudieffects.xml @@ -3,7 +3,7 @@ Gaudi video effects. ../../gst/gaudieffects/.libs/libgstgaudieffects.so libgstgaudieffects.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer diff --git a/docs/plugins/inspect/plugin-geometrictransform.xml b/docs/plugins/inspect/plugin-geometrictransform.xml index 17528fc7fd..f5e5320284 100644 --- a/docs/plugins/inspect/plugin-geometrictransform.xml +++ b/docs/plugins/inspect/plugin-geometrictransform.xml @@ -3,7 +3,7 @@ Various geometric image transform elements ../../gst/geometrictransform/.libs/libgstgeometrictransform.so libgstgeometrictransform.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins git @@ -181,7 +181,7 @@ rotate rotate Transform/Effect/Video - Warps the picture into an arc shaped form + Rotates the picture by an arbitrary angle Thiago Santos<thiago.sousa.santos@collabora.co.uk> diff --git a/docs/plugins/inspect/plugin-gsettings.xml b/docs/plugins/inspect/plugin-gsettings.xml index a80d9b1bfd..472fa4b49c 100644 --- a/docs/plugins/inspect/plugin-gsettings.xml +++ b/docs/plugins/inspect/plugin-gsettings.xml @@ -3,7 +3,7 @@ GSettings plugin ../../ext/gsettings/.libs/libgstgsettingselements.so libgstgsettingselements.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins git diff --git a/docs/plugins/inspect/plugin-gsm.xml b/docs/plugins/inspect/plugin-gsm.xml index 209082e371..5e995d1d11 100644 --- a/docs/plugins/inspect/plugin-gsm.xml +++ b/docs/plugins/inspect/plugin-gsm.xml @@ -3,7 +3,7 @@ GSM encoder/decoder ../../ext/gsm/.libs/libgstgsm.so libgstgsm.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins git diff --git a/docs/plugins/inspect/plugin-gstsiren.xml b/docs/plugins/inspect/plugin-gstsiren.xml index 95b17fdb9c..2548297c01 100644 --- a/docs/plugins/inspect/plugin-gstsiren.xml +++ b/docs/plugins/inspect/plugin-gstsiren.xml @@ -3,7 +3,7 @@ Siren encoder/decoder/payloader/depayloader plugins ../../gst/siren/.libs/libgstsiren.so libgstsiren.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins git diff --git a/docs/plugins/inspect/plugin-h264parse.xml b/docs/plugins/inspect/plugin-h264parse.xml index b3ceeb2c50..d037dc81ed 100644 --- a/docs/plugins/inspect/plugin-h264parse.xml +++ b/docs/plugins/inspect/plugin-h264parse.xml @@ -3,7 +3,7 @@ Element parsing raw h264 streams ../../gst/h264parse/.libs/libgsth264parse.so libgsth264parse.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins git diff --git a/docs/plugins/inspect/plugin-hdvparse.xml b/docs/plugins/inspect/plugin-hdvparse.xml index ade21ad226..bfd251a5f3 100644 --- a/docs/plugins/inspect/plugin-hdvparse.xml +++ b/docs/plugins/inspect/plugin-hdvparse.xml @@ -3,7 +3,7 @@ HDV private stream parser ../../gst/hdvparse/.libs/libgsthdvparse.so libgsthdvparse.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer diff --git a/docs/plugins/inspect/plugin-id3tag.xml b/docs/plugins/inspect/plugin-id3tag.xml index 33f65587a1..45f5cff73c 100644 --- a/docs/plugins/inspect/plugin-id3tag.xml +++ b/docs/plugins/inspect/plugin-id3tag.xml @@ -3,7 +3,7 @@ ID3 v1 and v2 muxing plugin ../../gst/id3tag/.libs/libgstid3tag.so libgstid3tag.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins git diff --git a/docs/plugins/inspect/plugin-inter.xml b/docs/plugins/inspect/plugin-inter.xml index ce764a22ba..4883ad6324 100644 --- a/docs/plugins/inspect/plugin-inter.xml +++ b/docs/plugins/inspect/plugin-inter.xml @@ -3,7 +3,7 @@ plugin for inter-pipeline communication ../../gst/inter/.libs/libgstinter.so libgstinter.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins @@ -39,6 +39,36 @@ + + intersubsink + FIXME Long name + Generic + FIXME Description + FIXME <fixme@example.com> + + + sink + sink + always +
text/plain
+
+
+
+ + intersubsrc + Inter-pipeline subtitle source + Source/Subtitle + Inter-pipeline subtitle source + David Schleef <ds@entropywave.com> + + + src + source + always +
application/unknown
+
+
+
intervideosink FIXME Long name diff --git a/docs/plugins/inspect/plugin-interlace.xml b/docs/plugins/inspect/plugin-interlace.xml index caa1efeb7d..ae157e8180 100644 --- a/docs/plugins/inspect/plugin-interlace.xml +++ b/docs/plugins/inspect/plugin-interlace.xml @@ -3,7 +3,7 @@ Create an interlaced video stream ../../gst/interlace/.libs/libgstinterlace.so libgstinterlace.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins git diff --git a/docs/plugins/inspect/plugin-ivfparse.xml b/docs/plugins/inspect/plugin-ivfparse.xml index a524b5e011..8004f2026e 100644 --- a/docs/plugins/inspect/plugin-ivfparse.xml +++ b/docs/plugins/inspect/plugin-ivfparse.xml @@ -3,7 +3,7 @@ IVF parser ../../gst/ivfparse/.libs/libgstivfparse.so libgstivfparse.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins git diff --git a/docs/plugins/inspect/plugin-jp2kdecimator.xml b/docs/plugins/inspect/plugin-jp2kdecimator.xml index b1fbd20d98..805a1d91cf 100644 --- a/docs/plugins/inspect/plugin-jp2kdecimator.xml +++ b/docs/plugins/inspect/plugin-jp2kdecimator.xml @@ -3,7 +3,7 @@ JPEG2000 decimator ../../gst/jp2kdecimator/.libs/libgstjp2kdecimator.so libgstjp2kdecimator.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins git diff --git a/docs/plugins/inspect/plugin-jpegformat.xml b/docs/plugins/inspect/plugin-jpegformat.xml index e995673317..b893f81352 100644 --- a/docs/plugins/inspect/plugin-jpegformat.xml +++ b/docs/plugins/inspect/plugin-jpegformat.xml @@ -3,7 +3,7 @@ JPEG interchange format plugin ../../gst/jpegformat/.libs/libgstjpegformat.so libgstjpegformat.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins git diff --git a/docs/plugins/inspect/plugin-kate.xml b/docs/plugins/inspect/plugin-kate.xml index 1ff9aabbf8..288b52f5de 100644 --- a/docs/plugins/inspect/plugin-kate.xml +++ b/docs/plugins/inspect/plugin-kate.xml @@ -3,7 +3,7 @@ Kate plugin ../../ext/kate/.libs/libgstkate.so libgstkate.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins git @@ -93,5 +93,32 @@ + + tiger + Kate stream renderer + Mixer/Video/Overlay/Subtitle + Decodes and renders Kate streams on top of a video + Vincent Penquerc'h <ogg.k.ogg.k@googlemail.com> + + + subtitle_sink + sink + always +
subtitle/x-kate; application/x-kate
+
+ + video_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)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-yuv, format=(fourcc){ I420, YV12, AYUV, YUY2, UYVY, v308, v210, v216, Y41B, Y42B, Y444, Y800, Y16 , NV12, NV21, UYVP, A420, YUV9, IYU1 }, 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)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-yuv, format=(fourcc){ I420, YV12, AYUV, YUY2, UYVY, v308, v210, v216, Y41B, Y42B, Y444, Y800, Y16 , NV12, NV21, UYVP, A420, YUV9, IYU1 }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+
\ No newline at end of file diff --git a/docs/plugins/inspect/plugin-ladspa.xml b/docs/plugins/inspect/plugin-ladspa.xml index 1863ee22c2..a8225e0478 100644 --- a/docs/plugins/inspect/plugin-ladspa.xml +++ b/docs/plugins/inspect/plugin-ladspa.xml @@ -3,1470 +3,12 @@ All LADSPA plugins ../../ext/ladspa/.libs/libgstladspa.so libgstladspa.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins git Unknown package origin - - ladspa-AWfilt - A-weighting filter - Filter/Effect/Audio/LADSPA - A-weighting filter - Fons Adriaensen <fons.adriaensen@skynet.be> - - - Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-Accumulate - spectral accumulator - Filter/Effect/Audio/LADSPA - spectral accumulator - Richard Dobson, Trevor Wishart, Tim Goetze <tim@quitte.de> - - - in - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - out - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-Ambisonics-11-cube-decoder - AMB order 1,1 cube decoder - Filter/Effect/Audio/LADSPA - AMB order 1,1 cube decoder - Fons Adriaensen <fons@kokkinizita.net> - - - In-W - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - In-X - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - In-Y - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - In-Z - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-DLB - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-DLF - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-DRB - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-DRF - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-ULB - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-ULF - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-URB - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-URF - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-Ambisonics-11-hexagon-decoder - AMB order 1,1 hexagon decoder - Filter/Effect/Audio/LADSPA - AMB order 1,1 hexagon decoder - Fons Adriaensen <fons@kokkinizita.net> - - - In-W - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - In-X - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - In-Y - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - In-Z - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-L-LF - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-LB-LB - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-LF-F - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-R-RB - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-RB-B - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-RF-RF - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-Ambisonics-11-mono-panner - AMB order 1,1 mono panner - Filter/Effect/Audio/LADSPA - AMB order 1,1 mono panner - Fons Adriaensen <fons@kokkinizita.net> - - - In - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-W - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-X - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-Y - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-Z - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-Ambisonics-11-rotator - AMB order 1,1 rotator - Filter/Effect/Audio/LADSPA - AMB order 1,1 rotator - Fons Adriaensen <fons@kokkinizita.net> - - - In-W - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - In-X - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - In-Y - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - In-Z - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-W - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-X - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-Y - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-Z - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-Ambisonics-11-square-decoder - AMB order 1,1 square decoder - Filter/Effect/Audio/LADSPA - AMB order 1,1 square decoder - Fons Adriaensen <fons@kokkinizita.net> - - - In-W - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - In-X - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - In-Y - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - In-Z - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-LB-L - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-LF-F - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-RB-B - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-RF-R - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-Ambisonics-11-stereo-panner - AMB order 1,1 stereo panner - Filter/Effect/Audio/LADSPA - AMB order 1,1 stereo panner - Fons Adriaensen <fons@kokkinizita.net> - - - In-L - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - In-R - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-W - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-X - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-Y - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-Z - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-Ambisonics-21-panner - AMB order 2,1 panner - Filter/Effect/Audio/LADSPA - AMB order 2,1 panner - Fons Adriaensen <fons@kokkinizita.net> - - - In - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-U - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-V - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-W - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-X - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-Y - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-Z - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-Ambisonics-21-rotator - AMB order 2,1 rotator - Filter/Effect/Audio/LADSPA - AMB order 2,1 rotator - Fons Adriaensen <fons@kokkinizita.net> - - - In-U - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - In-V - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - In-W - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - In-X - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - In-Y - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - In-Z - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-U - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-V - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-W - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-X - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-Y - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-Z - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-Ambisonics-22-panner - AMB order 2,2 panner - Filter/Effect/Audio/LADSPA - AMB order 2,2 panner - Fons Adriaensen <fons@kokkinizita.net> - - - In - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-R - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-S - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-T - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-U - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-V - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-W - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-X - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-Y - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-Z - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-Ambisonics-22-rotator - AMB order 2,2 rotator - Filter/Effect/Audio/LADSPA - AMB order 2,2 rotator - Fons Adriaensen <fons@kokkinizita.net> - - - In-R - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - In-S - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - In-T - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - In-U - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - In-V - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - In-W - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - In-X - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - In-Y - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - In-Z - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-R - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-S - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-T - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-U - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-V - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-W - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-X - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-Y - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-Z - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-Ambisonics-31-panner - AMB order 3,1 panner - Filter/Effect/Audio/LADSPA - AMB order 3,1 panner - Joern Nettingsmeier <nettings@stackingdwarves.net> - - - In - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - OUT-P - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - OUT-Q - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-U - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-V - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-W - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-X - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-Y - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-Z - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-Ambisonics-31-rotator - AMB order 3,1 rotator - Filter/Effect/Audio/LADSPA - AMB order 3,1 rotator - Joern Nettingsmeier <nettings@stackingdwarves.net> - - - In-P - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - In-Q - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - In-U - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - In-V - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - In-W - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - In-X - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - In-Y - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - In-Z - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-P - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-Q - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-U - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-V - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-W - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-X - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-Y - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-Z - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-Ambisonics-33-panner - AMB order 3,3 panner - Filter/Effect/Audio/LADSPA - AMB order 3,3 panner - Joern Nettingsmeier <nettings@stackingdwarves.net> - - - In - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-K - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-L - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-M - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-N - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-O - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-P - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-Q - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-R - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-S - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-T - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-U - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-V - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-W - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-X - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-Y - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-Z - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-Ambisonics-33-rotator - AMB order 3,3 rotator - Filter/Effect/Audio/LADSPA - AMB order 3,3 rotator - Joern Nettingsmeier <nettings@stackingdwarves.net> - - - In-K - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - In-L - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - In-M - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - In-N - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - In-O - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - In-P - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - In-Q - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - In-R - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - In-S - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - In-T - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - In-U - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - In-V - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - In-W - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - In-X - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - In-Y - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - In-Z - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-K - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-L - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-M - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-N - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-O - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-P - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-Q - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-R - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-S - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-T - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-U - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-V - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-W - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-X - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-Y - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-Z - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-AmpIII - C* AmpIII - Tube amp - Filter/Effect/Audio/LADSPA - C* AmpIII - Tube amp - Tim Goetze <tim@quitte.de> - - - in - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - out - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-AmpIV - C* AmpIV - Tube amp + tone controls - Filter/Effect/Audio/LADSPA - C* AmpIV - Tube amp + tone controls - Tim Goetze <tim@quitte.de> - - - in - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - out - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-AmpV - C* AmpV - Tube amp - Filter/Effect/Audio/LADSPA - C* AmpV - Tube amp - Tim Goetze <tim@quitte.de> - - - in - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - out - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-AmpVTS - C* AmpVTS - Tube amp + Tone stack - Filter/Effect/Audio/LADSPA - C* AmpVTS - Tube amp + Tone stack - David Yeh <dtyeh@ccrma.stanford.edu> & Tim Goetze <tim@quitte.de> - - - in - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - out - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-AutoWah - C* AutoWah - Resonant envelope-following filter - Filter/Effect/Audio/LADSPA - C* AutoWah - Resonant envelope-following filter - Tim Goetze <tim@quitte.de> - - - in - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - out - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-BassEnhancer - Calf Bass Enhancer LADSPA - Filter/Effect/Audio/LADSPA - Calf Bass Enhancer LADSPA - Markus Schmidt / Krzysztof Foltman - - - In_L - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - In_R - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out_L - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out_R - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-BoosterM - Clipping Booster (mono) - Filter/Effect/Audio/LADSPA - Clipping Booster (mono) - Artemiy Pavlov - - - Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-BoosterS - Clipping Booster (stereo) - Filter/Effect/Audio/LADSPA - Clipping Booster (stereo) - Artemiy Pavlov - - - Input_L - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Input_R - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output_L - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output_R - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-CEO - C* CEO - Chief Executive Oscillator - Source/Audio/LADSPA - C* CEO - Chief Executive Oscillator - Tim Goetze <tim@quitte.de> - - - out - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-CVFreq - CV to Frequency convertor - Filter/Effect/Audio/LADSPA - CV to Frequency convertor - Joost Yervante Damad - - - Freq_-CV- - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Freq_-Hz- - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-CabinetI - C* CabinetI - Loudspeaker cabinet emulation - Filter/Effect/Audio/LADSPA - C* CabinetI - Loudspeaker cabinet emulation - Tim Goetze <tim@quitte.de> - - - in - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - out - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-CabinetII - C* CabinetII - Refined loudspeaker cabinet emulation - Filter/Effect/Audio/LADSPA - C* CabinetII - Refined loudspeaker cabinet emulation - Tim Goetze <tim@quitte.de> - - - in - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - out - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
ladspa-Chorus1 Chorus1 - Based on CSound orchestra by Sean Costello @@ -1488,39 +30,6 @@ - - ladspa-Chorus1-2x2 - LEET Chorus1_2x2 - 2x2 by Dan Lyons - Based on MCP Chorus by F. Adriaensen - Filter/Effect/Audio/LADSPA - LEET Chorus1_2x2 - 2x2 by Dan Lyons - Based on MCP Chorus by F. Adriaensen - Dan Lyons <socal_dan2000@yahoo.com> - - - Input_L - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Input_R - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output_L - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output_R - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
ladspa-Chorus2 Chorus2 - Based on CSound orchestra by Sean Costello @@ -1542,492 +51,6 @@ - - ladspa-ChorusI - C* ChorusI - Mono chorus/flanger - Filter/Effect/Audio/LADSPA - C* ChorusI - Mono chorus/flanger - Tim Goetze <tim@quitte.de> - - - in - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - out - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-ChorusII - C* ChorusII - Mono chorus/flanger modulated by a fractal - Filter/Effect/Audio/LADSPA - C* ChorusII - Mono chorus/flanger modulated by a fractal - Tim Goetze <tim@quitte.de> - - - in - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - out - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-Click - C* Click - Metronome - Source/Audio/LADSPA - C* Click - Metronome - Tim Goetze <tim@quitte.de> - - - out - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-Clip - C* Clip - Hard clipper, 8x oversampled - Filter/Effect/Audio/LADSPA - C* Clip - Hard clipper, 8x oversampled - Tim Goetze <tim@quitte.de> - - - in - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - out - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-Compress - C* Compress - Mono compressor - Filter/Effect/Audio/LADSPA - C* Compress - Mono compressor - Tim Goetze <tim@quitte.de>, Steve Harris <steve@plugin.org.uk> - - - in - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - out - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-Compressor - Calf Compressor LADSPA - Filter/Effect/Audio/LADSPA - Calf Compressor LADSPA - Thor Harald Johansen - - - In_L - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - In_R - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out_L - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out_R - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-Deesser - Calf Deesser LADSPA - Filter/Effect/Audio/LADSPA - Calf Deesser LADSPA - Markus Schmidt / Thor Harald Johansen - - - In_L - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - In_R - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out_L - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out_R - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-Dirac - C* Dirac - One-sample impulse generator - Source/Audio/LADSPA - C* Dirac - One-sample impulse generator - Tim Goetze <tim@quitte.de> - - - out - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-Eq - C* Eq - 10-band equalizer - Filter/Effect/Audio/LADSPA - C* Eq - 10-band equalizer - Tim Goetze <tim@quitte.de> - - - in - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - out - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-Eq2x2 - C* Eq2x2 - stereo 10-band equalizer - Filter/Effect/Audio/LADSPA - C* Eq2x2 - stereo 10-band equalizer - Tim Goetze <tim@quitte.de> - - - in-l - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - in-r - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - out-l - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - out-r - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-Equalizer12Band - Calf Equalizer 12 Band LADSPA - Filter/Effect/Audio/LADSPA - Calf Equalizer 12 Band LADSPA - Markus Schmidt - - - In_L - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - In_R - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out_L - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out_R - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-Equalizer5Band - Calf Equalizer 5 Band LADSPA - Filter/Effect/Audio/LADSPA - Calf Equalizer 5 Band LADSPA - Markus Schmidt - - - In_L - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - In_R - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out_L - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out_R - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-Equalizer8Band - Calf Equalizer 8 Band LADSPA - Filter/Effect/Audio/LADSPA - Calf Equalizer 8 Band LADSPA - Markus Schmidt - - - In_L - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - In_R - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out_L - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out_R - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-Exaggerate - spectral exaggerator - Filter/Effect/Audio/LADSPA - spectral exaggerator - Richard Dobson, Trevor Wishart, Tim Goetze <tim@quitte.de> - - - in - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - out - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-Exciter - Calf Exciter LADSPA - Filter/Effect/Audio/LADSPA - Calf Exciter LADSPA - Markus Schmidt / Krzysztof Foltman - - - In_L - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - In_R - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out_L - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out_R - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-Filter - Calf Filter LADSPA - Filter/Effect/Audio/LADSPA - Calf Filter LADSPA - Krzysztof Foltman - - - In_L - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - In_R - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out_L - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out_R - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-Filterclavier - Calf Filterclavier LADSPA - Filter/Effect/Audio/LADSPA - Calf Filterclavier LADSPA - Krzysztof Foltman / Hans Baier - - - In_L - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - In_R - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out_L - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out_R - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-Flanger - Calf Flanger LADSPA - Filter/Effect/Audio/LADSPA - Calf Flanger LADSPA - Krzysztof Foltman - - - In_L - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - In_R - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out_L - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out_R - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
ladspa-G2reverb Stereo reverb @@ -2061,246 +84,6 @@ - - ladspa-Gate - Calf Gate LADSPA - Filter/Effect/Audio/LADSPA - Calf Gate LADSPA - Damien Zammit / Thor Harald Johansen - - - In_L - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - In_R - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out_L - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out_R - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-HRTF - C* HRTF - Head-related transfer function at elevation 0 - Filter/Effect/Audio/LADSPA - C* HRTF - Head-related transfer function at elevation 0 - Tim Goetze <tim@quitte.de> - - - in - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - out-l - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - out-r - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-JVRev - C* JVRev - Stanford-style reverb from STK - Filter/Effect/Audio/LADSPA - C* JVRev - Stanford-style reverb from STK - Tim Goetze <tim@quitte.de> - - - in - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - out-l - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - out-r - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-Lorenz - C* Lorenz - The sound of a Lorenz attractor - Source/Audio/LADSPA - C* Lorenz - The sound of a Lorenz attractor - Tim Goetze <tim@quitte.de> - - - out - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-MUSIC - MUSIC channel - Filter/Effect/Audio/LADSPA - MUSIC channel - Joost Yervante Damad - - - Freq_-Hz- - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Gate - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-MUSICDrum - MUSIC Drum instruments - Filter/Effect/Audio/LADSPA - MUSIC Drum instruments - Joost Yervante Damad - - - Gate_Bass_Drum - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Gate_High-Hat - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Gate_Snare_Drum - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Gate_Tom-Tom - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Gate_Top_Cymbal - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-MultiChorus - Calf MultiChorus LADSPA - Filter/Effect/Audio/LADSPA - Calf MultiChorus LADSPA - Krzysztof Foltman - - - In_L - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - In_R - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out_L - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out_R - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-Multibandcompressor - Calf Multiband Compressor LADSPA - Filter/Effect/Audio/LADSPA - Calf Multiband Compressor LADSPA - Markus Schmidt / Thor Harald Johansen - - - In_L - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - In_R - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out_L - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out_R - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
ladspa-Mvchpf-1 Mvchpf-1 Digital implementation of the VC HP filter invented by R.A. Moog @@ -2490,168 +273,6 @@ - - ladspa-NoisifierM - Noisifier (mono) - Filter/Effect/Audio/LADSPA - Noisifier (mono) - Artemiy Pavlov - - - Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-NoisifierS - Noisifier (stereo) - Filter/Effect/Audio/LADSPA - Noisifier (stereo) - Artemiy Pavlov - - - Input_L - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Input_R - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output_L - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output_R - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-PSG - PSG channel - Filter/Effect/Audio/LADSPA - PSG channel - Joost Yervante Damad - - - Freq_-Hz- - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Gate - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-Pan - C* Pan - Pan and width - Filter/Effect/Audio/LADSPA - C* Pan - Pan and width - Tim Goetze <tim@quitte.de> - - - in - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - out-l - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - out-r - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-Parametric1 - 4-band parametric filter - Filter/Effect/Audio/LADSPA - 4-band parametric filter - Fons Adriaensen <fons@kokkinizita.net> - - - Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-Phaser - Calf Phaser LADSPA - Filter/Effect/Audio/LADSPA - Calf Phaser LADSPA - Krzysztof Foltman - - - In_L - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - In_R - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out_L - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out_R - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
ladspa-Phaser1 Phaser1 - Similar to CSound's phaser1 by Sean Costello @@ -2712,972 +333,6 @@ - - ladspa-PhaserI - C* PhaserI - Mono phaser - Filter/Effect/Audio/LADSPA - C* PhaserI - Mono phaser - Tim Goetze <tim@quitte.de> - - - in - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - out - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-PhaserII - C* PhaserII - Mono phaser modulated by a Lorenz fractal - Filter/Effect/Audio/LADSPA - C* PhaserII - Mono phaser modulated by a Lorenz fractal - Tim Goetze <tim@quitte.de> - - - in - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - out - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-Plate - C* Plate - Versatile plate reverb - Filter/Effect/Audio/LADSPA - C* Plate - Versatile plate reverb - Tim Goetze <tim@quitte.de> - - - in - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - out-l - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - out-r - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-Plate2x2 - C* Plate2x2 - Versatile plate reverb, stereo inputs - Filter/Effect/Audio/LADSPA - C* Plate2x2 - Versatile plate reverb, stereo inputs - Tim Goetze <tim@quitte.de> - - - in-l - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - in-r - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - out-l - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - out-r - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-PreampIII - C* PreampIII - Tube preamp emulation - Filter/Effect/Audio/LADSPA - C* PreampIII - Tube preamp emulation - Tim Goetze <tim@quitte.de> - - - in - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - out - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-PreampIV - C* PreampIV - Tube preamp emulation + tone controls - Filter/Effect/Audio/LADSPA - C* PreampIV - Tube preamp emulation + tone controls - Tim Goetze <tim@quitte.de> - - - in - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - out - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-Pulsator - Calf Pulsator LADSPA - Filter/Effect/Audio/LADSPA - Calf Pulsator LADSPA - Markus Schmidt - - - In_L - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - In_R - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out_L - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out_R - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-Pulse-VCO - Pulse-VCO -- Anti-aliased oscillator - Filter/Effect/Audio/LADSPA - Pulse-VCO -- Anti-aliased oscillator - Fons Adriaensen <fons.adriaensen@alcatel.be> - - - Exp_FM - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Frequency - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Lin_FM - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-Rec-VCO - Rec-VCO -- Anti-aliased oscillator - Filter/Effect/Audio/LADSPA - Rec-VCO -- Anti-aliased oscillator - Fons Adriaensen <fons.adriaensen@alcatel.be> - - - Exp_FM - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Frequency - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Lin_FM - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Mod - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Sync - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-Reverb - Calf Reverb LADSPA - Filter/Effect/Audio/LADSPA - Calf Reverb LADSPA - Krzysztof Foltman - - - In_L - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - In_R - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out_L - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out_R - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-Roessler - C* Roessler - The sound of a Roessler attractor - Source/Audio/LADSPA - C* Roessler - The sound of a Roessler attractor - Tim Goetze <tim@quitte.de> - - - out - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-RotarySpeaker - Calf Rotary Speaker LADSPA - Filter/Effect/Audio/LADSPA - Calf Rotary Speaker LADSPA - Krzysztof Foltman - - - In_L - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - In_R - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out_L - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out_R - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-SCC - SCC channel - Filter/Effect/Audio/LADSPA - SCC channel - Joost Yervante Damad - - - Freq_-Hz- - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-SID - SID chip - Filter/Effect/Audio/LADSPA - SID chip - Joost Yervante Damad - - - Freq_-Hz-_1 - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Freq_-Hz-_2 - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Freq_-Hz-_3 - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Gate_1 - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Gate_2 - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Gate_3 - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-Saturator - Calf Saturator LADSPA - Filter/Effect/Audio/LADSPA - Calf Saturator LADSPA - Markus Schmidt / Krzysztof Foltman - - - In_L - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - In_R - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out_L - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out_R - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-Saw-VCO - Saw-VCO -- Anti-aliased oscillator - Filter/Effect/Audio/LADSPA - Saw-VCO -- Anti-aliased oscillator - Fons Adriaensen <fons.adriaensen@alcatel.be> - - - Exp_FM - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Frequency - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Lin_FM - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Sync - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-Scape - C* Scape - Stereo delay + Filters - Filter/Effect/Audio/LADSPA - C* Scape - Stereo delay + Filters - Tim Goetze <tim@quitte.de> - - - in - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - out-l - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - out-r - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-Sidechaincompressor - Calf Sidechain Compressor LADSPA - Filter/Effect/Audio/LADSPA - Calf Sidechain Compressor LADSPA - Markus Schmidt / Thor Harald Johansen - - - In_L - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - In_R - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out_L - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out_R - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-Sidechaingate - Calf Sidechain Gate LADSPA - Filter/Effect/Audio/LADSPA - Calf Sidechain Gate LADSPA - Markus Schmidt / Damien Zammit / Thor Harald Johansen - - - In_L - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - In_R - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out_L - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out_R - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-Sin - C* Sin - Sine wave generator - Source/Audio/LADSPA - C* Sin - Sine wave generator - Tim Goetze <tim@quitte.de> - - - out - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-SooperLooper - SooperLooper - Filter/Effect/Audio/LADSPA - SooperLooper - Jesse Chappell - - - Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-StereoChorusI - C* StereoChorusI - Stereo chorus/flanger - Filter/Effect/Audio/LADSPA - C* StereoChorusI - Stereo chorus/flanger - Tim Goetze <tim@quitte.de> - - - in - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - out-l - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - out-r - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-StereoChorusII - C* StereoChorusII - Stereo chorus/flanger modulated by a fractal - Filter/Effect/Audio/LADSPA - C* StereoChorusII - Stereo chorus/flanger modulated by a fractal - Tim Goetze <tim@quitte.de> - - - in - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - out-l - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - out-r - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-SweepVFI - C* SweepVFI - Resonant filter swept by a Lorenz fractal - Filter/Effect/Audio/LADSPA - C* SweepVFI - Resonant filter swept by a Lorenz fractal - Tim Goetze <tim@quitte.de> - - - in - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - out - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-SweepVFII - C* SweepVFII - Resonant filter, f and Q swept by a Lorenz fractal - Filter/Effect/Audio/LADSPA - C* SweepVFII - Resonant filter, f and Q swept by a Lorenz fractal - Tim Goetze <tim@quitte.de> - - - in - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - out - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-Sync-Rect-VCO - Sync-Rect-VCO -- Hard-sync-capable anti-aliased oscillator - Filter/Effect/Audio/LADSPA - Sync-Rect-VCO -- Hard-sync-capable anti-aliased oscillator - Sean Bolton <musound AT jps DOT net> - - - Exp_FM - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Frequency - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Lin_FM - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Sync_In - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Wave_Mod - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Sync_Out - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-Sync-Saw-VCO - Sync-Saw-VCO -- Hard-sync-capable anti-aliased oscillator - Filter/Effect/Audio/LADSPA - Sync-Saw-VCO -- Hard-sync-capable anti-aliased oscillator - Sean Bolton <musound AT jps DOT net> - - - Exp_FM - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Frequency - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Lin_FM - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Sync_In - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Sync_Out - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-Sync-Tri-VCO - Sync-Tri-VCO -- Hard-sync-capable anti-aliased oscillator - Filter/Effect/Audio/LADSPA - Sync-Tri-VCO -- Hard-sync-capable anti-aliased oscillator - Sean Bolton <musound AT jps DOT net> - - - Exp_FM - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Frequency - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Lin_FM - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Sync_In - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Wave_Mod - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Sync_Out - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-ToneStack - C* ToneStack - Tone stack emulation - Filter/Effect/Audio/LADSPA - C* ToneStack - Tone stack emulation - David Yeh <dtyeh@ccrma.stanford.edu> - - - in - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - out - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-ToneStackLT - C* ToneStackLT - Tone stack emulation, lattice filter 44.1 - Filter/Effect/Audio/LADSPA - C* ToneStackLT - Tone stack emulation, lattice filter 44.1 - David Yeh <dtyeh@ccrma.stanford.edu> - - - in - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - out - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-Transpose - phase-vocoder based pitch shifter - Filter/Effect/Audio/LADSPA - phase-vocoder based pitch shifter - Richard Dobson, Trevor Wishart, Tim Goetze <tim@quitte.de> - - - in - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - out - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-Tricardioid-to-AMB - Three cardioids to AMB matrix - Filter/Effect/Audio/LADSPA - Three cardioids to AMB matrix - Fons Adriaensen <fons@kokkinizita.net> - - - In-B - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - In-L - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - In-R - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-W - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-X - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-Y - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-Z - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
ladspa-TripleChorus Triple chorus @@ -3711,327 +366,6 @@ - - ladspa-VCOd - C* VCOd - Double VCO with detune and hard sync options - Source/Audio/LADSPA - C* VCOd - Double VCO with detune and hard sync options - Tim Goetze <tim@quitte.de> - - - out - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-VCOs - C* VCOs - Virtual 'analogue' oscillator - Source/Audio/LADSPA - C* VCOs - Virtual 'analogue' oscillator - Tim Goetze <tim@quitte.de> - - - out - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-VariNoiseM - Variable Noise (mono) - Source/Audio/LADSPA - Variable Noise (mono) - Artemiy Pavlov - - - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-VariNoiseS - Variable Noise (stereo) - Source/Audio/LADSPA - Variable Noise (stereo) - Artemiy Pavlov - - - Output_L - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output_R - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-VintageDelay - Calf Vintage Delay LADSPA - Filter/Effect/Audio/LADSPA - Calf Vintage Delay LADSPA - Krzysztof Foltman - - - In_L - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - In_R - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out_L - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out_R - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-Virtualmic - Virtual stereo microphone - Filter/Effect/Audio/LADSPA - Virtual stereo microphone - Fons Adriaensen <fons@kokkinizita.net> - - - In-W - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - In-X - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - In-Y - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - In-Z - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-L - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out-R - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-White - C* White - White noise generator - Source/Audio/LADSPA - C* White - White noise generator - Tim Goetze <tim@quitte.de> - - - out - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-XShaperM - X-Shaper (mono) - Filter/Effect/Audio/LADSPA - X-Shaper (mono) - Artemiy Pavlov - - - Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-XShaperS - X-Shaper (stereo) - Filter/Effect/Audio/LADSPA - X-Shaper (stereo) - Artemiy Pavlov - - - Input_L - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Input_R - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output_L - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output_R - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-adenv - Percussive AD Envelope - Filter/Effect/Audio/LADSPA - Percussive AD Envelope - Loki Davison <ltdav1[at]student.monash.edu.au> - - - Gate - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Trigger - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Envelope_Out - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-adenv-lvl - Percussive AD Envelope with levels - Filter/Effect/Audio/LADSPA - Percussive AD Envelope with levels - Loki Davison <ltdav1[at]student.monash.edu.au> - - - Gate - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Reset_Level - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Trigger - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Envelope_Out - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-adsr - ADSR Envelope - Filter/Effect/Audio/LADSPA - ADSR Envelope - Mike Rawes <mike_rawes[at]yahoo.co.uk> - - - Driving_Signal - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Envelope_Out - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-adsr-g+t - ADSR Envelope with Gate and Trigger - Filter/Effect/Audio/LADSPA - ADSR Envelope with Gate and Trigger - Mike Rawes <mike_rawes[at]yahoo.co.uk> - - - Gate - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Trigger - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Envelope_Out - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
ladspa-alias Aliasing @@ -4053,60 +387,6 @@ - - ladspa-alienwah-mono - AlienWah for mono - Filter/Effect/Audio/LADSPA - AlienWah for mono - Plugin: Paul<set@pobox.com> Effect: Nasca O. Paul<paulnasca@yahoo.com> - - - Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-alienwah-stereo - AlienWah for stereo - Filter/Effect/Audio/LADSPA - AlienWah for stereo - Plugin: Paul<set@pobox.com> Effect: Nasca O. Paul<paulnasca@yahoo.com> - - - Input1 - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Input2 - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output1 - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output2 - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
ladspa-allpass-c Allpass delay line, cubic spline interpolation @@ -4170,33 +450,6 @@ - - ladspa-am - Amplitude Modulator - Filter/Effect/Audio/LADSPA - Amplitude Modulator - CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse) - - - Input_1 - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Input_2 - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
ladspa-amPitchshift AM pitchshifter @@ -4239,60 +492,12 @@ - - ladspa-amp-gaia-oa - Amplifier (GAIA) - Filter/Effect/Audio/LADSPA - Amplifier (GAIA) - Mike Rawes <mike_rawes[at]yahoo.co.uk> - - - Gain_-dB- - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-amp-gcia-oa - Amplifier (GCIA) - Filter/Effect/Audio/LADSPA - Amplifier (GCIA) - Mike Rawes <mike_rawes[at]yahoo.co.uk> - - - Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
ladspa-amp-mono - Amplifier (Mono) + Mono Amplifier Filter/Effect/Audio/LADSPA - Amplifier (Mono) - CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse) + Mono Amplifier + Richard Furse (LADSPA example plugins) Input @@ -4310,10 +515,10 @@ ladspa-amp-stereo - Amplifier (Stereo) + Stereo Amplifier Filter/Effect/Audio/LADSPA - Amplifier (Stereo) - CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse) + Stereo Amplifier + Richard Furse (LADSPA example plugins) Input_-Left- @@ -4341,21 +546,6 @@ - - ladspa-analogue - Analogue Voice - Source/Audio/LADSPA - Analogue Voice - CMT (http://www.ladspa.org/cmt, plugin by David A. Bartold) - - - Out - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
ladspa-analogueOsc Analogue Oscillator @@ -4455,246 +645,6 @@ - - ladspa-bf-rotate-z - Ambisonic Rotation (B-Format, Horizontal) - Filter/Effect/Audio/LADSPA - Ambisonic Rotation (B-Format, Horizontal) - CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse) - - - Input_-W- - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Input_-X- - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Input_-Y- - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Input_-Z- - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output_-W- - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output_-X- - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output_-Y- - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output_-Z- - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-bf2cube - Ambisonic Decoder (B-Format to Cube) - Filter/Effect/Audio/LADSPA - Ambisonic Decoder (B-Format to Cube) - CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse) - - - Input_-W- - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Input_-X- - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Input_-Y- - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Input_-Z- - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output_-Base_Back_Left- - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output_-Base_Back_Right- - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output_-Base_Front_Left- - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output_-Base_Front_Right- - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output_-Top_Back_Left- - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output_-Top_Back_Right- - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output_-Top_Front_Left- - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output_-Top_Front_Right- - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-bf2quad - Ambisonic Decoder (B-Format to Quad) - Filter/Effect/Audio/LADSPA - Ambisonic Decoder (B-Format to Quad) - CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse) - - - Input_-W- - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Input_-X- - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Input_-Y- - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Input_-Z- - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output_-Back_Left- - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output_-Back_Right- - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output_-Front_Left- - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output_-Front_Right- - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-bf2stereo - Ambisonic Decoder (B-Format to Stereo) - Filter/Effect/Audio/LADSPA - Ambisonic Decoder (B-Format to Stereo) - CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse) - - - Input_-W- - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Input_-X- - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Input_-Y- - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Input_-Z- - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output_-Left- - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output_-Right- - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
ladspa-bodeShifter Bode frequency shifter @@ -4761,42 +711,6 @@ - - ladspa-branch-ia-oaoa - Signal Branch (IA) - Filter/Effect/Audio/LADSPA - Signal Branch (IA) - Mike Rawes <mike_rawes[at]yahoo.co.uk> - - - Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - First_Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Second_Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-branch-ic-ococ - Signal Branch (IC) - Source/Audio/LADSPA - Signal Branch (IC) - Mike Rawes <mike_rawes[at]yahoo.co.uk> - - - ladspa-butthigh-iir GLAME Butterworth Highpass @@ -4866,39 +780,6 @@ - - ladspa-canyon-delay - Canyon Delay - Filter/Effect/Audio/LADSPA - Canyon Delay - CMT (http://www.ladspa.org/cmt, plugin by David A. Bartold) - - - In_-Left- - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - In_-Right- - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out_-Left- - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out_-Right- - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
ladspa-chebstortion Chebyshev distortion @@ -4920,27 +801,6 @@ - - ladspa-clipper - hard clipper (no antialiasing) - Filter/Effect/Audio/LADSPA - hard clipper (no antialiasing) - Tim Goetze <tim@quitte.de> - - - in - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - out - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
ladspa-comb Comb Filter @@ -5052,132 +912,6 @@ - - ladspa-comp-aa - Comparison (AA) - Filter/Effect/Audio/LADSPA - Comparison (AA) - Thorsten Wilms - - - A - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - B - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - A_=_B - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - A_>_B - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Larger - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Smaller - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-comp-ac - Comparison (AC) - Filter/Effect/Audio/LADSPA - Comparison (AC) - Thorsten Wilms - - - A - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - A_=_B - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - A_>_B - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Larger - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Smaller - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-compress-peak - Simple Compressor (Peak Envelope Tracking) - Filter/Effect/Audio/LADSPA - Simple Compressor (Peak Envelope Tracking) - CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse) - - - Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-compress-rms - Simple Compressor (RMS Envelope Tracking) - Filter/Effect/Audio/LADSPA - Simple Compressor (RMS Envelope Tracking) - CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse) - - - Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
ladspa-const Constant Signal Generator @@ -5220,165 +954,6 @@ - - ladspa-dahdsr-cg+t-control - DAHDSR Envelope with Control Gate and Trigger (Control Inputs) - Source/Audio/LADSPA - DAHDSR Envelope with Control Gate and Trigger (Control Inputs) - Mike Rawes <mike_rawes[at]yahoo.co.uk> - - - Envelope_Out - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-dahdsr-fexp - DAHDSR Envelope full exp, adr - Filter/Effect/Audio/LADSPA - DAHDSR Envelope full exp, adr - Loki Davison <ltdav1[at]student.monash.edu.au> - - - Gate - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Trigger - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Envelope_Out - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-dahdsr-g+t-audio - DAHDSR Envelope with Gate and Trigger (Audio-Rate Inputs) - Filter/Effect/Audio/LADSPA - DAHDSR Envelope with Gate and Trigger (Audio-Rate Inputs) - Mike Rawes <mike_rawes[at]yahoo.co.uk> - - - Attack_Time_-s- - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Decay_Time_-s- - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Delay_Time_-s- - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Gate - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Hold_Time_-s- - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Release_Time_-s- - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Sustain_Level - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Trigger - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Envelope_Out - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-dahdsr-g+t-control - DAHDSR Envelope with Gate and Trigger (Control Inputs) - Filter/Effect/Audio/LADSPA - DAHDSR Envelope with Gate and Trigger (Control Inputs) - Mike Rawes <mike_rawes[at]yahoo.co.uk> - - - Gate - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Trigger - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Envelope_Out - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-dahdsr-hexp - DAHDSR Envelope linear attack exp dr - Filter/Effect/Audio/LADSPA - DAHDSR Envelope linear attack exp dr - Loki Davison <ltdav1[at]student.monash.edu.au> - - - Gate - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Trigger - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Envelope_Out - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
ladspa-dcRemove DC Offset Remover @@ -5463,69 +1038,6 @@ - - ladspa-delay-0-01s - Echo Delay Line (Maximum Delay 0.01s) - Filter/Effect/Audio/LADSPA - Echo Delay Line (Maximum Delay 0.01s) - CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse) - - - Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-delay-0-1s - Echo Delay Line (Maximum Delay 0.1s) - Filter/Effect/Audio/LADSPA - Echo Delay Line (Maximum Delay 0.1s) - CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse) - - - Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-delay-1s - Echo Delay Line (Maximum Delay 1s) - Filter/Effect/Audio/LADSPA - Echo Delay Line (Maximum Delay 1s) - CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse) - - - Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
ladspa-delay-5s Simple Delay Line @@ -5547,27 +1059,6 @@ - - ladspa-delay-60s - Echo Delay Line (Maximum Delay 60s) - Filter/Effect/Audio/LADSPA - Echo Delay Line (Maximum Delay 60s) - CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse) - - - Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
ladspa-delay-c Simple delay line, cubic spline interpolation @@ -5652,84 +1143,6 @@ - - ladspa-difference-iama-oa - Signal Difference (IAMA) - Filter/Effect/Audio/LADSPA - Signal Difference (IAMA) - Mike Rawes <mike_rawes[at]yahoo.co.uk> - - - Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Input_to_Subtract - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Difference_Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-difference-iamc-oa - Signal Difference (IAMC) - Filter/Effect/Audio/LADSPA - Signal Difference (IAMC) - Mike Rawes <mike_rawes[at]yahoo.co.uk> - - - Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Difference_Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-difference-icma-oa - Signal Difference (ICMA) - Filter/Effect/Audio/LADSPA - Signal Difference (ICMA) - Mike Rawes <mike_rawes[at]yahoo.co.uk> - - - Input_to_Subtract - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Difference_Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-difference-icmc-oc - Signal Difference (ICMC) - Source/Audio/LADSPA - Signal Difference (ICMC) - Mike Rawes <mike_rawes[at]yahoo.co.uk> - - - ladspa-diode Diode Processor @@ -5751,27 +1164,6 @@ - - ladspa-disintegrator - Disintegrator - Filter/Effect/Audio/LADSPA - Disintegrator - CMT (http://www.ladspa.org/cmt, plugin by Nathaniel Virgo) - - - Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
ladspa-divider Audio Divider (Suboctave Generator) @@ -5889,177 +1281,6 @@ - - ladspa-eir - Experiments in Representation - Filter/Effect/Audio/LADSPA - Experiments in Representation - Nick Lamb <njl195@zepler.org.uk> - - - Intput - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-encode-bformat - Ambisonic Encoder (B-Format) - Filter/Effect/Audio/LADSPA - Ambisonic Encoder (B-Format) - CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse) - - - Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output_-W- - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output_-X- - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output_-Y- - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output_-Z- - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-encode-fmh - Ambisonic Encoder (FMH-Format) - Filter/Effect/Audio/LADSPA - Ambisonic Encoder (FMH-Format) - CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse) - - - Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output_-R- - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output_-S- - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output_-T- - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output_-U- - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output_-V- - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output_-W- - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output_-X- - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output_-Y- - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output_-Z- - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-expand-peak - Simple Expander (Peak Envelope Tracking) - Filter/Effect/Audio/LADSPA - Simple Expander (Peak Envelope Tracking) - CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse) - - - Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-expand-rms - Simple Expander (RMS Envelope Tracking) - Filter/Effect/Audio/LADSPA - Simple Expander (RMS Envelope Tracking) - CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse) - - - Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
ladspa-fadDelay Fractionally Addressed Delay Line @@ -6081,39 +1302,6 @@ - - ladspa-fast-xfade - Fast Crossfade - Filter/Effect/Audio/LADSPA - Fast Crossfade - Thorsten Wilms - - - A - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - B - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Level - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
ladspa-fastLookaheadLimiter Fast Lookahead limiter @@ -6147,111 +1335,6 @@ - - ladspa-fbdelay-0-01s - Feedback Delay Line (Maximum Delay 0.01s) - Filter/Effect/Audio/LADSPA - Feedback Delay Line (Maximum Delay 0.01s) - CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse) - - - Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-fbdelay-0-1s - Feedback Delay Line (Maximum Delay 0.1s) - Filter/Effect/Audio/LADSPA - Feedback Delay Line (Maximum Delay 0.1s) - CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse) - - - Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-fbdelay-1s - Feedback Delay Line (Maximum Delay 1s) - Filter/Effect/Audio/LADSPA - Feedback Delay Line (Maximum Delay 1s) - CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse) - - - Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-fbdelay-5s - Feedback Delay Line (Maximum Delay 5s) - Filter/Effect/Audio/LADSPA - Feedback Delay Line (Maximum Delay 5s) - CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse) - - - Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-fbdelay-60s - Feedback Delay Line (Maximum Delay 60s) - Filter/Effect/Audio/LADSPA - Feedback Delay Line (Maximum Delay 60s) - CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse) - - - Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
ladspa-flanger Flanger @@ -6273,21 +1356,6 @@ - - ladspa-floatNoise - IEEE Single Precision Noise - Source/Audio/LADSPA - IEEE Single Precision Noise - Nick Lamb <njl195@zepler.org.uk> - - - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
ladspa-fmOsc FM Oscillator @@ -6309,399 +1377,6 @@ - - ladspa-fmh-rotate-z - Ambisonic Rotation (FMH-Format, Horizontal) - Filter/Effect/Audio/LADSPA - Ambisonic Rotation (FMH-Format, Horizontal) - CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse) - - - Input_-R- - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Input_-S- - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Input_-T- - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Input_-U- - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Input_-V- - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Input_-W- - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Input_-X- - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Input_-Y- - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Input_-Z- - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output_-R- - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output_-S- - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output_-T- - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output_-U- - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output_-V- - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output_-W- - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output_-X- - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output_-Y- - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output_-Z- - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-fmh2bf - FMH-Format to B-Format (Discards RSTUV Channels) - Filter/Effect/Audio/LADSPA - FMH-Format to B-Format (Discards RSTUV Channels) - CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse) - - - Input_-R- - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Input_-S- - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Input_-T- - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Input_-U- - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Input_-V- - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Input_-W- - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Input_-X- - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Input_-Y- - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Input_-Z- - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output_-W- - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output_-X- - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output_-Y- - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output_-Z- - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-fmh2oct - Ambisonic Decoder (FMH-Format to Octagon) - Filter/Effect/Audio/LADSPA - Ambisonic Decoder (FMH-Format to Octagon) - CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse) - - - Input_-R- - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Input_-S- - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Input_-T- - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Input_-U- - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Input_-V- - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Input_-W- - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Input_-X- - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Input_-Y- - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Input_-Z- - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output_-Back_Back_Left- - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output_-Back_Back_Right- - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output_-Back_Left_Left- - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output_-Back_Right_Right- - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output_-Front_Front_Left- - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output_-Front_Front_Right- - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output_-Front_Left_Left- - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output_-Front_Right_Right- - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-fmod-fama-oa - Frequency Modulator (FAMA) - Filter/Effect/Audio/LADSPA - Frequency Modulator (FAMA) - Mike Rawes <mike_rawes[at]yahoo.co.uk> - - - Frequency_-Hz- - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Modulation_-Octaves- - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Modulated_Frequency_-Hz- - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-fmod-famc-oa - Frequency Modulator (FAMC) - Filter/Effect/Audio/LADSPA - Frequency Modulator (FAMC) - Mike Rawes <mike_rawes[at]yahoo.co.uk> - - - Frequency_-Hz- - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Modulated_Frequency_-Hz- - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-fmod-fcma-oa - Frequency Modulator (FCMA) - Filter/Effect/Audio/LADSPA - Frequency Modulator (FCMA) - Mike Rawes <mike_rawes[at]yahoo.co.uk> - - - Modulation_-Octaves- - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Modulated_Frequency_-Hz- - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-fmod-fcmc-oc - Frequency Modulator (FCMC) - Source/Audio/LADSPA - Frequency Modulator (FCMC) - Mike Rawes <mike_rawes[at]yahoo.co.uk> - - - ladspa-foldover Foldover distortion @@ -6723,210 +1398,6 @@ - - ladspa-foo-chop-liver - Foo Chop Liver - Filter/Effect/Audio/LADSPA - Foo Chop Liver - Sampo Savolainen <v2@iki.fi> - - - Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-foo-driver - Foo Driver - Filter/Effect/Audio/LADSPA - Foo Driver - Sampo Savolainen <v2@iki.fi> - - - Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-foo-limiter - Foo Lookahead Limiter - Filter/Effect/Audio/LADSPA - Foo Lookahead Limiter - Sampo Savolainen <v2@iki.fi> - - - Input_L - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Input_R - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output_L - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output_R - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-foo-limiter-v2 - Foo Lookahead Limiter v2 - Filter/Effect/Audio/LADSPA - Foo Lookahead Limiter v2 - Sampo Savolainen <v2@iki.fi> - - - Input_L - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Input_R - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output_L - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output_R - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-foo-saturator - Foo Saturator - Filter/Effect/Audio/LADSPA - Foo Saturator - Sampo Savolainen <v2@iki.fi> - - - Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-foo-transients - Foo Transient Architect - Filter/Effect/Audio/LADSPA - Foo Transient Architect - Sampo Savolainen <v2@iki.fi> - - - Input_L - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Input_R - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output_L - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output_R - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-foo-transients-mono - Foo Transient Architect (mono) - Filter/Effect/Audio/LADSPA - Foo Transient Architect (mono) - Sampo Savolainen <v2@iki.fi> - - - Input_L - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output_L - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-formant-vc - Formant Filter (CR vowel) - Filter/Effect/Audio/LADSPA - Formant Filter (CR vowel) - Dave Robillard - - - Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
ladspa-fourByFourPole 4 x 4 pole allpass @@ -6969,39 +1440,6 @@ - - ladspa-freeverb3 - Freeverb (Version 3) - Filter/Effect/Audio/LADSPA - Freeverb (Version 3) - CMT (http://www.ladspa.org/cmt, plugin by Jezar at Dreampoint, ported by Richard W.E. Furse) - - - Input_-Left- - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Input_-Right- - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output_-Left- - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output_-Right- - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
ladspa-freqTracker Frequency tracker @@ -7107,27 +1545,6 @@ - - ladspa-grain-scatter - Granular Scatter Processor - Filter/Effect/Audio/LADSPA - Granular Scatter Processor - CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse) - - - Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
ladspa-gsm GSM simulator @@ -7176,27 +1593,6 @@ - - ladspa-hard-gate - Hard Gate - Filter/Effect/Audio/LADSPA - Hard Gate - CMT (http://www.ladspa.org/cmt, plugin by Nathaniel Virgo) - - - Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
ladspa-hardLimiter Hard Limiter @@ -7310,10 +1706,10 @@ ladspa-hpf - High Pass Filter (One Pole) + Simple High Pass Filter Filter/Effect/Audio/LADSPA - High Pass Filter (One Pole) - CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse) + Simple High Pass Filter + Richard Furse (LADSPA example plugins) Input @@ -7329,66 +1725,6 @@ - - ladspa-hz-voct-ar - Hz to V/Oct Converter (AR) - Filter/Effect/Audio/LADSPA - Hz to V/Oct Converter (AR) - Dave Robillard - - - Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-hz-voct-cr - Hz to V/Oct Converter (CR) - Source/Audio/LADSPA - Hz to V/Oct Converter (CR) - Dave Robillard - - - - - ladspa-identity-audio - Identity (Audio) - Filter/Effect/Audio/LADSPA - Identity (Audio) - CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse) - - - Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-identity-control - Identity (Control) - Source/Audio/LADSPA - Identity (Control) - CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse) - - - ladspa-imp Impulse convolver @@ -7425,36 +1761,6 @@ - - ladspa-intNoise - Integer Noise - Source/Audio/LADSPA - Integer Noise - Nick Lamb <njl195@zepler.org.uk> - - - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-interpolator - Control to Audio Interpolator - Source/Audio/LADSPA - Control to Audio Interpolator - Mike Rawes <mike_rawes[at]yahoo.co.uk> - - - Interpolated_Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
ladspa-inv Inverter @@ -7542,72 +1848,6 @@ - - ladspa-leet-equalizer-bw2x2 - LEET Equalizer/BW 2x2 8 Band - Filter/Effect/Audio/LADSPA - LEET Equalizer/BW 2x2 8 Band - Dan Lyons modded from TAP - - - Input_L - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Input_R - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output_L - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output_R - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-leet-equalizer-bw2x2-1 - LEET Equalizer/BW 2x2 1 band - Filter/Effect/Audio/LADSPA - LEET Equalizer/BW 2x2 1 band - Dan Lyons modded from TAP - - - Input_L - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Input_R - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output_L - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output_R - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
ladspa-lfoPhaser LFO Phaser @@ -7629,96 +1869,6 @@ - - ladspa-limit-peak - Simple Limiter (Peak Envelope Tracking) - Filter/Effect/Audio/LADSPA - Simple Limiter (Peak Envelope Tracking) - CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse) - - - Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-limit-rms - Simple Limiter (RMS Envelope Tracking) - Filter/Effect/Audio/LADSPA - Simple Limiter (RMS Envelope Tracking) - CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse) - - - Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-lofi - Lo Fi - Filter/Effect/Audio/LADSPA - Lo Fi - CMT (http://www.ladspa.org/cmt, plugin by David A. Bartold) - - - In_-Left- - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - In_-Right- - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out_-Left- - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out_-Right- - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-logistic - Logistic Map Control Generator - Source/Audio/LADSPA - Logistic Map Control Generator - CMT (http://www.ladspa.org/cmt, plugin by Nathaniel Virgo) - - - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
ladspa-lowpass-iir Glame Lowpass Filter @@ -7740,66 +1890,12 @@ - - ladspa-lp4pole-faraia-oa - 4 Pole Low-Pass Filter with Resonance (FARAIA) - Filter/Effect/Audio/LADSPA - 4 Pole Low-Pass Filter with Resonance (FARAIA) - Mike Rawes <mike_rawes[at]yahoo.co.uk> - - - Cutoff_Frequency - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Resonance - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-lp4pole-fcrcia-oa - 4 Pole Low-Pass Filter with Resonance (FCRCIA) - Filter/Effect/Audio/LADSPA - 4 Pole Low-Pass Filter with Resonance (FCRCIA) - Mike Rawes <mike_rawes[at]yahoo.co.uk> - - - Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
ladspa-lpf - Low Pass Filter (One Pole) + Simple Low Pass Filter Filter/Effect/Audio/LADSPA - Low Pass Filter (One Pole) - CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse) + Simple Low Pass Filter + Richard Furse (LADSPA example plugins) Input @@ -7836,27 +1932,6 @@ - - ladspa-matched - matched (amp tone) - Filter/Effect/Audio/LADSPA - matched (amp tone) - Tim Goetze <tim@quitte.de> - - - in - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - out - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
ladspa-matrixMSSt Matrix: MS to Stereo @@ -7977,33 +2052,6 @@ - - ladspa-mixer - Mixer (Stereo to Mono) - Filter/Effect/Audio/LADSPA - Mixer (Stereo to Mono) - CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse) - - - Input_1 - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Input_2 - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
ladspa-modDelay Modulatable delay @@ -8052,69 +2100,6 @@ - - ladspa-mux-ar - Multiplexer (AR) - Filter/Effect/Audio/LADSPA - Multiplexer (AR) - Thorsten Wilms - - - Gate - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Off - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - On - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-mux-cr - Multiplexer (CR) - Sink/Analyzer/Audio/LADSPA - Multiplexer (CR) - Thorsten Wilms - - - Gate - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-noise-source-white - Noise Source (White) - Source/Audio/LADSPA - Noise Source (White) - CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse) - - - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
ladspa-noise-white White Noise Source @@ -8151,144 +2136,6 @@ - - ladspa-null-ai - Null (Audio Input) - Sink/Audio/LADSPA - Null (Audio Input) - CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse) - - - Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-null-ao - Null (Audio Output) - Source/Audio/LADSPA - Null (Audio Output) - CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse) - - - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-null-ci - Null (Control Input) - Source/Audio/LADSPA - Null (Control Input) - CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse) - - - - - ladspa-null-co - Null (Control Output) - Source/Audio/LADSPA - Null (Control Output) - CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse) - - - - - ladspa-organ - Organ - Source/Audio/LADSPA - Organ - CMT (http://www.ladspa.org/cmt, plugin by David A. Bartold) - - - Out - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-peak - Peak Monitor - Sink/Analyzer/Audio/LADSPA - Peak Monitor - CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse) - - - Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-phasemod - Phase Modulated Voice - Source/Audio/LADSPA - Phase Modulated Voice - CMT (http://www.ladspa.org/cmt, plugin by David A. Bartold) - - - Out - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-pink-full-frequency - Pink Noise (full frequency range) - Source/Audio/LADSPA - Pink Noise (full frequency range) - CMT (http://www.ladspa.org/cmt, plugin by Nathaniel Virgo) - - - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-pink-interpolated-audio - Pink Noise (Interpolated) - Source/Audio/LADSPA - Pink Noise (Interpolated) - CMT (http://www.ladspa.org/cmt, plugin by Nathaniel Virgo) - - - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-pink-sh - Pink Noise (sample and hold) - Source/Audio/LADSPA - Pink Noise (sample and hold) - CMT (http://www.ladspa.org/cmt, plugin by Nathaniel Virgo) - - - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
ladspa-pitchScale Pitch Scaler @@ -8379,495 +2226,6 @@ - - ladspa-power - Power (AR) - Filter/Effect/Audio/LADSPA - Power (AR) - Thorsten Wilms - - - Base - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Exponent - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Result - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-power-cr - Power (CR) - Source/Audio/LADSPA - Power (CR) - Thorsten Wilms - - - - - ladspa-preamp - valve preamplifier model - Filter/Effect/Audio/LADSPA - valve preamplifier model - Tim Goetze <tim@quitte.de> - - - in - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - out - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-prob-switch-ar - Probability Switch (AR Controls) - Filter/Effect/Audio/LADSPA - Probability Switch (AR Controls) - Loki Davison - - - Input_1 - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Input_2 - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Probability - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-prob-switch-cr - Probability Switch (CR Controls) - Filter/Effect/Audio/LADSPA - Probability Switch (CR Controls) - Loki Davison - - - Input_1 - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Input_2 - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-product-iaia-oa - Signal Product (IAIA) - Filter/Effect/Audio/LADSPA - Signal Product (IAIA) - Mike Rawes <mike_rawes[at]yahoo.co.uk> - - - First_Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Second_Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Product_Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-product-iaic-oa - Signal Product (IAIC) - Filter/Effect/Audio/LADSPA - Signal Product (IAIC) - Mike Rawes <mike_rawes[at]yahoo.co.uk> - - - First_Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Product_Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-product-icic-oc - Signal Product (ICIC) - Source/Audio/LADSPA - Signal Product (ICIC) - Mike Rawes <mike_rawes[at]yahoo.co.uk> - - - - - ladspa-pulse-fapa-oa - Bandlimited Variable Width Pulse Oscillator (FAPA) - Filter/Effect/Audio/LADSPA - Bandlimited Variable Width Pulse Oscillator (FAPA) - Mike Rawes <mike_rawes[at]yahoo.co.uk> - - - Frequency - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Pulse_Width - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-pulse-fapc-oa - Bandlimited Variable Width Pulse Oscillator (FAPC) - Filter/Effect/Audio/LADSPA - Bandlimited Variable Width Pulse Oscillator (FAPC) - Mike Rawes <mike_rawes[at]yahoo.co.uk> - - - Frequency - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-pulse-fcpa-oa - Bandlimited Variable Width Pulse Oscillator (FCPA) - Filter/Effect/Audio/LADSPA - Bandlimited Variable Width Pulse Oscillator (FCPA) - Mike Rawes <mike_rawes[at]yahoo.co.uk> - - - Pulse_Width - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-pulse-fcpc-oa - Bandlimited Variable Width Pulse Oscillator (FCPC) - Source/Audio/LADSPA - Bandlimited Variable Width Pulse Oscillator (FCPC) - Mike Rawes <mike_rawes[at]yahoo.co.uk> - - - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-quantiser100 - Quantiser (100 Steps) - Filter/Effect/Audio/LADSPA - Quantiser (100 Steps) - Mike Rawes <mike_rawes[at]yahoo.co.uk> - - - Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output_Changed - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Quantised_Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-quantiser20 - Quantiser (20 Steps) - Filter/Effect/Audio/LADSPA - Quantiser (20 Steps) - Mike Rawes <mike_rawes[at]yahoo.co.uk> - - - Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output_Changed - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Quantised_Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-quantiser50 - Quantiser (50 Steps) - Filter/Effect/Audio/LADSPA - Quantiser (50 Steps) - Mike Rawes <mike_rawes[at]yahoo.co.uk> - - - Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output_Changed - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Quantised_Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-random-fasa-oa - Random Wave Generator (FASA) - Filter/Effect/Audio/LADSPA - Random Wave Generator (FASA) - Mike Rawes <mike_rawes[at]yahoo.co.uk> - - - Frequency_-Hz- - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Wave_Smoothness - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-random-fasc-oa - Random Wave Generator (FASC) - Filter/Effect/Audio/LADSPA - Random Wave Generator (FASC) - Mike Rawes <mike_rawes[at]yahoo.co.uk> - - - Frequency_-Hz- - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-random-fcsa-oa - Random Wave Generator (FCSA) - Filter/Effect/Audio/LADSPA - Random Wave Generator (FCSA) - Mike Rawes <mike_rawes[at]yahoo.co.uk> - - - Wave_Smoothness - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-random-fcsc-oa - Random Wave Generator (FCSC) - Source/Audio/LADSPA - Random Wave Generator (FCSC) - Mike Rawes <mike_rawes[at]yahoo.co.uk> - - - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-range-trans-ar - Range Translator (AR Controls) - Filter/Effect/Audio/LADSPA - Range Translator (AR Controls) - Dave Robillard - - - Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Input_Max - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Input_Min - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output_Max - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output_Min - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-range-trans-cr - Range Translator (CR Controls) - Filter/Effect/Audio/LADSPA - Range Translator (CR Controls) - Dave Robillard - - - Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
ladspa-rateShifter Rate shifter @@ -8889,84 +2247,6 @@ - - ladspa-ratio-nada-oa - Signal Ratio (NADA) - Filter/Effect/Audio/LADSPA - Signal Ratio (NADA) - Mike Rawes <mike_rawes[at]yahoo.co.uk> - - - Denominator - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Numerator - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Ratio_Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-ratio-nadc-oa - Signal Ratio (NADC) - Filter/Effect/Audio/LADSPA - Signal Ratio (NADC) - Mike Rawes <mike_rawes[at]yahoo.co.uk> - - - Numerator - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Ratio_Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-ratio-ncda-oa - Signal Ratio (NCDA) - Filter/Effect/Audio/LADSPA - Signal Ratio (NCDA) - Mike Rawes <mike_rawes[at]yahoo.co.uk> - - - Denominator - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Ratio_Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-ratio-ncdc-oc - Signal Ratio (NCDC) - Source/Audio/LADSPA - Signal Ratio (NCDC) - Mike Rawes <mike_rawes[at]yahoo.co.uk> - - - ladspa-retroFlange Retro Flanger @@ -9057,75 +2337,6 @@ - - ladspa-rissetScales - Continuous Risset Scales - Source/Audio/LADSPA - Continuous Risset Scales - Nick Lamb <njl195@zepler.org.uk> - - - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-rubberband-pitchshifter-mono - Rubber Band Mono Pitch Shifter - Filter/Effect/Audio/LADSPA - Rubber Band Mono Pitch Shifter - Breakfast Quay - - - Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-rubberband-pitchshifter-stereo - Rubber Band Stereo Pitch Shifter - Filter/Effect/Audio/LADSPA - Rubber Band Stereo Pitch Shifter - Breakfast Quay - - - Input_L - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Input_R - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output_L - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output_R - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
ladspa-satanMaximiser Barry's Satan Maximiser @@ -9147,42 +2358,6 @@ - - ladspa-sawtooth-fa-oa - Bandlimited Sawtooth Oscillator (FA) - Filter/Effect/Audio/LADSPA - Bandlimited Sawtooth Oscillator (FA) - Mike Rawes <mike_rawes[at]yahoo.co.uk> - - - Frequency - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-sawtooth-fc-oa - Bandlimited Sawtooth Oscillator (FC) - Source/Audio/LADSPA - Bandlimited Sawtooth Oscillator (FC) - Mike Rawes <mike_rawes[at]yahoo.co.uk> - - - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
ladspa-sc1 SC1 @@ -9357,147 +2532,6 @@ - - ladspa-sequencer16 - Analogue Style 16 Step Sequencer - Filter/Effect/Audio/LADSPA - Analogue Style 16 Step Sequencer - Mike Rawes <mike_rawes[at]yahoo.co.uk> - - - Gate_-Open_>_0- - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Step_Trigger - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Value_Out - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-sequencer32 - Analogue Style 32 Step Sequencer - Filter/Effect/Audio/LADSPA - Analogue Style 32 Step Sequencer - Mike Rawes <mike_rawes[at]yahoo.co.uk> - - - Gate_-Open_>_0- - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Step_Trigger - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Value_Out - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-sequencer64 - Analogue Style 64 Step Sequencer - Filter/Effect/Audio/LADSPA - Analogue Style 64 Step Sequencer - Mike Rawes <mike_rawes[at]yahoo.co.uk> - - - Gate_-Open_>_0- - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Step_Trigger - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Value_Out - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-sh-ar - Sample and Hold (AR Threshold) - Filter/Effect/Audio/LADSPA - Sample and Hold (AR Threshold) - Thorsten Wilms - - - Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Threshold - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Trigger - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-sh-cr - Sample and Hold (CR Threshold) - Filter/Effect/Audio/LADSPA - Sample and Hold (CR Threshold) - Thorsten Wilms - - - Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Trigger - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
ladspa-shaper Wave shaper @@ -9540,54 +2574,6 @@ - - ladspa-signal-abs-ar - Signal Absolute value, negative or positive (AR Controls) - Filter/Effect/Audio/LADSPA - Signal Absolute value, negative or positive (AR Controls) - Loki Davison - - - Input_1 - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Sign - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-signal-abs-cr - Signal Absolute value, negative or positive (CR Controls) - Filter/Effect/Audio/LADSPA - Signal Absolute value, negative or positive (CR Controls) - Loki Davison - - - Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
ladspa-sinCos Sine + cosine oscillator @@ -9614,7 +2600,7 @@ Sine Oscillator (Freq:audio, Amp:audio) Filter/Effect/Audio/LADSPA Sine Oscillator (Freq:audio, Amp:audio) - CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse) + Richard Furse (LADSPA example plugins) Amplitude @@ -9623,7 +2609,7 @@
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
- Frequency + Frequency_-Hz- sink always
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
@@ -9641,10 +2627,10 @@ Sine Oscillator (Freq:audio, Amp:control) Filter/Effect/Audio/LADSPA Sine Oscillator (Freq:audio, Amp:control) - CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse) + Richard Furse (LADSPA example plugins) - Frequency + Frequency_-Hz- sink always
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
@@ -9662,7 +2648,7 @@ Sine Oscillator (Freq:control, Amp:audio) Filter/Effect/Audio/LADSPA Sine Oscillator (Freq:control, Amp:audio) - CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse) + Richard Furse (LADSPA example plugins) Amplitude @@ -9683,7 +2669,7 @@ Sine Oscillator (Freq:control, Amp:control) Source/Audio/LADSPA Sine Oscillator (Freq:control, Amp:control) - CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse) + Richard Furse (LADSPA example plugins) Output @@ -9735,141 +2721,6 @@
- - ladspa-sledgehammer - Dynamic Sledgehammer - Filter/Effect/Audio/LADSPA - Dynamic Sledgehammer - CMT (http://www.ladspa.org/cmt, plugin by Nathaniel Virgo) - - - Carrier - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Modulator - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-slew-limiter-ra - Slew limiter (RA) - Filter/Effect/Audio/LADSPA - Slew limiter (RA) - Lars Luthman <larsl@users.sourceforge.net> - - - Fall_rate_-1-s- - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Rise_rate_-1-s- - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-slew-limiter-rc - Slew limiter (RC) - Filter/Effect/Audio/LADSPA - Slew limiter (RC) - Lars Luthman <larsl@users.sourceforge.net> - - - Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-slide-ta - Slide (TA) - Filter/Effect/Audio/LADSPA - Slide (TA) - Lars Luthman <larsl@users.sourceforge.net> - - - Fall_time_-s- - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Rise_time_-s- - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-slide-tc - Slide (TC) - Filter/Effect/Audio/LADSPA - Slide (TC) - Lars Luthman <larsl@users.sourceforge.net> - - - Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
ladspa-smoothDecimate Smooth Decimator @@ -9918,63 +2769,6 @@ - - ladspa-square-fa-oa - Bandlimited Square Oscillator (FA) - Filter/Effect/Audio/LADSPA - Bandlimited Square Oscillator (FA) - Mike Rawes <mike_rawes[at]yahoo.co.uk> - - - Frequency - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-square-fc-oa - Bandlimited Square Oscillator (FC) - Source/Audio/LADSPA - Bandlimited Square Oscillator (FC) - Mike Rawes <mike_rawes[at]yahoo.co.uk> - - - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-ssm-masher - Masher - Filter/Effect/Audio/LADSPA - Masher - Dave Griffiths - - - Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
ladspa-stepMuxer Step Demuxer @@ -10044,84 +2838,6 @@ - - ladspa-sum-iaia-oa - Signal Sum (IAIA) - Filter/Effect/Audio/LADSPA - Signal Sum (IAIA) - Mike Rawes <mike_rawes[at]yahoo.co.uk> - - - First_Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Second_Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Summed_Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-sum-iaic-oa - Signal Sum (IAIC) - Filter/Effect/Audio/LADSPA - Signal Sum (IAIC) - Mike Rawes <mike_rawes[at]yahoo.co.uk> - - - First_Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Summed_Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-sum-icic-oc - Signal Sum (ICIC) - Source/Audio/LADSPA - Signal Sum (ICIC) - Mike Rawes <mike_rawes[at]yahoo.co.uk> - - - - - ladspa-super-60 - super 60 (amp tone) - Filter/Effect/Audio/LADSPA - super 60 (amp tone) - Tim Goetze <tim@quitte.de> - - - in - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - out - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
ladspa-surroundEncoder Surround matrix encoder @@ -10188,123 +2904,6 @@ - - ladspa-syncpulse-fapaga-oa - Clock Pulse Oscillator with Gate (FAPAGA) - Filter/Effect/Audio/LADSPA - Clock Pulse Oscillator with Gate (FAPAGA) - Mike Rawes <mike_rawes[at]yahoo.co.uk> - - - Frequency - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Gate - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Pulse_Width - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-syncpulse-fcpcga-oa - Clock Pulse Oscillator with Gate (FCPCGA) - Filter/Effect/Audio/LADSPA - Clock Pulse Oscillator with Gate (FCPCGA) - Mike Rawes <mike_rawes[at]yahoo.co.uk> - - - Gate - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-syncsquare-faga-oa - Clock Oscillator with Gate (FAGA) - Filter/Effect/Audio/LADSPA - Clock Oscillator with Gate (FAGA) - Mike Rawes <mike_rawes[at]yahoo.co.uk> - - - Frequency - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Gate - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-syncsquare-fcga-oa - Clock Oscillator with Gate (FCGA) - Filter/Effect/Audio/LADSPA - Clock Oscillator with Gate (FCGA) - Mike Rawes <mike_rawes[at]yahoo.co.uk> - - - Gate - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-syndrum - Syn Drum - Source/Audio/LADSPA - Syn Drum - CMT (http://www.ladspa.org/cmt, plugin by David A. Bartold) - - - Out - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
ladspa-tap-autopan TAP AutoPanner @@ -10809,144 +3408,6 @@ - - ladspa-track-max-peak - Envelope Tracker (Maximum Peak) - Sink/Analyzer/Audio/LADSPA - Envelope Tracker (Maximum Peak) - CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse) - - - Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-track-max-rms - Envelope Tracker (Maximum RMS) - Sink/Analyzer/Audio/LADSPA - Envelope Tracker (Maximum RMS) - CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse) - - - Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-track-peak - Envelope Tracker (Peak) - Sink/Analyzer/Audio/LADSPA - Envelope Tracker (Peak) - CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse) - - - Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-track-rms - Envelope Tracker (RMS) - Sink/Analyzer/Audio/LADSPA - Envelope Tracker (RMS) - CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse) - - - Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-tracker-gaaadaia-oa - Signal Tracker (Audio Rates) - Filter/Effect/Audio/LADSPA - Signal Tracker (Audio Rates) - Mike Rawes <mike_rawes[at]yahoo.co.uk> - - - Attack_Rate_-Hz-_when_Gate_High - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Attack_Rate_-Hz-_when_Gate_Low - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Decay_Rate_-Hz-_when_Gate_High - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Decay_Rate_-Hz-_when_Gate_Low - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Gate - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-tracker-gaacdcia-oa - Signal Tracker (Control Rates) - Filter/Effect/Audio/LADSPA - Signal Tracker (Control Rates) - Mike Rawes <mike_rawes[at]yahoo.co.uk> - - - Gate - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
ladspa-transient Transient mangler @@ -10968,111 +3429,6 @@ - - ladspa-triangle-fasa-oa - Bandlimited Variable Slope Triangle Oscillator (FASA) - Filter/Effect/Audio/LADSPA - Bandlimited Variable Slope Triangle Oscillator (FASA) - Mike Rawes <mike_rawes[at]yahoo.co.uk> - - - Frequency - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Slope - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-triangle-fasc-oa - Bandlimited Variable Slope Triangle Oscillator (FASC) - Filter/Effect/Audio/LADSPA - Bandlimited Variable Slope Triangle Oscillator (FASC) - Mike Rawes <mike_rawes[at]yahoo.co.uk> - - - Frequency - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-triangle-fcsa-oa - Bandlimited Variable Slope Triangle Oscillator (FCSA) - Filter/Effect/Audio/LADSPA - Bandlimited Variable Slope Triangle Oscillator (FCSA) - Mike Rawes <mike_rawes[at]yahoo.co.uk> - - - Slope - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-triangle-fcsc-oa - Bandlimited Variable Slope Triangle Oscillator (FCSC) - Source/Audio/LADSPA - Bandlimited Variable Slope Triangle Oscillator (FCSC) - Mike Rawes <mike_rawes[at]yahoo.co.uk> - - - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-trigger - Trigger - Filter/Effect/Audio/LADSPA - Trigger - Thorsten Edelhaeusser - - - Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
ladspa-triplePara Triple band parametric with shelves @@ -11094,27 +3450,6 @@ - - ladspa-unmatched - unmatched (Amp Tone) - Filter/Effect/Audio/LADSPA - unmatched (Amp Tone) - Tim Goetze <tim@quitte.de> - - - in - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - out - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
ladspa-valve Valve saturation @@ -11157,423 +3492,6 @@ - - ladspa-vcf-bp1 - Bandpass Filter I - Filter/Effect/Audio/LADSPA - Bandpass Filter I - LADSPA code by Matthias Nagorni, Filter formula by Robert Bristow-Johnson - - - Frequency_Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Resonance - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-vcf-bp2 - Bandpass Filter II - Filter/Effect/Audio/LADSPA - Bandpass Filter II - LADSPA code by Matthias Nagorni, Filter formula by Robert Bristow-Johnson - - - Frequency_Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Resonance - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-vcf-hp - Highpass Filter - Filter/Effect/Audio/LADSPA - Highpass Filter - LADSPA code by Matthias Nagorni, Filter formula by Robert Bristow-Johnson - - - Frequency_Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Resonance - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-vcf-hshelf - High Shelf Filter - Filter/Effect/Audio/LADSPA - High Shelf Filter - LADSPA code by Matthias Nagorni, Filter formula by Robert Bristow-Johnson - - - Frequency_Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Resonance - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - dBgain_Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-vcf-lp - Lowpass Filter - Filter/Effect/Audio/LADSPA - Lowpass Filter - LADSPA code by Matthias Nagorni, Filter formula by Robert Bristow-Johnson - - - Frequency_Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Resonance - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-vcf-lshelf - Low Shelf Filter - Filter/Effect/Audio/LADSPA - Low Shelf Filter - LADSPA code by Matthias Nagorni, Filter formula by Robert Bristow-Johnson - - - Frequency_Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Resonance - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - dBgain_Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-vcf-notch - Notch Filter - Filter/Effect/Audio/LADSPA - Notch Filter - LADSPA code by Matthias Nagorni, Filter formula by Robert Bristow-Johnson - - - Frequency_Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Resonance - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-vcf-peakeq - Peaking EQ Filter - Filter/Effect/Audio/LADSPA - Peaking EQ Filter - LADSPA code by Matthias Nagorni, Filter formula by Robert Bristow-Johnson - - - Frequency_Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Resonance - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - dBgain_Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-vcf-reslp - Resonant Lowpass Filter - Filter/Effect/Audio/LADSPA - Resonant Lowpass Filter - LADSPA code by Matthias Nagorni, Filter formula by Paul Kellett - - - Frequency_Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Resonance - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-vcf303 - VCF 303 - Filter/Effect/Audio/LADSPA - VCF 303 - CMT (http://www.ladspa.org/cmt, plugin by David A. Bartold) - - - In - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Out - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-vlevel-mono - VLevel (Mono) - Filter/Effect/Audio/LADSPA - VLevel (Mono) - Tom Felker - - - Input_1 - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output_1 - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-vlevel-stereo - VLevel (Stereo) - Filter/Effect/Audio/LADSPA - VLevel (Stereo) - Tom Felker - - - Input_1 - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Input_2 - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output_1 - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output_2 - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-vocoder - Vocoder - Filter/Effect/Audio/LADSPA - Vocoder - Achim Settelmeier (adapted to LADSPA by Josh Green) - - - Carrier - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Formant - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
ladspa-vynil VyNil (Vinyl Effect) @@ -11634,54 +3552,6 @@ - - ladspa-wg-mesh-cr - Simple waveguide mesh (CR Controls) - Filter/Effect/Audio/LADSPA - Simple waveguide mesh (CR Controls) - Loki Davison - - - Power - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Trigger - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
- - ladspa-wshape-sine - Wave Shaper (Sine-Based) - Filter/Effect/Audio/LADSPA - Wave Shaper (Sine-Based) - CMT (http://www.ladspa.org/cmt, plugin by Richard W.E. Furse) - - - Input - sink - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
- - Output - source - always -
audio/x-raw-float, endianness=(int)1234, width=(int)32, channels=(int)1, rate=(int)[ 1, 2147483647 ]
-
-
-
ladspa-xfade Crossfade diff --git a/docs/plugins/inspect/plugin-legacyresample.xml b/docs/plugins/inspect/plugin-legacyresample.xml index c098220643..77451a30b3 100644 --- a/docs/plugins/inspect/plugin-legacyresample.xml +++ b/docs/plugins/inspect/plugin-legacyresample.xml @@ -3,7 +3,7 @@ Resamples audio ../../gst/legacyresample/.libs/libgstlegacyresample.so libgstlegacyresample.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins git diff --git a/docs/plugins/inspect/plugin-linsys.xml b/docs/plugins/inspect/plugin-linsys.xml index de4598dcdc..d46bd381c9 100644 --- a/docs/plugins/inspect/plugin-linsys.xml +++ b/docs/plugins/inspect/plugin-linsys.xml @@ -3,7 +3,7 @@ FIXME ../../sys/linsys/.libs/libgstlinsys.so libgstlinsys.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins diff --git a/docs/plugins/inspect/plugin-liveadder.xml b/docs/plugins/inspect/plugin-liveadder.xml index 169589bc5d..aa3264a8ff 100644 --- a/docs/plugins/inspect/plugin-liveadder.xml +++ b/docs/plugins/inspect/plugin-liveadder.xml @@ -3,7 +3,7 @@ Adds multiple live discontinuous streams ../../gst/liveadder/.libs/libgstliveadder.so libgstliveadder.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins git diff --git a/docs/plugins/inspect/plugin-mimic.xml b/docs/plugins/inspect/plugin-mimic.xml index 4b23cbfd45..b44b5adca9 100644 --- a/docs/plugins/inspect/plugin-mimic.xml +++ b/docs/plugins/inspect/plugin-mimic.xml @@ -3,7 +3,7 @@ Mimic codec ../../ext/mimic/.libs/libgstmimic.so libgstmimic.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins git diff --git a/docs/plugins/inspect/plugin-mms.xml b/docs/plugins/inspect/plugin-mms.xml index fc57de6c7b..9c7a89ef65 100644 --- a/docs/plugins/inspect/plugin-mms.xml +++ b/docs/plugins/inspect/plugin-mms.xml @@ -3,7 +3,7 @@ Microsoft Multi Media Server streaming protocol support ../../ext/libmms/.libs/libgstmms.so libgstmms.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins git diff --git a/docs/plugins/inspect/plugin-modplug.xml b/docs/plugins/inspect/plugin-modplug.xml index 637390beca..f32d61ae50 100644 --- a/docs/plugins/inspect/plugin-modplug.xml +++ b/docs/plugins/inspect/plugin-modplug.xml @@ -3,7 +3,7 @@ .MOD audio decoding ../../ext/modplug/.libs/libgstmodplug.so libgstmodplug.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins git diff --git a/docs/plugins/inspect/plugin-mpeg2enc.xml b/docs/plugins/inspect/plugin-mpeg2enc.xml index fb4f7dc02c..be6ccf5bdd 100644 --- a/docs/plugins/inspect/plugin-mpeg2enc.xml +++ b/docs/plugins/inspect/plugin-mpeg2enc.xml @@ -3,7 +3,7 @@ High-quality MPEG-1/2 video encoder ../../ext/mpeg2enc/.libs/libgstmpeg2enc.so libgstmpeg2enc.so - 0.10.22.1 + 0.10.23.1 GPL gst-plugins-bad GStreamer Bad Plug-ins git diff --git a/docs/plugins/inspect/plugin-mpegdemux2.xml b/docs/plugins/inspect/plugin-mpegdemux2.xml index 40b0119aa0..06d4d5ac69 100644 --- a/docs/plugins/inspect/plugin-mpegdemux2.xml +++ b/docs/plugins/inspect/plugin-mpegdemux2.xml @@ -3,7 +3,7 @@ MPEG demuxers ../../gst/mpegdemux/.libs/libgstmpegdemux.so libgstmpegdemux.so - 0.10.22.1 + 0.10.23.1 unknown gst-plugins-bad GStreamer Bad Plug-ins git @@ -26,7 +26,7 @@ audio_%02x source sometimes -
audio/mpeg, mpegversion=(int){ 1, 4 }; audio/x-private1-lpcm; audio/x-private1-ac3; audio/x-private1-dts; audio/ac3
+
audio/mpeg, mpegversion=(int)1; audio/mpeg, mpegversion=(int)4, stream-format=(string){ adts, loas }; audio/x-private1-lpcm; audio/x-private1-ac3; audio/x-private1-dts; audio/ac3
private_%d @@ -65,7 +65,7 @@ audio_%04x source sometimes -
audio/mpeg, mpegversion=(int){ 1, 4 }; audio/x-lpcm, width=(int){ 16, 20, 24 }, rate=(int){ 48000, 96000 }, channels=(int)[ 1, 8 ], dynamic_range=(int)[ 0, 255 ], emphasis=(boolean){ false, true }, mute=(boolean){ false, true }; audio/x-ac3; audio/x-eac3; audio/x-dts; audio/x-private-ts-lpcm
+
audio/mpeg, mpegversion=(int)1; audio/mpeg, mpegversion=(int)4, stream-format=(string){ adts, loas }; audio/x-lpcm, width=(int){ 16, 20, 24 }, rate=(int){ 48000, 96000 }, channels=(int)[ 1, 8 ], dynamic_range=(int)[ 0, 255 ], emphasis=(boolean){ false, true }, mute=(boolean){ false, true }; audio/x-ac3; audio/x-eac3; audio/x-dts; audio/x-private-ts-lpcm
private_%04x diff --git a/docs/plugins/inspect/plugin-mpegpsmux.xml b/docs/plugins/inspect/plugin-mpegpsmux.xml index b9b38d3bab..47ff527b88 100644 --- a/docs/plugins/inspect/plugin-mpegpsmux.xml +++ b/docs/plugins/inspect/plugin-mpegpsmux.xml @@ -3,7 +3,7 @@ MPEG-PS muxer ../../gst/mpegpsmux/.libs/libgstmpegpsmux.so libgstmpegpsmux.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins git @@ -20,7 +20,7 @@ sink_%d sink request -
video/mpeg, mpegversion=(int){ 1, 2, 4 }, systemstream=(boolean)false; video/x-dirac; video/x-h264; audio/mpeg, mpegversion=(int){ 1, 2, 4 }; audio/x-lpcm, width=(int){ 16, 20, 24 }, rate=(int){ 48000, 96000 }, channels=(int)[ 1, 8 ], dynamic_range=(int)[ 0, 255 ], emphasis=(boolean){ false, true }, mute=(boolean){ false, true }
+
video/mpeg, mpegversion=(int){ 1, 2, 4 }, systemstream=(boolean)false; video/x-dirac; video/x-h264; audio/mpeg, mpegversion=(int){ 1, 2 }; audio/mpeg, mpegversion=(int)4, stream-format=(string){ raw, adts }; audio/x-lpcm, width=(int){ 16, 20, 24 }, rate=(int){ 48000, 96000 }, channels=(int)[ 1, 8 ], dynamic_range=(int)[ 0, 255 ], emphasis=(boolean){ false, true }, mute=(boolean){ false, true }
src diff --git a/docs/plugins/inspect/plugin-mpegtsdemux.xml b/docs/plugins/inspect/plugin-mpegtsdemux.xml index f9b860c701..b6c95d63da 100644 --- a/docs/plugins/inspect/plugin-mpegtsdemux.xml +++ b/docs/plugins/inspect/plugin-mpegtsdemux.xml @@ -3,7 +3,7 @@ MPEG TS demuxer ../../gst/mpegtsdemux/.libs/libgstmpegtsdemux.so libgstmpegtsdemux.so - 0.10.22.1 + 0.10.23.1 unknown gst-plugins-bad GStreamer Bad Plug-ins git @@ -27,7 +27,7 @@ Edward Hervey <edward.hervey@collabora.co.uk> audio_%04x source sometimes -
audio/mpeg, mpegversion=(int){ 1, 4 }; audio/x-lpcm, width=(int){ 16, 20, 24 }, rate=(int){ 48000, 96000 }, channels=(int)[ 1, 8 ], dynamic_range=(int)[ 0, 255 ], emphasis=(boolean){ false, true }, mute=(boolean){ false, true }; audio/x-ac3; audio/x-eac3; audio/x-dts; audio/x-private-ts-lpcm
+
audio/mpeg, mpegversion=(int)1; audio/mpeg, mpegversion=(int)4, stream-format=(string){ adts, loas }; audio/x-lpcm, width=(int){ 16, 20, 24 }, rate=(int){ 48000, 96000 }, channels=(int)[ 1, 8 ], dynamic_range=(int)[ 0, 255 ], emphasis=(boolean){ false, true }, mute=(boolean){ false, true }; audio/x-ac3; audio/x-eac3; audio/x-dts; audio/x-private-ts-lpcm
private_%04x diff --git a/docs/plugins/inspect/plugin-mpegtsmux.xml b/docs/plugins/inspect/plugin-mpegtsmux.xml index 9132feb080..303bd9bd3e 100644 --- a/docs/plugins/inspect/plugin-mpegtsmux.xml +++ b/docs/plugins/inspect/plugin-mpegtsmux.xml @@ -3,7 +3,7 @@ MPEG-TS muxer ../../gst/mpegtsmux/.libs/libgstmpegtsmux.so libgstmpegtsmux.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins git @@ -20,7 +20,7 @@ sink_%d sink request -
video/mpeg, mpegversion=(int){ 1, 2, 4 }, systemstream=(boolean)false; video/x-dirac; video/x-h264, stream-format=(string)byte-stream; audio/mpeg, mpegversion=(int){ 1, 2, 4 }; audio/x-lpcm, width=(int){ 16, 20, 24 }, rate=(int){ 48000, 96000 }, channels=(int)[ 1, 8 ], dynamic_range=(int)[ 0, 255 ], emphasis=(boolean){ false, true }, mute=(boolean){ false, true }; audio/x-ac3; audio/x-dts
+
video/mpeg, mpegversion=(int){ 1, 2, 4 }, systemstream=(boolean)false; video/x-dirac; video/x-h264, stream-format=(string)byte-stream; audio/mpeg, mpegversion=(int){ 1, 2 }; audio/mpeg, mpegversion=(int)4, stream-format=(string){ raw, adts }; audio/x-lpcm, width=(int){ 16, 20, 24 }, rate=(int){ 48000, 96000 }, channels=(int)[ 1, 8 ], dynamic_range=(int)[ 0, 255 ], emphasis=(boolean){ false, true }, mute=(boolean){ false, true }; audio/x-ac3; audio/x-dts
src diff --git a/docs/plugins/inspect/plugin-mpegvideoparse.xml b/docs/plugins/inspect/plugin-mpegvideoparse.xml index 7166f3c0d4..873316b22a 100644 --- a/docs/plugins/inspect/plugin-mpegvideoparse.xml +++ b/docs/plugins/inspect/plugin-mpegvideoparse.xml @@ -3,7 +3,7 @@ MPEG-1 and MPEG-2 video parser ../../gst/mpegvideoparse/.libs/libgstmpegvideoparse.so libgstmpegvideoparse.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins git diff --git a/docs/plugins/inspect/plugin-mplex.xml b/docs/plugins/inspect/plugin-mplex.xml index 1979969e87..a961843496 100644 --- a/docs/plugins/inspect/plugin-mplex.xml +++ b/docs/plugins/inspect/plugin-mplex.xml @@ -3,7 +3,7 @@ High-quality MPEG/DVD/SVCD/VCD video/audio multiplexer ../../ext/mplex/.libs/libgstmplex.so libgstmplex.so - 0.10.21.1 + 0.10.23.1 GPL gst-plugins-bad GStreamer Bad Plug-ins git @@ -16,7 +16,7 @@ High-quality MPEG/DVD/SVCD/VCD video/audio multiplexer Andrew Stevens <andrew.stevens@nexgo.de> Ronald Bultje <rbultje@ronald.bitfreak.net> -Mark Nauwelaerts <mnauw@users.sourceforge.net +Mark Nauwelaerts <mnauw@users.sourceforge.net> audio_%d diff --git a/docs/plugins/inspect/plugin-musepack.xml b/docs/plugins/inspect/plugin-musepack.xml index 63b1652288..7d05a48fee 100644 --- a/docs/plugins/inspect/plugin-musepack.xml +++ b/docs/plugins/inspect/plugin-musepack.xml @@ -3,7 +3,7 @@ Musepack decoder ../../ext/musepack/.libs/libgstmusepack.so libgstmusepack.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins git @@ -20,7 +20,7 @@ sink sink always -
audio/x-musepack, streamversion=(int)7
+
audio/x-musepack, streamversion=(int){ 7, 8 }
src diff --git a/docs/plugins/inspect/plugin-musicbrainz.xml b/docs/plugins/inspect/plugin-musicbrainz.xml index b783131a34..1a5fc0500c 100644 --- a/docs/plugins/inspect/plugin-musicbrainz.xml +++ b/docs/plugins/inspect/plugin-musicbrainz.xml @@ -3,7 +3,7 @@ A TRM signature producer based on libmusicbrainz ../../ext/musicbrainz/.libs/libgsttrm.so libgsttrm.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins git diff --git a/docs/plugins/inspect/plugin-mve.xml b/docs/plugins/inspect/plugin-mve.xml index f4cdd70929..74fcea734b 100644 --- a/docs/plugins/inspect/plugin-mve.xml +++ b/docs/plugins/inspect/plugin-mve.xml @@ -3,7 +3,7 @@ Interplay MVE movie format manipulation ../../gst/mve/.libs/libgstmve.so libgstmve.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins git diff --git a/docs/plugins/inspect/plugin-mxf.xml b/docs/plugins/inspect/plugin-mxf.xml index 62825ec4ae..4394d08c54 100644 --- a/docs/plugins/inspect/plugin-mxf.xml +++ b/docs/plugins/inspect/plugin-mxf.xml @@ -3,7 +3,7 @@ MXF plugin library ../../gst/mxf/.libs/libgstmxf.so libgstmxf.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins git diff --git a/docs/plugins/inspect/plugin-mythtv.xml b/docs/plugins/inspect/plugin-mythtv.xml index ffc8eb7aa6..231c9dc90f 100644 --- a/docs/plugins/inspect/plugin-mythtv.xml +++ b/docs/plugins/inspect/plugin-mythtv.xml @@ -3,7 +3,7 @@ lib MythTV src ../../ext/mythtv/.libs/libgstmythtvsrc.so libgstmythtvsrc.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins git diff --git a/docs/plugins/inspect/plugin-neon.xml b/docs/plugins/inspect/plugin-neon.xml index 33fa934a83..12c4c7e654 100644 --- a/docs/plugins/inspect/plugin-neon.xml +++ b/docs/plugins/inspect/plugin-neon.xml @@ -3,7 +3,7 @@ lib neon http client src ../../ext/neon/.libs/libgstneonhttpsrc.so libgstneonhttpsrc.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins git diff --git a/docs/plugins/inspect/plugin-nsf.xml b/docs/plugins/inspect/plugin-nsf.xml index 5f9cfe8ff3..7554379b35 100644 --- a/docs/plugins/inspect/plugin-nsf.xml +++ b/docs/plugins/inspect/plugin-nsf.xml @@ -3,7 +3,7 @@ Uses nosefart to decode .nsf files ../../gst/nsf/.libs/libgstnsf.so libgstnsf.so - 0.10.22.1 + 0.10.23.1 GPL gst-plugins-bad GStreamer Bad Plug-ins git diff --git a/docs/plugins/inspect/plugin-nuvdemux.xml b/docs/plugins/inspect/plugin-nuvdemux.xml index 9d3d67f4ee..0d4e316ab1 100644 --- a/docs/plugins/inspect/plugin-nuvdemux.xml +++ b/docs/plugins/inspect/plugin-nuvdemux.xml @@ -3,7 +3,7 @@ Demuxes MythTV NuppelVideo files ../../gst/nuvdemux/.libs/libgstnuvdemux.so libgstnuvdemux.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins git diff --git a/docs/plugins/inspect/plugin-ofa.xml b/docs/plugins/inspect/plugin-ofa.xml index 2a5c80779d..73f348df99 100644 --- a/docs/plugins/inspect/plugin-ofa.xml +++ b/docs/plugins/inspect/plugin-ofa.xml @@ -3,7 +3,7 @@ Calculate MusicIP fingerprint from audio files ../../ext/ofa/.libs/libgstofa.so libgstofa.so - 0.10.22.1 + 0.10.23.1 GPL gst-plugins-bad GStreamer Bad Plug-ins git diff --git a/docs/plugins/inspect/plugin-patchdetect.xml b/docs/plugins/inspect/plugin-patchdetect.xml index b9efcfadda..5631d48770 100644 --- a/docs/plugins/inspect/plugin-patchdetect.xml +++ b/docs/plugins/inspect/plugin-patchdetect.xml @@ -3,7 +3,7 @@ patchdetect element ../../gst/patchdetect/.libs/libgstpatchdetect.so libgstpatchdetect.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins diff --git a/docs/plugins/inspect/plugin-pcapparse.xml b/docs/plugins/inspect/plugin-pcapparse.xml index 29d2bc3372..1818c62171 100644 --- a/docs/plugins/inspect/plugin-pcapparse.xml +++ b/docs/plugins/inspect/plugin-pcapparse.xml @@ -3,12 +3,33 @@ Element parsing raw pcap streams ../../gst/pcapparse/.libs/libgstpcapparse.so libgstpcapparse.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer http://gstreamer.net/ + + irtspparse + IRTSPParse + Raw/Parser + Parses a raw interleaved RTSP stream + Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> + + + sink + sink + always +
ANY
+
+ + src + source + always +
application/x-rtp; application/x-rtcp
+
+
+
pcapparse PCapParse diff --git a/docs/plugins/inspect/plugin-pnm.xml b/docs/plugins/inspect/plugin-pnm.xml index 25678072ec..e6301472de 100644 --- a/docs/plugins/inspect/plugin-pnm.xml +++ b/docs/plugins/inspect/plugin-pnm.xml @@ -3,7 +3,7 @@ PNM plugin ../../gst/pnm/.libs/libgstpnm.so libgstpnm.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins git diff --git a/docs/plugins/inspect/plugin-rawparse.xml b/docs/plugins/inspect/plugin-rawparse.xml index aa943cf463..624899433b 100644 --- a/docs/plugins/inspect/plugin-rawparse.xml +++ b/docs/plugins/inspect/plugin-rawparse.xml @@ -3,7 +3,7 @@ Parses byte streams into raw frames ../../gst/rawparse/.libs/libgstrawparse.so libgstrawparse.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins git diff --git a/docs/plugins/inspect/plugin-real.xml b/docs/plugins/inspect/plugin-real.xml index 280285269a..3806dc3bae 100644 --- a/docs/plugins/inspect/plugin-real.xml +++ b/docs/plugins/inspect/plugin-real.xml @@ -3,7 +3,7 @@ Decode REAL streams ../../gst/real/.libs/libgstreal.so libgstreal.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins git diff --git a/docs/plugins/inspect/plugin-removesilence.xml b/docs/plugins/inspect/plugin-removesilence.xml new file mode 100644 index 0000000000..00e3bce404 --- /dev/null +++ b/docs/plugins/inspect/plugin-removesilence.xml @@ -0,0 +1,35 @@ + + removesilence + Removes silence from an audio stream + ../../gst/removesilence/.libs/libgstremovesilence.so + libgstremovesilence.so + 0.10.23.1 + LGPL + gst-plugins-bad + GStreamer Bad Plug-ins git + Unknown package origin + + + removesilence + RemoveSilence + Filter/Effect/Audio + Removes all the silence periods from the audio stream. + Tiago Katcipis <tiagokatcipis@gmail.com> + Paulo Pizarro <paulo.pizarro@gmail.com> + + + sink + sink + always +
audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234, width=(int)16, depth=(int)16, signed=(boolean)true
+
+ + src + source + always +
audio/x-raw-int, rate=(int)[ 1, 2147483647 ], channels=(int)1, endianness=(int)1234, width=(int)16, depth=(int)16, signed=(boolean)true
+
+
+
+
+
\ No newline at end of file diff --git a/docs/plugins/inspect/plugin-resindvd.xml b/docs/plugins/inspect/plugin-resindvd.xml index bda861cefa..61848db366 100644 --- a/docs/plugins/inspect/plugin-resindvd.xml +++ b/docs/plugins/inspect/plugin-resindvd.xml @@ -3,7 +3,7 @@ Resin DVD playback elements ../../ext/resindvd/.libs/libresindvd.so libresindvd.so - 0.10.22.1 + 0.10.23.1 GPL gst-plugins-bad GStreamer diff --git a/docs/plugins/inspect/plugin-rfbsrc.xml b/docs/plugins/inspect/plugin-rfbsrc.xml index fe5aba0c45..97b501acc4 100644 --- a/docs/plugins/inspect/plugin-rfbsrc.xml +++ b/docs/plugins/inspect/plugin-rfbsrc.xml @@ -3,7 +3,7 @@ Connects to a VNC server and decodes RFB stream ../../gst/librfb/.libs/libgstrfbsrc.so libgstrfbsrc.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins git diff --git a/docs/plugins/inspect/plugin-rsvg.xml b/docs/plugins/inspect/plugin-rsvg.xml index 4b0c0d0f8d..94c31f3a2c 100644 --- a/docs/plugins/inspect/plugin-rsvg.xml +++ b/docs/plugins/inspect/plugin-rsvg.xml @@ -3,7 +3,7 @@ RSVG plugin library ../../ext/rsvg/.libs/libgstrsvg.so libgstrsvg.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins git diff --git a/docs/plugins/inspect/plugin-rtmp.xml b/docs/plugins/inspect/plugin-rtmp.xml index 7d9ae4fdc9..446cc4cec7 100644 --- a/docs/plugins/inspect/plugin-rtmp.xml +++ b/docs/plugins/inspect/plugin-rtmp.xml @@ -3,7 +3,7 @@ RTMP source and sink ../../ext/rtmp/.libs/libgstrtmp.so libgstrtmp.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins git diff --git a/docs/plugins/inspect/plugin-rtpmux.xml b/docs/plugins/inspect/plugin-rtpmux.xml index 5197e06679..c4fe730f23 100644 --- a/docs/plugins/inspect/plugin-rtpmux.xml +++ b/docs/plugins/inspect/plugin-rtpmux.xml @@ -3,7 +3,7 @@ RTP Muxer plugins ../../gst/rtpmux/.libs/libgstrtpmux.so libgstrtpmux.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins git diff --git a/docs/plugins/inspect/plugin-rtpvp8.xml b/docs/plugins/inspect/plugin-rtpvp8.xml index e86fbab2d3..52a7545cd4 100644 --- a/docs/plugins/inspect/plugin-rtpvp8.xml +++ b/docs/plugins/inspect/plugin-rtpvp8.xml @@ -3,7 +3,7 @@ rtpvp8 ../../gst/rtpvp8/.libs/libgstrtpvp8.so libgstrtpvp8.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins git @@ -20,7 +20,7 @@ sink sink always -
application/x-rtp, payload=(int)[ 96, 127 ], clock-rate=(int)90000, media=(string)video, encoding-name=(string)VP8-DRAFT-0-3-2
+
application/x-rtp, payload=(int)[ 96, 127 ], clock-rate=(int)90000, media=(string)video, encoding-name=(string)VP8-DRAFT-IETF-01
src @@ -47,7 +47,7 @@ src source always -
application/x-rtp, payload=(int)[ 96, 127 ], clock-rate=(int)90000, encoding-name=(string)VP8-DRAFT-0-3-2
+
application/x-rtp, payload=(int)[ 96, 127 ], clock-rate=(int)90000, encoding-name=(string)VP8-DRAFT-IETF-01
diff --git a/docs/plugins/inspect/plugin-scaletempo.xml b/docs/plugins/inspect/plugin-scaletempo.xml index 4e23f80b0d..cbecfc849b 100644 --- a/docs/plugins/inspect/plugin-scaletempo.xml +++ b/docs/plugins/inspect/plugin-scaletempo.xml @@ -3,7 +3,7 @@ Scale audio tempo in sync with playback rate ../../gst/scaletempo/.libs/libgstscaletempoplugin.so libgstscaletempoplugin.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer diff --git a/docs/plugins/inspect/plugin-schro.xml b/docs/plugins/inspect/plugin-schro.xml index 0aa6248d01..9112897b60 100644 --- a/docs/plugins/inspect/plugin-schro.xml +++ b/docs/plugins/inspect/plugin-schro.xml @@ -3,7 +3,7 @@ Schroedinger plugin ../../ext/schroedinger/.libs/libgstschro.so libgstschro.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins git @@ -26,7 +26,7 @@ src source always -
video/x-raw-yuv, format=(fourcc){ I420, YUY2, AYUV }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
video/x-raw-yuv, format=(fourcc){ I420, YV12, YUY2, UYVY, AYUV, Y42B, Y444, v216, v210, AY64 }, 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 ]
@@ -41,7 +41,7 @@ sink sink always -
video/x-raw-yuv, format=(fourcc){ I420, YV12, YUY2, UYVY, AYUV }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
video/x-raw-yuv, format=(fourcc){ I420, YV12, YUY2, UYVY, AYUV, Y42B, Y444, v216, v210, AY64 }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
src diff --git a/docs/plugins/inspect/plugin-sdi.xml b/docs/plugins/inspect/plugin-sdi.xml index 36b1d3ed79..43e8d6b398 100644 --- a/docs/plugins/inspect/plugin-sdi.xml +++ b/docs/plugins/inspect/plugin-sdi.xml @@ -3,7 +3,7 @@ SDI elements ../../gst/sdi/.libs/libgstsdi.so libgstsdi.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins diff --git a/docs/plugins/inspect/plugin-sdp.xml b/docs/plugins/inspect/plugin-sdp.xml index 3cd1321af0..4b2b42a8ee 100644 --- a/docs/plugins/inspect/plugin-sdp.xml +++ b/docs/plugins/inspect/plugin-sdp.xml @@ -3,7 +3,7 @@ configure streaming sessions using SDP ../../gst/sdp/.libs/libgstsdpelem.so libgstsdpelem.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins git diff --git a/docs/plugins/inspect/plugin-segmentclip.xml b/docs/plugins/inspect/plugin-segmentclip.xml index 95dd0013ed..1af2ccb326 100644 --- a/docs/plugins/inspect/plugin-segmentclip.xml +++ b/docs/plugins/inspect/plugin-segmentclip.xml @@ -3,7 +3,7 @@ Segment clip elements ../../gst/segmentclip/.libs/libgstsegmentclip.so libgstsegmentclip.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins git diff --git a/docs/plugins/inspect/plugin-shm.xml b/docs/plugins/inspect/plugin-shm.xml index 364a0cece1..6e83daaf5b 100644 --- a/docs/plugins/inspect/plugin-shm.xml +++ b/docs/plugins/inspect/plugin-shm.xml @@ -3,7 +3,7 @@ shared memory sink source ../../sys/shm/.libs/libgstshm.so libgstshm.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins git diff --git a/docs/plugins/inspect/plugin-smooth.xml b/docs/plugins/inspect/plugin-smooth.xml new file mode 100644 index 0000000000..85dcdb2838 --- /dev/null +++ b/docs/plugins/inspect/plugin-smooth.xml @@ -0,0 +1,34 @@ + + smooth + Apply a smooth filter to an image + ../../gst/smooth/.libs/libgstsmooth.so + libgstsmooth.so + 0.10.23.1 + LGPL + gst-plugins-bad + GStreamer Bad Plug-ins git + Unknown package origin + + + smooth + Smooth effect + Filter/Effect/Video + Apply a smooth filter to an image + 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 ]
+
+ + src + source + always +
video/x-raw-yuv, format=(fourcc)I420, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
+
+
+
+
\ No newline at end of file diff --git a/docs/plugins/inspect/plugin-sndfile.xml b/docs/plugins/inspect/plugin-sndfile.xml index 1b08aad05c..10d060740d 100644 --- a/docs/plugins/inspect/plugin-sndfile.xml +++ b/docs/plugins/inspect/plugin-sndfile.xml @@ -3,7 +3,7 @@ use libsndfile to read and write audio from and to files ../../ext/sndfile/.libs/libgstsndfile.so libgstsndfile.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins git diff --git a/docs/plugins/inspect/plugin-soundtouch.xml b/docs/plugins/inspect/plugin-soundtouch.xml index 17797310d2..626347ff39 100644 --- a/docs/plugins/inspect/plugin-soundtouch.xml +++ b/docs/plugins/inspect/plugin-soundtouch.xml @@ -3,7 +3,7 @@ Audio Pitch Controller & BPM Detection ../../ext/soundtouch/.libs/libgstsoundtouch.so libgstsoundtouch.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins git diff --git a/docs/plugins/inspect/plugin-speed.xml b/docs/plugins/inspect/plugin-speed.xml index 1408eebcc5..502b5e459a 100644 --- a/docs/plugins/inspect/plugin-speed.xml +++ b/docs/plugins/inspect/plugin-speed.xml @@ -3,7 +3,7 @@ Set speed/pitch on audio/raw streams (resampler) ../../gst/speed/.libs/libgstspeed.so libgstspeed.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins git diff --git a/docs/plugins/inspect/plugin-stereo.xml b/docs/plugins/inspect/plugin-stereo.xml index 89fd60d6ee..cf2a342e63 100644 --- a/docs/plugins/inspect/plugin-stereo.xml +++ b/docs/plugins/inspect/plugin-stereo.xml @@ -3,7 +3,7 @@ Muck with the stereo signal, enhance it's 'stereo-ness' ../../gst/stereo/.libs/libgststereo.so libgststereo.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins git diff --git a/docs/plugins/inspect/plugin-subenc.xml b/docs/plugins/inspect/plugin-subenc.xml index 5e7de4de82..1aff047bd5 100644 --- a/docs/plugins/inspect/plugin-subenc.xml +++ b/docs/plugins/inspect/plugin-subenc.xml @@ -3,7 +3,7 @@ subtitle encoders ../../gst/subenc/.libs/libgstsubenc.so libgstsubenc.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins git @@ -30,5 +30,26 @@
+ + webvttenc + WebVTT encoder + Codec/Encoder/Subtitle + WebVTT subtitle encoder + David Schleef <ds@schleef.org> + + + sink + sink + always +
text/plain; text/x-pango-markup
+
+ + src + source + always +
text/webvtt
+
+
+
\ No newline at end of file diff --git a/docs/plugins/inspect/plugin-tta.xml b/docs/plugins/inspect/plugin-tta.xml index c40acd26c7..8b09489a25 100644 --- a/docs/plugins/inspect/plugin-tta.xml +++ b/docs/plugins/inspect/plugin-tta.xml @@ -3,7 +3,7 @@ TTA lossless audio format handling ../../gst/tta/.libs/libgsttta.so libgsttta.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins git diff --git a/docs/plugins/inspect/plugin-vcdsrc.xml b/docs/plugins/inspect/plugin-vcdsrc.xml index 1e71ecfc9f..beefe2c737 100644 --- a/docs/plugins/inspect/plugin-vcdsrc.xml +++ b/docs/plugins/inspect/plugin-vcdsrc.xml @@ -3,7 +3,7 @@ Asynchronous read from VCD disk ../../sys/vcd/.libs/libgstvcdsrc.so libgstvcdsrc.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins git diff --git a/docs/plugins/inspect/plugin-vdpau.xml b/docs/plugins/inspect/plugin-vdpau.xml index 385e840b71..3758f6d9a1 100644 --- a/docs/plugins/inspect/plugin-vdpau.xml +++ b/docs/plugins/inspect/plugin-vdpau.xml @@ -3,7 +3,7 @@ Various elements utilizing VDPAU ../../sys/vdpau/.libs/libgstvdpau.so libgstvdpau.so - 0.10.21.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer diff --git a/docs/plugins/inspect/plugin-videofiltersbad.xml b/docs/plugins/inspect/plugin-videofiltersbad.xml index 2d125eacfd..629306f6f0 100644 --- a/docs/plugins/inspect/plugin-videofiltersbad.xml +++ b/docs/plugins/inspect/plugin-videofiltersbad.xml @@ -3,7 +3,7 @@ Video filters in gst-plugins-bad ../../gst/videofilters/.libs/libgstvideofiltersbad.so libgstvideofiltersbad.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins diff --git a/docs/plugins/inspect/plugin-videomaxrate.xml b/docs/plugins/inspect/plugin-videomaxrate.xml index ca9ccb4ba7..4db9f45d53 100644 --- a/docs/plugins/inspect/plugin-videomaxrate.xml +++ b/docs/plugins/inspect/plugin-videomaxrate.xml @@ -3,7 +3,7 @@ Drop extra frames ../../gst/videomaxrate/.libs/libgstvideomaxrate.so libgstvideomaxrate.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins git diff --git a/docs/plugins/inspect/plugin-videomeasure.xml b/docs/plugins/inspect/plugin-videomeasure.xml index 2ed7894936..2efa4627b3 100644 --- a/docs/plugins/inspect/plugin-videomeasure.xml +++ b/docs/plugins/inspect/plugin-videomeasure.xml @@ -3,7 +3,7 @@ Various video measurers ../../gst/videomeasure/.libs/libgstvideomeasure.so libgstvideomeasure.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins git diff --git a/docs/plugins/inspect/plugin-videoparsersbad.xml b/docs/plugins/inspect/plugin-videoparsersbad.xml index 930c55df78..a6cdb361fe 100644 --- a/docs/plugins/inspect/plugin-videoparsersbad.xml +++ b/docs/plugins/inspect/plugin-videoparsersbad.xml @@ -3,7 +3,7 @@ videoparsers ../../gst/videoparsers/.libs/libgstvideoparsersbad.so libgstvideoparsersbad.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins git @@ -20,13 +20,13 @@ sink sink always -
video/x-dirac, parsed=(boolean)false
+
video/x-dirac
src source always -
video/x-dirac, parsed=(boolean)true
+
video/x-dirac, parsed=(boolean)true, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], pixel-aspect-ratio=(fraction)[ 0/1, 2147483647/1 ], interlaced=(boolean){ true, false }, profile=(int)[ 0, 2147483647 ], level=(int)[ 0, 2147483647 ]
@@ -41,20 +41,20 @@ sink sink always -
video/x-h263, variant=(string)itu, parsed=(boolean)false
+
video/x-h263, variant=(string)itu
src source always -
video/x-h263, variant=(string)itu, parsed=(boolean)true
+
video/x-h263, variant=(string)itu, parsed=(boolean)true, framerate=(fraction)[ 0/1, 2147483647/1 ]
h264parse H.264 parser - Codec/Parser/Video + Codec/Parser/Converter/Video Parses H.264 streams Mark Nauwelaerts <mark.nauwelaerts@collabora.co.uk> @@ -62,13 +62,34 @@ sink sink always -
video/x-h264, parsed=(boolean)false
+
video/x-h264
src source always -
video/x-h264, parsed=(boolean)true
+
video/x-h264, parsed=(boolean)true, stream-format=(string){ avc, byte-stream }, alignment=(string){ au, nal }
+
+
+
+ + mpeg4videoparse + MPEG 4 video elementary stream parser + Codec/Parser/Video + Parses MPEG-4 Part 2 elementary video streams + Julien Moutte <julien@fluendo.com> + + + sink + sink + always +
video/mpeg, mpegversion=(int)4, systemstream=(boolean)false
+
+ + src + source + always +
video/mpeg, mpegversion=(int)4, parsed=(boolean)true, systemstream=(boolean)false
@@ -83,7 +104,7 @@ sink sink always -
video/mpeg, mpegversion=(int)[ 1, 2 ], parsed=(boolean)false, systemstream=(boolean)false
+
video/mpeg, mpegversion=(int)[ 1, 2 ], systemstream=(boolean)false
src diff --git a/docs/plugins/inspect/plugin-videosignal.xml b/docs/plugins/inspect/plugin-videosignal.xml index a3cfd021ec..39ee3abed5 100644 --- a/docs/plugins/inspect/plugin-videosignal.xml +++ b/docs/plugins/inspect/plugin-videosignal.xml @@ -3,7 +3,7 @@ Various video signal analysers ../../gst/videosignal/.libs/libgstvideosignal.so libgstvideosignal.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins git diff --git a/docs/plugins/inspect/plugin-vmnc.xml b/docs/plugins/inspect/plugin-vmnc.xml index 97268e82f0..088c562399 100644 --- a/docs/plugins/inspect/plugin-vmnc.xml +++ b/docs/plugins/inspect/plugin-vmnc.xml @@ -3,7 +3,7 @@ VmWare Video Codec plugins ../../gst/vmnc/.libs/libgstvmnc.so libgstvmnc.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins git diff --git a/docs/plugins/inspect/plugin-vp8.xml b/docs/plugins/inspect/plugin-vp8.xml index 30b7062519..e8e1a0bf87 100644 --- a/docs/plugins/inspect/plugin-vp8.xml +++ b/docs/plugins/inspect/plugin-vp8.xml @@ -3,7 +3,7 @@ VP8 plugin ../../ext/vp8/.libs/libgstvp8.so libgstvp8.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins git diff --git a/docs/plugins/inspect/plugin-wildmidi.xml b/docs/plugins/inspect/plugin-wildmidi.xml index bc4fa9f77e..233d339ba4 100644 --- a/docs/plugins/inspect/plugin-wildmidi.xml +++ b/docs/plugins/inspect/plugin-wildmidi.xml @@ -3,7 +3,7 @@ Wildmidi Plugin ../../ext/timidity/.libs/libgstwildmidi.so libgstwildmidi.so - 0.10.22.1 + 0.10.23.1 GPL gst-plugins-bad GStreamer Bad Plug-ins git diff --git a/docs/plugins/inspect/plugin-xvid.xml b/docs/plugins/inspect/plugin-xvid.xml index eca1e9929f..26de3c0bc1 100644 --- a/docs/plugins/inspect/plugin-xvid.xml +++ b/docs/plugins/inspect/plugin-xvid.xml @@ -3,7 +3,7 @@ XviD plugin library ../../ext/xvid/.libs/libgstxvid.so libgstxvid.so - 0.10.22.1 + 0.10.23.1 GPL gst-plugins-bad GStreamer Bad Plug-ins git @@ -47,7 +47,7 @@ src source always -
video/x-xvid, width=(int)[ 0, 2147483647 ], height=(int)[ 0, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/mpeg, mpegversion=(int)4, systemstream=(boolean)false, width=(int)[ 0, 2147483647 ], height=(int)[ 0, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
+
video/mpeg, mpegversion=(int)4, systemstream=(boolean)false, width=(int)[ 0, 2147483647 ], height=(int)[ 0, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], profile=(string)simple, level=(string){ 0, 1, 2, 3, 4a, 5, 6 }; video/mpeg, mpegversion=(int)4, systemstream=(boolean)false, width=(int)[ 0, 2147483647 ], height=(int)[ 0, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], profile=(string)advanced-real-time-simple, level=(string){ 1, 2, 3, 4 }; video/mpeg, mpegversion=(int)4, systemstream=(boolean)false, width=(int)[ 0, 2147483647 ], height=(int)[ 0, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], profile=(string)advanced-simple, level=(string){ 0, 1, 2, 3, 4 }; video/mpeg, mpegversion=(int)4, systemstream=(boolean)false, width=(int)[ 0, 2147483647 ], height=(int)[ 0, 2147483647 ]; video/x-xvid, width=(int)[ 0, 2147483647 ], height=(int)[ 0, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]
diff --git a/docs/plugins/inspect/plugin-y4mdec.xml b/docs/plugins/inspect/plugin-y4mdec.xml index b45e2b2631..40670cbdcb 100644 --- a/docs/plugins/inspect/plugin-y4mdec.xml +++ b/docs/plugins/inspect/plugin-y4mdec.xml @@ -3,7 +3,7 @@ Demuxes/decodes YUV4MPEG streams ../../gst/y4m/.libs/libgsty4mdec.so libgsty4mdec.so - 0.10.22.1 + 0.10.23.1 LGPL gst-plugins-bad GStreamer Bad Plug-ins diff --git a/win32/common/config.h b/win32/common/config.h index 16f0ed2877..c2904cfb76 100644 --- a/win32/common/config.h +++ b/win32/common/config.h @@ -199,7 +199,7 @@ #undef USE_POISONING /* Version number of package */ -#define VERSION "0.10.22.1" +#define VERSION "0.10.23.1" /* Define to 1 if your processor stores words with the most significant byte first (like Motorola and SPARC, unlike Intel and VAX). */ From c492b00b6942bfcf5304296dff9077e5f67bfcfa Mon Sep 17 00:00:00 2001 From: Edward Hervey Date: Tue, 8 Nov 2011 09:44:18 +0100 Subject: [PATCH 003/138] mpegtsbase: Query whether upstream is live or not --- gst/mpegtsdemux/mpegtsbase.c | 23 +++++++++++++++++++++++ gst/mpegtsdemux/mpegtsbase.h | 5 +++++ 2 files changed, 28 insertions(+) diff --git a/gst/mpegtsdemux/mpegtsbase.c b/gst/mpegtsdemux/mpegtsbase.c index 12323381d1..2b480c02cf 100644 --- a/gst/mpegtsdemux/mpegtsbase.c +++ b/gst/mpegtsdemux/mpegtsbase.c @@ -225,6 +225,9 @@ mpegts_base_reset (MpegTSBase * base) base->in_gap = 0; base->first_buf_ts = GST_CLOCK_TIME_NONE; + base->upstream_live = FALSE; + base->query_latency = FALSE; + if (klass->reset) klass->reset (base); } @@ -1241,6 +1244,22 @@ mpegts_base_sink_event (GstPad * pad, GstEvent * event) return res; } +static void +query_upstream_latency (MpegTSBase * base) +{ + GstQuery *query; + + query = gst_query_new_latency (); + if (gst_pad_peer_query (base->sinkpad, query)) { + gst_query_parse_latency (query, &base->upstream_live, NULL, NULL); + GST_DEBUG_OBJECT (base, "Upstream is %s", + base->upstream_live ? "LIVE" : "NOT LIVE"); + } else + GST_WARNING_OBJECT (base, "Failed to query upstream latency"); + gst_query_unref (query); + base->query_latency = TRUE; +} + static inline GstFlowReturn mpegts_base_push (MpegTSBase * base, MpegTSPacketizerPacket * packet, MpegTSPacketizerSection * section) @@ -1269,6 +1288,10 @@ mpegts_base_chain (GstPad * pad, GstBuffer * buf) base = GST_MPEGTS_BASE (gst_object_get_parent (GST_OBJECT (pad))); packetizer = base->packetizer; + if (G_UNLIKELY (base->query_latency == FALSE)) { + query_upstream_latency (base); + } + if (G_UNLIKELY (!GST_CLOCK_TIME_IS_VALID (base->first_buf_ts)) && GST_BUFFER_TIMESTAMP_IS_VALID (buf)) { base->first_buf_ts = GST_BUFFER_TIMESTAMP (buf); diff --git a/gst/mpegtsdemux/mpegtsbase.h b/gst/mpegtsdemux/mpegtsbase.h index 872e77ee87..499ea6a318 100644 --- a/gst/mpegtsdemux/mpegtsbase.h +++ b/gst/mpegtsdemux/mpegtsbase.h @@ -137,6 +137,11 @@ struct _MpegTSBase { GstClockTime in_gap; GstClockTime first_buf_ts; + /* Whether upstream is live or not */ + gboolean upstream_live; + /* Whether we queried the upstream latency or not */ + gboolean query_latency; + /* Upstream segment */ GstSegment segment; }; From 8f433e1677119c53ce42e66576c372f0bc4566b0 Mon Sep 17 00:00:00 2001 From: Edward Hervey Date: Tue, 8 Nov 2011 20:12:50 +0100 Subject: [PATCH 004/138] tsdemux: Report latency (700ms) --- gst/mpegtsdemux/tsdemux.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/gst/mpegtsdemux/tsdemux.c b/gst/mpegtsdemux/tsdemux.c index 0fd86f98f2..c3b26c1b3b 100644 --- a/gst/mpegtsdemux/tsdemux.c +++ b/gst/mpegtsdemux/tsdemux.c @@ -395,6 +395,7 @@ gst_ts_demux_srcpad_query_types (GstPad * pad) static const GstQueryType query_types[] = { GST_QUERY_DURATION, GST_QUERY_SEEKING, + GST_QUERY_LATENCY, 0 }; @@ -425,6 +426,30 @@ gst_ts_demux_srcpad_query (GstPad * pad, GstQuery * query) res = FALSE; } break; + case GST_QUERY_LATENCY: + { + GST_DEBUG ("query latency"); + res = gst_pad_peer_query (base->sinkpad, query); + if (res && base->upstream_live) { + GstClockTime min_lat, max_lat; + gboolean live; + + /* According to H.222.0 + Annex D.0.3 (System Time Clock recovery in the decoder) + and D.0.2 (Audio and video presentation synchronization) + + We can end up with an interval of up to 700ms between valid + PCR/SCR. We therefore allow a latency of 700ms for that. + */ + gst_query_parse_latency (query, &live, &min_lat, &max_lat); + if (min_lat != -1) + min_lat += 700 * GST_MSECOND; + if (max_lat != -1) + max_lat += 700 * GST_MSECOND; + gst_query_set_latency (query, live, min_lat, max_lat); + } + } + break; case GST_QUERY_SEEKING: GST_DEBUG ("query seeking"); gst_query_parse_seeking (query, &format, NULL, NULL, NULL); From 8b73baeced99de22c71fb76b8209ee504edf8f4a Mon Sep 17 00:00:00 2001 From: Edward Hervey Date: Tue, 8 Nov 2011 20:19:41 +0100 Subject: [PATCH 005/138] tsdemux: Use incoming timestamps in live mode --- gst/mpegtsdemux/tsdemux.c | 66 ++++++++++++++++++++++++++++++++------- gst/mpegtsdemux/tsdemux.h | 4 +++ 2 files changed, 58 insertions(+), 12 deletions(-) diff --git a/gst/mpegtsdemux/tsdemux.c b/gst/mpegtsdemux/tsdemux.c index c3b26c1b3b..276aaf93c9 100644 --- a/gst/mpegtsdemux/tsdemux.c +++ b/gst/mpegtsdemux/tsdemux.c @@ -310,6 +310,7 @@ gst_ts_demux_init (GstTSDemux * demux, GstTSDemuxClass * klass) demux->need_newsegment = TRUE; demux->program_number = -1; demux->duration = GST_CLOCK_TIME_NONE; + demux->pts_delta = GST_CLOCK_TIME_NONE; GST_MPEGTS_BASE (demux)->stream_size = sizeof (TSDemuxStream); gst_segment_init (&demux->segment, GST_FORMAT_TIME); demux->first_pcr = (TSPcrOffset) { @@ -333,6 +334,7 @@ gst_ts_demux_reset (MpegTSBase * base) demux->need_newsegment = TRUE; demux->program_number = -1; demux->duration = GST_CLOCK_TIME_NONE; + demux->pts_delta = GST_CLOCK_TIME_NONE; gst_segment_init (&demux->segment, GST_FORMAT_TIME); demux->first_pcr = (TSPcrOffset) { GST_CLOCK_TIME_NONE, 0, 0}; @@ -2039,9 +2041,11 @@ gst_ts_demux_parse_pes_header (GstTSDemux * demux, TSDemuxStream * stream) guint32 length; guint64 bufferoffset; PESParsingResult parseres; + GstClockTime origts; data = GST_BUFFER_DATA (stream->pendingbuffers[0]); length = GST_BUFFER_SIZE (stream->pendingbuffers[0]); + origts = GST_BUFFER_TIMESTAMP (stream->pendingbuffers[0]); bufferoffset = GST_BUFFER_OFFSET (stream->pendingbuffers[0]); GST_MEMDUMP ("Header buffer", data, MIN (length, 32)); @@ -2081,8 +2085,24 @@ gst_ts_demux_parse_pes_header (GstTSDemux * demux, TSDemuxStream * stream) time = calc_gsttime_from_pts (&demux->index_pcr, pts); #endif - GST_DEBUG_OBJECT (base, "stream PTS %" GST_TIME_FORMAT, - GST_TIME_ARGS (stream->pts)); + GST_DEBUG_OBJECT (base, + "stream PTS %" GST_TIME_FORMAT " DTS %" GST_TIME_FORMAT, + GST_TIME_ARGS (stream->pts), + GST_TIME_ARGS (MPEGTIME_TO_GSTTIME (header.DTS))); + + /* FIXME : This will only work if the PES header is contained + * at the beginning of an incoming GstBuffer */ + if (base->upstream_live && GST_CLOCK_TIME_IS_VALID (origts) + && !GST_CLOCK_TIME_IS_VALID (demux->pts_delta)) { + if (header.DTS != -1) + demux->pts_delta = MPEGTIME_TO_GSTTIME (header.DTS) - origts; + else + demux->pts_delta = stream->pts - origts; + GST_DEBUG_OBJECT (base, "buffer timestamp %" GST_TIME_FORMAT, + GST_TIME_ARGS (origts)); + GST_DEBUG_OBJECT (base, "delta %" GST_TIME_FORMAT, + GST_TIME_ARGS (demux->pts_delta)); + } /* safe default if insufficient upstream info */ if (G_UNLIKELY (!GST_CLOCK_TIME_IS_VALID (base->in_gap) && @@ -2112,8 +2132,16 @@ gst_ts_demux_parse_pes_header (GstTSDemux * demux, TSDemuxStream * stream) if (!GST_CLOCK_TIME_IS_VALID (base->in_gap)) base->in_gap = 0; - GST_BUFFER_TIMESTAMP (stream->pendingbuffers[0]) = - stream->pts + base->in_gap; + if (base->upstream_live) { + if (GST_CLOCK_TIME_IS_VALID (demux->pts_delta)) + GST_BUFFER_TIMESTAMP (stream->pendingbuffers[0]) = + stream->pts - demux->pts_delta; + else + GST_BUFFER_TIMESTAMP (stream->pendingbuffers[0]) = GST_CLOCK_TIME_NONE; + } else + GST_BUFFER_TIMESTAMP (stream->pendingbuffers[0]) = stream->pts + base->in_gap; + GST_DEBUG ("buf %" GST_TIME_FORMAT, + GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (stream->pendingbuffers[0]))); } /* Remove PES headers */ @@ -2250,8 +2278,10 @@ calculate_and_push_newsegment (GstTSDemux * demux, TSDemuxStream * stream) start = base->segment.start; stop = base->segment.stop; } - /* Shift the start depending on our position in the stream */ - start += firstpts + base->in_gap - base->first_buf_ts; + if (!base->upstream_live) { + /* Shift the start depending on our position in the stream */ + start += firstpts + base->in_gap - base->first_buf_ts; + } position = start; } else { /* pull mode */ @@ -2289,10 +2319,12 @@ gst_ts_demux_push_pending_data (GstTSDemux * demux, TSDemuxStream * stream) { GstFlowReturn res = GST_FLOW_OK; MpegTSBaseStream *bs = (MpegTSBaseStream *) stream; + /* MpegTSBase *base = (MpegTSBase*) demux; */ + GstBuffer *firstbuffer = NULL; - GST_DEBUG ("stream:%p, pid:0x%04x stream_type:%d state:%d pad:%s:%s", - stream, bs->pid, bs->stream_type, stream->state, - GST_DEBUG_PAD_NAME (stream->pad)); + GST_DEBUG_OBJECT (stream->pad, + "stream:%p, pid:0x%04x stream_type:%d state:%d", stream, bs->pid, + bs->stream_type, stream->state); if (G_UNLIKELY (stream->current == NULL)) { GST_LOG ("stream->current == NULL"); @@ -2319,15 +2351,25 @@ gst_ts_demux_push_pending_data (GstTSDemux * demux, TSDemuxStream * stream) calculate_and_push_newsegment (demux, stream); /* We have a confirmed buffer, let's push it out */ - GST_LOG ("Putting pending data into GstBufferList"); + GST_LOG_OBJECT (stream->pad, "Putting pending data into GstBufferList"); stream->currentlist = g_list_reverse (stream->currentlist); gst_buffer_list_iterator_add_list (stream->currentit, stream->currentlist); gst_buffer_list_iterator_free (stream->currentit); + firstbuffer = gst_buffer_list_get (stream->current, 0, 0); + + GST_DEBUG_OBJECT (stream->pad, + "delta %" GST_TIME_FORMAT " stream->pts %" GST_TIME_FORMAT, + GST_TIME_ARGS (demux->pts_delta), GST_TIME_ARGS (stream->pts)); + if (GST_CLOCK_TIME_IS_VALID (demux->pts_delta) + && GST_CLOCK_TIME_IS_VALID (stream->pts) + && !GST_CLOCK_TIME_IS_VALID (GST_BUFFER_TIMESTAMP (firstbuffer))) { + GST_BUFFER_TIMESTAMP (firstbuffer) = stream->pts - demux->pts_delta; + } + GST_DEBUG_OBJECT (stream->pad, "Pushing buffer list with timestamp: %" GST_TIME_FORMAT, - GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (gst_buffer_list_get - (stream->current, 0, 0)))); + GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (firstbuffer))); res = gst_pad_push_list (stream->pad, stream->current); GST_DEBUG_OBJECT (stream->pad, "Returned %s", gst_flow_get_name (res)); diff --git a/gst/mpegtsdemux/tsdemux.h b/gst/mpegtsdemux/tsdemux.h index 395cf3e134..0a7d880732 100644 --- a/gst/mpegtsdemux/tsdemux.h +++ b/gst/mpegtsdemux/tsdemux.h @@ -81,6 +81,10 @@ struct _GstTSDemux TSPcrOffset last_pcr; TSPcrOffset cur_pcr; TSPcrOffset index_pcr; + + /* LIVE MODE ONLY */ + /* Delta between incoming ts and PTS */ + GstClockTime pts_delta; }; struct _GstTSDemuxClass From 120031ab5520fadebd79bd6e3054a77a5e6f3e64 Mon Sep 17 00:00:00 2001 From: Mark Nauwelaerts Date: Thu, 23 Feb 2012 21:16:18 +0100 Subject: [PATCH 006/138] faad: discard frame upon decoding error --- ext/faad/gstfaad.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ext/faad/gstfaad.c b/ext/faad/gstfaad.c index 4dd73eba8d..30f6dd9f85 100644 --- a/ext/faad/gstfaad.c +++ b/ext/faad/gstfaad.c @@ -806,6 +806,8 @@ decode_failed: { GST_AUDIO_DECODER_ERROR (faad, 1, STREAM, DECODE, (NULL), ("decoding error: %s", faacDecGetErrorMessage (info.error)), ret); + if (ret == GST_FLOW_OK) + gst_audio_decoder_finish_frme (dec, NULL, 1); goto out; } negotiation_failed: From 4c9ac0886a4c289fddbf2b8a76db1426b2eb3b55 Mon Sep 17 00:00:00 2001 From: Mark Nauwelaerts Date: Thu, 23 Feb 2012 21:17:53 +0100 Subject: [PATCH 007/138] h264parse: consider nal_length_size when constructing codec_data Fixes #670699. --- gst/videoparsers/gsth264parse.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/gst/videoparsers/gsth264parse.c b/gst/videoparsers/gsth264parse.c index ea0d084350..6528907a4e 100644 --- a/gst/videoparsers/gsth264parse.c +++ b/gst/videoparsers/gsth264parse.c @@ -845,6 +845,7 @@ gst_h264_parse_make_codec_data (GstH264Parse * h264parse) guint8 profile_idc = 0, profile_comp = 0, level_idc = 0; gboolean found = FALSE; guint8 *data; + gint nl; /* only nal payload in stored nals */ @@ -877,12 +878,13 @@ gst_h264_parse_make_codec_data (GstH264Parse * h264parse) buf = gst_buffer_new_and_alloc (5 + 1 + sps_size + 1 + pps_size); data = GST_BUFFER_DATA (buf); + nl = h264parse->nal_length_size; data[0] = 1; /* AVC Decoder Configuration Record ver. 1 */ data[1] = profile_idc; /* profile_idc */ data[2] = profile_comp; /* profile_compability */ data[3] = level_idc; /* level_idc */ - data[4] = 0xfc | (4 - 1); /* nal_length_size_minus1 */ + data[4] = 0xfc | (nl - 1); /* nal_length_size_minus1 */ data[5] = 0xe0 | num_sps; /* number of SPSs */ data += 6; From fa9f035ca8ff16577b736d9114e263b0a45c8694 Mon Sep 17 00:00:00 2001 From: Mark Nauwelaerts Date: Thu, 23 Feb 2012 22:04:24 +0100 Subject: [PATCH 008/138] faad: fixup nasty typo breaking compilation --- ext/faad/gstfaad.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/faad/gstfaad.c b/ext/faad/gstfaad.c index 30f6dd9f85..3fee59ed67 100644 --- a/ext/faad/gstfaad.c +++ b/ext/faad/gstfaad.c @@ -807,7 +807,7 @@ decode_failed: GST_AUDIO_DECODER_ERROR (faad, 1, STREAM, DECODE, (NULL), ("decoding error: %s", faacDecGetErrorMessage (info.error)), ret); if (ret == GST_FLOW_OK) - gst_audio_decoder_finish_frme (dec, NULL, 1); + gst_audio_decoder_finish_frame (dec, NULL, 1); goto out; } negotiation_failed: From 6ef0ae4ffecdc00c011eddb45a80396417e22b75 Mon Sep 17 00:00:00 2001 From: Edward Hervey Date: Thu, 23 Feb 2012 18:17:50 +0100 Subject: [PATCH 009/138] tsdemux: Remove useless finalize() --- gst/mpegtsdemux/tsdemux.c | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/gst/mpegtsdemux/tsdemux.c b/gst/mpegtsdemux/tsdemux.c index 276aaf93c9..4ed9b7644b 100644 --- a/gst/mpegtsdemux/tsdemux.c +++ b/gst/mpegtsdemux/tsdemux.c @@ -225,7 +225,6 @@ static void gst_ts_demux_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_ts_demux_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); -static void gst_ts_demux_finalize (GObject * object); static GstFlowReturn process_pcr (MpegTSBase * base, guint64 initoff, TSPcrOffset * pcroffset, guint numpcr, gboolean isinitial); @@ -279,7 +278,6 @@ gst_ts_demux_class_init (GstTSDemuxClass * klass) gobject_class = G_OBJECT_CLASS (klass); gobject_class->set_property = gst_ts_demux_set_property; gobject_class->get_property = gst_ts_demux_get_property; - gobject_class->finalize = gst_ts_demux_finalize; g_object_class_install_property (gobject_class, PROP_PROGRAM_NUMBER, g_param_spec_int ("program-number", "Program number", @@ -344,14 +342,6 @@ gst_ts_demux_reset (MpegTSBase * base) 0}; } -static void -gst_ts_demux_finalize (GObject * object) -{ - if (G_OBJECT_CLASS (parent_class)->finalize) - G_OBJECT_CLASS (parent_class)->finalize (object); -} - - static void gst_ts_demux_set_property (GObject * object, guint prop_id, From 67fd590e9aef3a4487c31fe6e1493cfd2177ee12 Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Mon, 20 Feb 2012 17:32:21 -0300 Subject: [PATCH 010/138] tsdemux: Support more DTS/AC3 descriptors --- gst/mpegtsdemux/gstmpegdesc.h | 16 +++++++--- gst/mpegtsdemux/tsdemux.c | 57 ++++++++++++++++++++++++++++------- 2 files changed, 58 insertions(+), 15 deletions(-) diff --git a/gst/mpegtsdemux/gstmpegdesc.h b/gst/mpegtsdemux/gstmpegdesc.h index 06aa17b959..f2640ad3a1 100644 --- a/gst/mpegtsdemux/gstmpegdesc.h +++ b/gst/mpegtsdemux/gstmpegdesc.h @@ -140,6 +140,7 @@ #define DESC_DVB_EXTENSION 0x7F /* 0x80 - 0xFE are user defined */ #define DESC_DTG_LOGICAL_CHANNEL 0x83 /* from DTG D-Book */ +#define DESC_AC3_AUDIO_STREAM 0x81 /* 0xFF is forbidden */ /* common for all descriptors */ @@ -315,14 +316,21 @@ /* DVB Carousel Identifier Descriptor */ #define DESC_DVB_CAROUSEL_IDENTIFIER_carousel_id(desc) (GST_READ_UINT32_BE((desc) + 2)) +/* AC3_audio_stream_descriptor */ +#define DESC_AC_AUDIO_STREAM_bsid(desc) ((desc)[2] & 0x1f) + /* registration_descriptor format IDs */ #define DRF_ID_HDMV 0x48444d56 #define DRF_ID_VC1 0x56432D31 /* defined in RP227 */ +#define DRF_ID_DTS1 0x44545331 +#define DRF_ID_DTS2 0x44545332 +#define DRF_ID_DTS3 0x44545333 -typedef struct { - guint n_desc; - guint8 data_length; - guint8 *data; +typedef struct +{ + guint n_desc; + guint8 data_length; + guint8 *data; } GstMPEGDescriptor; void gst_mpegtsdesc_init_debug (void); diff --git a/gst/mpegtsdemux/tsdemux.c b/gst/mpegtsdemux/tsdemux.c index 4ed9b7644b..5be489eb9c 100644 --- a/gst/mpegtsdemux/tsdemux.c +++ b/gst/mpegtsdemux/tsdemux.c @@ -1020,8 +1020,7 @@ create_pad_for_stream (MpegTSBase * base, MpegTSBaseStream * bstream, break; case ST_PRIVATE_DATA: GST_LOG ("private data"); - desc = - mpegts_get_descriptor_from_stream ((MpegTSBaseStream *) stream, + desc = mpegts_get_descriptor_from_stream ((MpegTSBaseStream *) stream, DESC_DVB_AC3); if (desc) { GST_LOG ("ac3 audio"); @@ -1031,8 +1030,8 @@ create_pad_for_stream (MpegTSBase * base, MpegTSBaseStream * bstream, g_free (desc); break; } - desc = - mpegts_get_descriptor_from_stream ((MpegTSBaseStream *) stream, + + desc = mpegts_get_descriptor_from_stream ((MpegTSBaseStream *) stream, DESC_DVB_ENHANCED_AC3); if (desc) { GST_LOG ("ac3 audio"); @@ -1042,8 +1041,7 @@ create_pad_for_stream (MpegTSBase * base, MpegTSBaseStream * bstream, g_free (desc); break; } - desc = - mpegts_get_descriptor_from_stream ((MpegTSBaseStream *) stream, + desc = mpegts_get_descriptor_from_stream ((MpegTSBaseStream *) stream, DESC_DVB_TELETEXT); if (desc) { GST_LOG ("teletext"); @@ -1064,6 +1062,26 @@ create_pad_for_stream (MpegTSBase * base, MpegTSBaseStream * bstream, g_free (desc); break; } + + desc = mpegts_get_descriptor_from_stream ((MpegTSBaseStream *) stream, + DESC_REGISTRATION); + if (desc) { + switch (DESC_REGISTRATION_format_identifier (desc)) { + case DRF_ID_DTS1: + case DRF_ID_DTS2: + case DRF_ID_DTS3: + /* SMPTE registered DTS */ + GST_LOG ("subtitling"); + template = gst_static_pad_template_get (&private_template); + name = g_strdup_printf ("private_%04x", bstream->pid); + caps = gst_caps_new_simple ("audio/x-dts", NULL); + break; + } + g_free (desc); + } + if (template) + break; + /* hack for itv hd (sid 10510, video pid 3401 */ if (program->program_number == 10510 && bstream->pid == 3401) { template = gst_static_pad_template_get (&video_template); @@ -1167,18 +1185,35 @@ create_pad_for_stream (MpegTSBase * base, MpegTSBaseStream * bstream, desc = mpegts_get_descriptor_from_program (program, DESC_REGISTRATION); if (desc) { if (DESC_REGISTRATION_format_identifier (desc) == DRF_ID_HDMV) { - template = gst_static_pad_template_get (&audio_template); - name = g_strdup_printf ("audio_%04x", bstream->pid); - caps = gst_caps_new_simple ("audio/x-eac3", NULL); + guint8 *ac3_desc; + + /* ATSC ac3 audio descriptor */ + ac3_desc = + mpegts_get_descriptor_from_stream ((MpegTSBaseStream *) stream, + DESC_AC3_AUDIO_STREAM); + if (ac3_desc && DESC_AC_AUDIO_STREAM_bsid (ac3_desc) != 16) { + GST_LOG ("ac3 audio"); + template = gst_static_pad_template_get (&audio_template); + name = g_strdup_printf ("audio_%04x", bstream->pid); + caps = gst_caps_new_simple ("audio/x-ac3", NULL); + + g_free (ac3_desc); + } else { + template = gst_static_pad_template_get (&audio_template); + name = g_strdup_printf ("audio_%04x", bstream->pid); + caps = gst_caps_new_simple ("audio/x-eac3", NULL); + } + } + g_free (desc); } if (template) break; + /* DVB_ENHANCED_AC3 */ - desc = - mpegts_get_descriptor_from_stream ((MpegTSBaseStream *) stream, + desc = mpegts_get_descriptor_from_stream ((MpegTSBaseStream *) stream, DESC_DVB_ENHANCED_AC3); if (desc) { template = gst_static_pad_template_get (&audio_template); From dc8b6c678dee0c6d24c6e4ff4baf1371f4a7ff10 Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Mon, 20 Feb 2012 17:47:11 -0300 Subject: [PATCH 011/138] tsdemux: Reindent gstmpegdesc.h --- gst/mpegtsdemux/gstmpegdesc.h | 173 +++++++++++++++++----------------- 1 file changed, 87 insertions(+), 86 deletions(-) diff --git a/gst/mpegtsdemux/gstmpegdesc.h b/gst/mpegtsdemux/gstmpegdesc.h index f2640ad3a1..c4ae91c0a4 100644 --- a/gst/mpegtsdemux/gstmpegdesc.h +++ b/gst/mpegtsdemux/gstmpegdesc.h @@ -29,6 +29,7 @@ #define __GST_MPEG_DESC_H__ #include + /* * descriptor_tag TS PS Identification * 0 n/a n/a Reserved @@ -53,94 +54,94 @@ * 19-63 n/a n/a ITU-T Rec. H.222.0 | ISO/IEC 13818-1 Reserved * 64-255 n/a n/a User Private */ -#define DESC_VIDEO_STREAM 2 -#define DESC_AUDIO_STREAM 3 -#define DESC_HIERARCHY 4 -#define DESC_REGISTRATION 5 -#define DESC_DATA_STREAM_ALIGNMENT 6 -#define DESC_TARGET_BACKGROUND_GRID 7 -#define DESC_VIDEO_WINDOW 8 -#define DESC_CA 9 -#define DESC_ISO_639_LANGUAGE 10 -#define DESC_SYSTEM_CLOCK 11 -#define DESC_MULTIPLEX_BUFFER_UTILISATION 12 -#define DESC_COPYRIGHT 13 -#define DESC_MAXIMUM_BITRATE 14 -#define DESC_PRIVATE_DATA_INDICATOR 15 -#define DESC_SMOOTHING_BUFFER 16 -#define DESC_STD 17 -#define DESC_IBP 18 +#define DESC_VIDEO_STREAM 0x02 +#define DESC_AUDIO_STREAM 0x03 +#define DESC_HIERARCHY 0x04 +#define DESC_REGISTRATION 0x05 +#define DESC_DATA_STREAM_ALIGNMENT 0x06 +#define DESC_TARGET_BACKGROUND_GRID 0x07 +#define DESC_VIDEO_WINDOW 0x08 +#define DESC_CA 0x09 +#define DESC_ISO_639_LANGUAGE 0x0A +#define DESC_SYSTEM_CLOCK 0x0B +#define DESC_MULTIPLEX_BUFFER_UTILISATION 0x0C +#define DESC_COPYRIGHT 0x0D +#define DESC_MAXIMUM_BITRATE 0x0E +#define DESC_PRIVATE_DATA_INDICATOR 0x0F +#define DESC_SMOOTHING_BUFFER 0x10 +#define DESC_STD 0x11 +#define DESC_IBP 0x12 -#define DESC_DIRAC_TC_PRIVATE 0xAC +#define DESC_DIRAC_TC_PRIVATE 0xAC /* DVB tags */ -#define DESC_DVB_CAROUSEL_IDENTIFIER 0x13 -#define DESC_DVB_NETWORK_NAME 0x40 -#define DESC_DVB_SERVICE_LIST 0x41 -#define DESC_DVB_STUFFING 0x42 +#define DESC_DVB_CAROUSEL_IDENTIFIER 0x13 +#define DESC_DVB_NETWORK_NAME 0x40 +#define DESC_DVB_SERVICE_LIST 0x41 +#define DESC_DVB_STUFFING 0x42 #define DESC_DVB_SATELLITE_DELIVERY_SYSTEM 0x43 -#define DESC_DVB_CABLE_DELIVERY_SYSTEM 0x44 -#define DESC_DVB_VBI_DATA 0x45 -#define DESC_DVB_VBI_TELETEXT 0x46 -#define DESC_DVB_BOUQUET_NAME 0x47 -#define DESC_DVB_SERVICE 0x48 -#define DESC_DVB_COUNTRY_AVAILABILITY 0x49 -#define DESC_DVB_LINKAGE 0x4A -#define DESC_DVB_NVOD_REFERENCE 0x4B -#define DESC_DVB_TIME_SHIFTED_SERVICE 0x4C -#define DESC_DVB_SHORT_EVENT 0x4D -#define DESC_DVB_EXTENDED_EVENT 0x4E -#define DESC_DVB_TIME_SHIFTED_EVENT 0x4F -#define DESC_DVB_COMPONENT 0x50 -#define DESC_DVB_MOSAIC 0x51 -#define DESC_DVB_STREAM_IDENTIFIER 0x52 -#define DESC_DVB_CA_IDENTIFIER 0x53 -#define DESC_DVB_CONTENT 0x54 -#define DESC_DVB_PARENTAL_RATING 0x55 -#define DESC_DVB_TELETEXT 0x56 -#define DESC_DVB_TELEPHONE 0x57 -#define DESC_DVB_LOCAL_TIME_OFFSET 0x58 -#define DESC_DVB_SUBTITLING 0x59 +#define DESC_DVB_CABLE_DELIVERY_SYSTEM 0x44 +#define DESC_DVB_VBI_DATA 0x45 +#define DESC_DVB_VBI_TELETEXT 0x46 +#define DESC_DVB_BOUQUET_NAME 0x47 +#define DESC_DVB_SERVICE 0x48 +#define DESC_DVB_COUNTRY_AVAILABILITY 0x49 +#define DESC_DVB_LINKAGE 0x4A +#define DESC_DVB_NVOD_REFERENCE 0x4B +#define DESC_DVB_TIME_SHIFTED_SERVICE 0x4C +#define DESC_DVB_SHORT_EVENT 0x4D +#define DESC_DVB_EXTENDED_EVENT 0x4E +#define DESC_DVB_TIME_SHIFTED_EVENT 0x4F +#define DESC_DVB_COMPONENT 0x50 +#define DESC_DVB_MOSAIC 0x51 +#define DESC_DVB_STREAM_IDENTIFIER 0x52 +#define DESC_DVB_CA_IDENTIFIER 0x53 +#define DESC_DVB_CONTENT 0x54 +#define DESC_DVB_PARENTAL_RATING 0x55 +#define DESC_DVB_TELETEXT 0x56 +#define DESC_DVB_TELEPHONE 0x57 +#define DESC_DVB_LOCAL_TIME_OFFSET 0x58 +#define DESC_DVB_SUBTITLING 0x59 #define DESC_DVB_TERRESTRIAL_DELIVERY_SYSTEM 0x5A #define DESC_DVB_MULTILINGUAL_NETWORK_NAME 0x5B #define DESC_DVB_MULTILINGUAL_BOUQUET_NAME 0x5C #define DESC_DVB_MULTILINGUAL_SERVICE_NAME 0x5D -#define DESC_DVB_MULTILINGUAL_COMPONENT 0x5E -#define DESC_DVB_PRIVATE_DATA 0x5F -#define DESC_DVB_SERVICE_MOVE 0x60 -#define DESC_DVB_SHORT_SMOOTHING_BUFFER 0x61 -#define DESC_DVB_FREQUENCY_LIST 0x62 -#define DESC_DVB_PARTIAL_TRANSPORT_STREAM 0x63 -#define DESC_DVB_DATA_BROADCAST 0x64 -#define DESC_DVB_SCRAMBLING 0x65 -#define DESC_DVB_DATA_BROADCAST_ID 0x66 -#define DESC_DVB_TRANSPORT_STREAM 0x67 -#define DESC_DVB_DSNG 0x68 -#define DESC_DVB_PDC 0x69 -#define DESC_DVB_AC3 0x6A -#define DESC_DVB_ANCILLARY_DATA 0x6B -#define DESC_DVB_CELL_LIST 0x6C -#define DESC_DVB_CELL_FREQUENCY_LINK 0x6D -#define DESC_DVB_ANNOUNCEMENT_SUPPORT 0x6E -#define DESC_DVB_APPLICATION_SIGNALLING 0x6F -#define DESC_DVB_ADAPTATION_FIELD_DATA 0x70 -#define DESC_DVB_SERVICE_IDENTIFIER 0x71 -#define DESC_DVB_SERVICE_AVAILABILITY 0x72 -#define DESC_DVB_DEFAULT_AUTHORITY 0x73 -#define DESC_DVB_RELATED_CONTENT 0x74 -#define DESC_DVB_TVA_ID 0x75 -#define DESC_DVB_CONTENT_IDENTIFIER 0x76 -#define DESC_DVB_TIMESLICE_FEC_IDENTIFIER 0x77 -#define DESC_DVB_ECM_REPETITION_RATE 0x78 -#define DESC_DVB_S2_SATELLITE_DELIVERY_SYSTEM 0x79 -#define DESC_DVB_ENHANCED_AC3 0x7A -#define DESC_DVB_DTS 0x7B -#define DESC_DVB_AAC 0x7C +#define DESC_DVB_MULTILINGUAL_COMPONENT 0x5E +#define DESC_DVB_PRIVATE_DATA 0x5F +#define DESC_DVB_SERVICE_MOVE 0x60 +#define DESC_DVB_SHORT_SMOOTHING_BUFFER 0x61 +#define DESC_DVB_FREQUENCY_LIST 0x62 +#define DESC_DVB_PARTIAL_TRANSPORT_STREAM 0x63 +#define DESC_DVB_DATA_BROADCAST 0x64 +#define DESC_DVB_SCRAMBLING 0x65 +#define DESC_DVB_DATA_BROADCAST_ID 0x66 +#define DESC_DVB_TRANSPORT_STREAM 0x67 +#define DESC_DVB_DSNG 0x68 +#define DESC_DVB_PDC 0x69 +#define DESC_DVB_AC3 0x6A +#define DESC_DVB_ANCILLARY_DATA 0x6B +#define DESC_DVB_CELL_LIST 0x6C +#define DESC_DVB_CELL_FREQUENCY_LINK 0x6D +#define DESC_DVB_ANNOUNCEMENT_SUPPORT 0x6E +#define DESC_DVB_APPLICATION_SIGNALLING 0x6F +#define DESC_DVB_ADAPTATION_FIELD_DATA 0x70 +#define DESC_DVB_SERVICE_IDENTIFIER 0x71 +#define DESC_DVB_SERVICE_AVAILABILITY 0x72 +#define DESC_DVB_DEFAULT_AUTHORITY 0x73 +#define DESC_DVB_RELATED_CONTENT 0x74 +#define DESC_DVB_TVA_ID 0x75 +#define DESC_DVB_CONTENT_IDENTIFIER 0x76 +#define DESC_DVB_TIMESLICE_FEC_IDENTIFIER 0x77 +#define DESC_DVB_ECM_REPETITION_RATE 0x78 +#define DESC_DVB_S2_SATELLITE_DELIVERY_SYSTEM 0x79 +#define DESC_DVB_ENHANCED_AC3 0x7A +#define DESC_DVB_DTS 0x7B +#define DESC_DVB_AAC 0x7C /* 0x7D and 0x7E are reserved for future use */ -#define DESC_DVB_EXTENSION 0x7F +#define DESC_DVB_EXTENSION 0x7F /* 0x80 - 0xFE are user defined */ -#define DESC_DTG_LOGICAL_CHANNEL 0x83 /* from DTG D-Book */ #define DESC_AC3_AUDIO_STREAM 0x81 +#define DESC_DTG_LOGICAL_CHANNEL 0x83 /* from DTG D-Book */ /* 0xFF is forbidden */ /* common for all descriptors */ @@ -197,7 +198,7 @@ #define DESC_ISO_639_LANGUAGE_language_code_nth(desc,i) (&(desc[2 + (4*i)])) #define DESC_ISO_639_LANGUAGE_audio_type_nth(desc,i) ((desc)[5 + (4*i)]) -/* system_clock_descriptor */ +/* system_clock_descriptor */ #define DESC_SYSTEM_CLOCK_external_clock_reference_indicator(desc) (((desc)[2] & 0x80) == 0x80) #define DESC_SYSTEM_CLOCK_clock_accuracy_integer(desc) ((desc)[2] & 0x3f) #define DESC_SYSTEM_CLOCK_clock_accuracy_exponent(desc) (((desc)[3] & 0xe0) >> 5) @@ -214,7 +215,7 @@ /* maximum_bitrate_descriptor */ #define DESC_MAXIMUM_BITRAT_maximum_bitrate(desc) (((((guint32)desc[2]) & 0x3f) << 16) | \ - GST_READ_UINT16_BE ((desc)+3)) + GST_READ_UINT16_BE ((desc)+3)) /* private_data_indicator_descriptor */ #define DESC_PRIVATE_DATA_INDICATOR_indicator(desc) (GST_READ_UINT32_BE(&desc[2])) @@ -269,7 +270,7 @@ #define DESC_DVB_EXTENDED_EVENT_last_descriptor_number(desc) (desc[2] & 0x0F) #define DESC_DVB_EXTENDED_EVENT_iso639_language_code(desc) (desc + 3) #define DESC_DVB_EXTENDED_EVENT_items_length(desc) (desc[6]) -#define DESC_DVB_EXTENDED_EVENT_items(desc) (desc + 7) +#define DESC_DVB_EXTENDED_EVENT_items(desc) (desc + 7) #define DESC_DVB_EXTENDED_EVENT_text_length(desc) (desc[7 + DESC_DVB_EXTENDED_EVENT_items_length(desc)]) #define DESC_DVB_EXTENDED_EVENT_text(desc) (desc + 7 + DESC_DVB_EXTENDED_EVENT_items_length(desc) + 1) @@ -334,13 +335,13 @@ typedef struct } GstMPEGDescriptor; void gst_mpegtsdesc_init_debug (void); -GstMPEGDescriptor* gst_mpeg_descriptor_parse (guint8 *data, guint size); -void gst_mpeg_descriptor_free (GstMPEGDescriptor *desc); +GstMPEGDescriptor *gst_mpeg_descriptor_parse (guint8 * data, guint size); +void gst_mpeg_descriptor_free (GstMPEGDescriptor * desc); -guint gst_mpeg_descriptor_n_desc (GstMPEGDescriptor *desc); -guint8* gst_mpeg_descriptor_find (GstMPEGDescriptor *desc, gint tag); -GArray* gst_mpeg_descriptor_find_all (GstMPEGDescriptor * desc, gint tag); +guint gst_mpeg_descriptor_n_desc (GstMPEGDescriptor * desc); +guint8 *gst_mpeg_descriptor_find (GstMPEGDescriptor * desc, gint tag); +GArray *gst_mpeg_descriptor_find_all (GstMPEGDescriptor * desc, gint tag); -guint8* gst_mpeg_descriptor_nth (GstMPEGDescriptor *desc, guint i); +guint8 *gst_mpeg_descriptor_nth (GstMPEGDescriptor * desc, guint i); #endif /* __GST_MPEG_DESC_H__ */ From 48a699812b5cb25d712d737740e9cf64147c1eac Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Tue, 21 Feb 2012 11:12:53 -0300 Subject: [PATCH 012/138] tsdemux: Clean up AAC caps mess --- gst/mpegtsdemux/tsdemux.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/gst/mpegtsdemux/tsdemux.c b/gst/mpegtsdemux/tsdemux.c index 5be489eb9c..8f3e1e4734 100644 --- a/gst/mpegtsdemux/tsdemux.c +++ b/gst/mpegtsdemux/tsdemux.c @@ -147,9 +147,12 @@ struct _TSDemuxStream GST_STATIC_CAPS ( \ "audio/mpeg, " \ "mpegversion = (int) 1;" \ + "audio/mpeg, " \ + "mpegversion = (int) 2, " \ + "stream-format = (string) adts; " \ "audio/mpeg, " \ "mpegversion = (int) 4, " \ - "stream-format = (string) {adts, loas}; " \ + "stream-format = (string) latm; " \ "audio/x-lpcm, " \ "width = (int) { 16, 20, 24 }, " \ "rate = (int) { 48000, 96000 }, " \ @@ -1116,7 +1119,7 @@ create_pad_for_stream (MpegTSBase * base, MpegTSBaseStream * bstream, template = gst_static_pad_template_get (&audio_template); name = g_strdup_printf ("audio_%04x", bstream->pid); caps = gst_caps_new_simple ("audio/mpeg", - "mpegversion", G_TYPE_INT, 4, + "mpegversion", G_TYPE_INT, 2, "stream-format", G_TYPE_STRING, "adts", NULL); break; case ST_AUDIO_AAC_LATM: @@ -1124,7 +1127,7 @@ create_pad_for_stream (MpegTSBase * base, MpegTSBaseStream * bstream, name = g_strdup_printf ("audio_%04x", bstream->pid); caps = gst_caps_new_simple ("audio/mpeg", "mpegversion", G_TYPE_INT, 4, - "stream-format", G_TYPE_STRING, "loas", NULL); + "stream-format", G_TYPE_STRING, "latm", NULL); break; case ST_VIDEO_MPEG4: template = gst_static_pad_template_get (&video_template); From 6a8d2c45f6d0b0d8d2ef25a639ff35787af4544e Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Thu, 23 Feb 2012 14:46:09 -0300 Subject: [PATCH 013/138] mpegtspacketizer: Estimate clock skew and retimestamps buffers more precisly Apply the EPTLA algotithm to estimate clock skew. Reusing code from -good/gst/rtpmanager/rtpjitterbuffer.c --- gst/mpegtsdemux/mpegtsbase.c | 3 + gst/mpegtsdemux/mpegtspacketizer.c | 314 +++++++++++++++++++++++++++++ gst/mpegtsdemux/mpegtspacketizer.h | 19 ++ 3 files changed, 336 insertions(+) diff --git a/gst/mpegtsdemux/mpegtsbase.c b/gst/mpegtsdemux/mpegtsbase.c index 2b480c02cf..193e84ac70 100644 --- a/gst/mpegtsdemux/mpegtsbase.c +++ b/gst/mpegtsdemux/mpegtsbase.c @@ -1258,6 +1258,9 @@ query_upstream_latency (MpegTSBase * base) GST_WARNING_OBJECT (base, "Failed to query upstream latency"); gst_query_unref (query); base->query_latency = TRUE; + + /* Calculate clock skew for live streams only */ + base->packetizer->calculate_skew = base->upstream_live; } static inline GstFlowReturn diff --git a/gst/mpegtsdemux/mpegtspacketizer.c b/gst/mpegtsdemux/mpegtspacketizer.c index 85eac76628..a7ce40f79f 100644 --- a/gst/mpegtsdemux/mpegtspacketizer.c +++ b/gst/mpegtsdemux/mpegtspacketizer.c @@ -28,6 +28,8 @@ * with newer GLib versions (>= 2.31.0) */ #define GLIB_DISABLE_DEPRECATION_WARNINGS +/* Skew calculation pameters */ +#define MAX_TIME (2 * GST_SECOND) #include "mpegtspacketizer.h" #include "gstmpegdesc.h" @@ -78,6 +80,9 @@ static gchar *convert_to_utf8 (const gchar * text, gint length, guint start, static gchar *get_encoding (const gchar * text, guint * start_text, gboolean * is_multibyte); static gchar *get_encoding_and_convert (const gchar * text, guint length); +static GstClockTime calculate_skew (MpegTSPacketizer2 * packetizer, + guint32 pcrtime, GstClockTime time); +static void mpegts_packetizer_reset_skew (MpegTSPacketizer2 * packetizer); #define CONTINUITY_UNSET 255 #define MAX_CONTINUITY 15 @@ -165,6 +170,8 @@ mpegts_packetizer_init (MpegTSPacketizer2 * packetizer) packetizer->empty = TRUE; packetizer->streams = g_new0 (MpegTSPacketizerStream *, 8192); packetizer->know_packet_size = FALSE; + packetizer->calculate_skew = FALSE; + mpegts_packetizer_reset_skew (packetizer); } static void @@ -262,6 +269,9 @@ mpegts_packetizer_parse_adaptation_field_control (MpegTSPacketizer2 * /* PCR */ if (afcflags & MPEGTS_AFC_PCR_FLAG) { packet->pcr = mpegts_packetizer_compute_pcr (data); + if (packetizer->calculate_skew) + packet->pcr = calculate_skew (packetizer, packet->pcr, + GST_BUFFER_TIMESTAMP (packet->buffer)); *data += 6; } @@ -2736,3 +2746,307 @@ failed: return g_strndup (text, length - start_text); } } + +/** + * mpegts_packetizer_reset_skew: + * @packetizer: an #MpegTSPacketizer2 + * + * Reset the skew calculations in @packetizer. + */ +static void +mpegts_packetizer_reset_skew (MpegTSPacketizer2 * packetizer) +{ + packetizer->base_time = GST_CLOCK_TIME_NONE; + packetizer->base_pcrtime = GST_CLOCK_TIME_NONE; + packetizer->last_pcrtime = GST_CLOCK_TIME_NONE; + packetizer->window_pos = 0; + packetizer->window_filling = TRUE; + packetizer->window_min = 0; + packetizer->skew = 0; + packetizer->prev_send_diff = GST_CLOCK_TIME_NONE; + packetizer->prev_out_time = GST_CLOCK_TIME_NONE; + GST_DEBUG ("reset skew correction"); +} + +static void +mpegts_packetizer_resync (MpegTSPacketizer2 * packetizer, GstClockTime time, + GstClockTime gstpcrtime, gboolean reset_skew) +{ + packetizer->base_time = time; + packetizer->base_pcrtime = gstpcrtime; + packetizer->prev_out_time = GST_CLOCK_TIME_NONE; + packetizer->prev_send_diff = GST_CLOCK_TIME_NONE; + if (reset_skew) { + packetizer->window_filling = TRUE; + packetizer->window_pos = 0; + packetizer->window_min = 0; + packetizer->window_size = 0; + packetizer->skew = 0; + } +} + + +/* Code mostly copied from -good/gst/rtpmanager/rtpjitterbuffer.c */ + +/* 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 (MpegTSPacketizer2 * packetizer, guint32 pcrtime, + GstClockTime time) +{ + guint64 send_diff, recv_diff; + gint64 delta; + gint64 old; + gint pos, i; + GstClockTime gstpcrtime, out_time; + guint64 slope; + + gstpcrtime = PCRTIME_TO_GSTTIME (pcrtime); + + /* keep track of the last extended pcrtime */ + packetizer->last_pcrtime = gstpcrtime; + + /* first time, lock on to time and gstpcrtime */ + if (G_UNLIKELY (!GST_CLOCK_TIME_IS_VALID (packetizer->base_time))) { + packetizer->base_time = time; + packetizer->prev_out_time = GST_CLOCK_TIME_NONE; + GST_DEBUG ("Taking new base time %" GST_TIME_FORMAT, GST_TIME_ARGS (time)); + } + + if (G_UNLIKELY (!GST_CLOCK_TIME_IS_VALID (packetizer->base_pcrtime))) { + packetizer->base_pcrtime = gstpcrtime; + packetizer->prev_send_diff = -1; + GST_DEBUG ("Taking new base pcrtime %" GST_TIME_FORMAT, + GST_TIME_ARGS (gstpcrtime)); + } + + if (G_LIKELY (gstpcrtime >= packetizer->base_pcrtime)) + send_diff = gstpcrtime - packetizer->base_pcrtime; + else if (GST_CLOCK_TIME_IS_VALID (time)) { + /* 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"); + mpegts_packetizer_resync (packetizer, time, gstpcrtime, 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.. */ + packetizer->base_time = -1; + } + + GST_DEBUG ("gstpcr %" GST_TIME_FORMAT ", base %" + GST_TIME_FORMAT ", send_diff %" GST_TIME_FORMAT, + GST_TIME_ARGS (gstpcrtime), GST_TIME_ARGS (packetizer->base_pcrtime), + 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 (!GST_CLOCK_TIME_IS_VALID (time) + || !GST_CLOCK_TIME_IS_VALID (packetizer->base_time)) + goto no_skew; + + /* elapsed time at receiver, includes the jitter */ + recv_diff = time - packetizer->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) */ + slope = recv_diff > 0 ? (send_diff * 8) / recv_diff : 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 (packetizer->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 - packetizer->skew) > GST_SECOND) { + GST_WARNING ("delta - skew: %" GST_TIME_FORMAT " too big, reset skew", + GST_TIME_ARGS (delta - packetizer->skew)); + mpegts_packetizer_resync (packetizer, time, gstpcrtime, TRUE); + send_diff = 0; + delta = 0; + } + + pos = packetizer->window_pos; + + if (G_UNLIKELY (packetizer->window_filling)) { + /* we are filling the window */ + GST_DEBUG ("filling %d, delta %" G_GINT64_FORMAT, pos, delta); + packetizer->window[pos++] = delta; + /* calc the min delta we observed */ + if (G_UNLIKELY (pos == 1 || delta < packetizer->window_min)) + packetizer->window_min = delta; + + if (G_UNLIKELY (send_diff >= MAX_TIME || pos >= MAX_WINDOW)) { + packetizer->window_size = pos; + + /* window filled */ + GST_DEBUG ("min %" G_GINT64_FORMAT, packetizer->window_min); + + /* the skew is now the min */ + packetizer->skew = packetizer->window_min; + packetizer->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. */ + packetizer->skew = + (perc * packetizer->window_min + ((10000 - + perc) * packetizer->skew)) / 10000; + packetizer->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 = packetizer->window[pos]; + packetizer->window[pos++] = delta; + + if (G_UNLIKELY (delta <= packetizer->window_min)) { + /* if the new value we inserted is smaller or equal to the current min, + * it becomes the new min */ + packetizer->window_min = delta; + } else if (G_UNLIKELY (old == packetizer->window_min)) { + gint64 min = G_MAXINT64; + + /* if we removed the old min, we have to find a new min */ + for (i = 0; i < packetizer->window_size; i++) { + /* we found another value equal to the old min, we can stop searching now */ + if (packetizer->window[i] == old) { + min = old; + break; + } + if (packetizer->window[i] < min) + min = packetizer->window[i]; + } + packetizer->window_min = min; + } + /* average the min values */ + packetizer->skew = + (packetizer->window_min + (124 * packetizer->skew)) / 125; + GST_DEBUG ("delta %" G_GINT64_FORMAT ", new min: %" G_GINT64_FORMAT, delta, + packetizer->window_min); + } + /* wrap around in the window */ + if (G_UNLIKELY (pos >= packetizer->window_size)) + pos = 0; + + packetizer->window_pos = pos; + +no_skew: + /* the output time is defined as the base timestamp plus the PCR time + * adjusted for the clock skew .*/ + if (packetizer->base_time != -1) { + out_time = packetizer->base_time + send_diff; + /* skew can be negative and we don't want to make invalid timestamps */ + if (packetizer->skew < 0 && out_time < -packetizer->skew) { + out_time = 0; + } else { + out_time += packetizer->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 (packetizer->prev_out_time != -1 + && packetizer->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 > packetizer->prev_send_diff + && out_time < packetizer->prev_out_time) || + /* if the server timestamps went backwards and the out_time forwards */ + (send_diff < packetizer->prev_send_diff + && out_time > packetizer->prev_out_time) || + /* if the server timestamps did not change */ + send_diff == packetizer->prev_send_diff)) { + GST_DEBUG ("backwards timestamps, using previous time"); + out_time = GSTTIME_TO_MPEGTIME (out_time); + } + } + } else { + /* We simply use the pcrtime without applying any skew compensation */ + out_time = pcrtime; + } + + packetizer->prev_out_time = out_time; + packetizer->prev_send_diff = send_diff; + + GST_DEBUG ("skew %" G_GINT64_FORMAT ", out %" GST_TIME_FORMAT, + packetizer->skew, GST_TIME_ARGS (out_time)); + + return out_time; +} diff --git a/gst/mpegtsdemux/mpegtspacketizer.h b/gst/mpegtsdemux/mpegtspacketizer.h index 832862577d..84da5f647a 100644 --- a/gst/mpegtsdemux/mpegtspacketizer.h +++ b/gst/mpegtsdemux/mpegtspacketizer.h @@ -28,6 +28,8 @@ #include #include +#include "gstmpegdefs.h" + #define MPEGTS_NORMAL_PACKETSIZE 188 #define MPEGTS_M2TS_PACKETSIZE 192 #define MPEGTS_DVB_ASI_PACKETSIZE 204 @@ -39,6 +41,8 @@ #define MPEGTS_AFC_PCR_FLAG 0x10 #define MPEGTS_AFC_OPCR_FLAG 0x08 +#define MAX_WINDOW 512 + G_BEGIN_DECLS #define GST_TYPE_MPEGTS_PACKETIZER \ @@ -79,6 +83,21 @@ struct _MpegTSPacketizer2 { /* current offset of the tip of the adapter */ guint64 offset; gboolean empty; + + /* clock skew calculation */ + gboolean calculate_skew; + GstClockTime base_time; + GstClockTime base_pcrtime; + GstClockTime base_extrtp; + GstClockTime prev_out_time; + GstClockTime last_pcrtime; + gint64 window[MAX_WINDOW]; + guint window_pos; + guint window_size; + gboolean window_filling; + gint64 window_min; + gint64 skew; + gint64 prev_send_diff; }; struct _MpegTSPacketizer2Class { From 939087940c43f4e59eb8d149166c87d72b9574aa Mon Sep 17 00:00:00 2001 From: Edward Hervey Date: Fri, 24 Feb 2012 17:07:43 +0100 Subject: [PATCH 014/138] dvbsrc: Timestamp output by default Allows downstream elements (like demuxers or parsers) to do remote clock rate/skew estimation. --- sys/dvb/gstdvbsrc.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sys/dvb/gstdvbsrc.c b/sys/dvb/gstdvbsrc.c index 0fa673325b..13f5726d85 100644 --- a/sys/dvb/gstdvbsrc.c +++ b/sys/dvb/gstdvbsrc.c @@ -468,6 +468,8 @@ gst_dvbsrc_init (GstDvbSrc * object, GstDvbSrcClass * klass) /* We are a live source */ gst_base_src_set_live (GST_BASE_SRC (object), TRUE); + /* And we wanted timestamped output */ + gst_base_src_set_do_timestamp (GST_BASE_SRC (object), TRUE); object->fd_frontend = -1; object->fd_dvr = -1; @@ -945,7 +947,6 @@ gst_dvbsrc_read_device (GstDvbSrc * object, int size) } GST_BUFFER_SIZE (buf) = count; - GST_BUFFER_TIMESTAMP (buf) = GST_CLOCK_TIME_NONE; return buf; stopped: From 4bc7cd04c109cbe803936297b8d0c096101b168c Mon Sep 17 00:00:00 2001 From: Edward Hervey Date: Fri, 24 Feb 2012 17:47:38 +0100 Subject: [PATCH 015/138] mpegtspacketizer: Fix issues with skew code * Always try to get a timestamp for the algorithm * Remove dead variable * Return proper default value --- gst/mpegtsdemux/mpegtspacketizer.c | 17 ++++++++++------- gst/mpegtsdemux/mpegtspacketizer.h | 1 - 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/gst/mpegtsdemux/mpegtspacketizer.c b/gst/mpegtsdemux/mpegtspacketizer.c index a7ce40f79f..7972493f70 100644 --- a/gst/mpegtsdemux/mpegtspacketizer.c +++ b/gst/mpegtsdemux/mpegtspacketizer.c @@ -81,7 +81,7 @@ static gchar *get_encoding (const gchar * text, guint * start_text, gboolean * is_multibyte); static gchar *get_encoding_and_convert (const gchar * text, guint length); static GstClockTime calculate_skew (MpegTSPacketizer2 * packetizer, - guint32 pcrtime, GstClockTime time); + guint64 pcrtime, GstClockTime time); static void mpegts_packetizer_reset_skew (MpegTSPacketizer2 * packetizer); #define CONTINUITY_UNSET 255 @@ -270,7 +270,8 @@ mpegts_packetizer_parse_adaptation_field_control (MpegTSPacketizer2 * if (afcflags & MPEGTS_AFC_PCR_FLAG) { packet->pcr = mpegts_packetizer_compute_pcr (data); if (packetizer->calculate_skew) - packet->pcr = calculate_skew (packetizer, packet->pcr, + GST_BUFFER_TIMESTAMP (packet->buffer) = + calculate_skew (packetizer, packet->pcr, GST_BUFFER_TIMESTAMP (packet->buffer)); *data += 6; } @@ -2271,6 +2272,8 @@ mpegts_packetizer_next_packet (MpegTSPacketizer2 * packetizer, packetizer->offset += packetizer->packet_size; GST_MEMDUMP ("buffer", GST_BUFFER_DATA (packet->buffer), 16); GST_MEMDUMP ("data_start", packet->data_start, 16); + GST_BUFFER_TIMESTAMP (packet->buffer) = + gst_adapter_prev_timestamp (packetizer->adapter, NULL); /* Check sync byte */ if (G_UNLIKELY (packet->data_start[0] != 0x47)) { @@ -2851,7 +2854,7 @@ mpegts_packetizer_resync (MpegTSPacketizer2 * packetizer, GstClockTime time, * Returns: @time adjusted with the clock skew. */ static GstClockTime -calculate_skew (MpegTSPacketizer2 * packetizer, guint32 pcrtime, +calculate_skew (MpegTSPacketizer2 * packetizer, guint64 pcrtime, GstClockTime time) { guint64 send_diff, recv_diff; @@ -2895,10 +2898,10 @@ calculate_skew (MpegTSPacketizer2 * packetizer, guint32 pcrtime, packetizer->base_time = -1; } - GST_DEBUG ("gstpcr %" GST_TIME_FORMAT ", base %" + GST_DEBUG ("gstpcr %" GST_TIME_FORMAT ", buftime %" GST_TIME_FORMAT ", base %" GST_TIME_FORMAT ", send_diff %" GST_TIME_FORMAT, - GST_TIME_ARGS (gstpcrtime), GST_TIME_ARGS (packetizer->base_pcrtime), - GST_TIME_ARGS (send_diff)); + GST_TIME_ARGS (gstpcrtime), GST_TIME_ARGS (time), + GST_TIME_ARGS (packetizer->base_pcrtime), 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 */ @@ -3039,7 +3042,7 @@ no_skew: } } else { /* We simply use the pcrtime without applying any skew compensation */ - out_time = pcrtime; + out_time = time; } packetizer->prev_out_time = out_time; diff --git a/gst/mpegtsdemux/mpegtspacketizer.h b/gst/mpegtsdemux/mpegtspacketizer.h index 84da5f647a..3b18535e49 100644 --- a/gst/mpegtsdemux/mpegtspacketizer.h +++ b/gst/mpegtsdemux/mpegtspacketizer.h @@ -88,7 +88,6 @@ struct _MpegTSPacketizer2 { gboolean calculate_skew; GstClockTime base_time; GstClockTime base_pcrtime; - GstClockTime base_extrtp; GstClockTime prev_out_time; GstClockTime last_pcrtime; gint64 window[MAX_WINDOW]; From e6ff2f7b8383763806265c78db23879460be076d Mon Sep 17 00:00:00 2001 From: Edward Hervey Date: Fri, 24 Feb 2012 17:52:33 +0100 Subject: [PATCH 016/138] tsdemux: Various code cleanup and dead code removal --- gst/mpegtsdemux/tsdemux.c | 62 ++++++++++----------------------------- 1 file changed, 15 insertions(+), 47 deletions(-) diff --git a/gst/mpegtsdemux/tsdemux.c b/gst/mpegtsdemux/tsdemux.c index 8f3e1e4734..48b819fb5a 100644 --- a/gst/mpegtsdemux/tsdemux.c +++ b/gst/mpegtsdemux/tsdemux.c @@ -305,23 +305,6 @@ gst_ts_demux_class_init (GstTSDemuxClass * klass) ts_class->flush = GST_DEBUG_FUNCPTR (gst_ts_demux_flush); } -static void -gst_ts_demux_init (GstTSDemux * demux, GstTSDemuxClass * klass) -{ - demux->need_newsegment = TRUE; - demux->program_number = -1; - demux->duration = GST_CLOCK_TIME_NONE; - demux->pts_delta = GST_CLOCK_TIME_NONE; - GST_MPEGTS_BASE (demux)->stream_size = sizeof (TSDemuxStream); - gst_segment_init (&demux->segment, GST_FORMAT_TIME); - demux->first_pcr = (TSPcrOffset) { - GST_CLOCK_TIME_NONE, 0, 0}; - demux->cur_pcr = (TSPcrOffset) { - 0}; - demux->last_pcr = (TSPcrOffset) { - 0}; -} - static void gst_ts_demux_reset (MpegTSBase * base) { @@ -345,6 +328,14 @@ gst_ts_demux_reset (MpegTSBase * base) 0}; } +static void +gst_ts_demux_init (GstTSDemux * demux, GstTSDemuxClass * klass) +{ + GST_MPEGTS_BASE (demux)->stream_size = sizeof (TSDemuxStream); + + gst_ts_demux_reset ((MpegTSBase *) demux); +} + static void gst_ts_demux_set_property (GObject * object, guint prop_id, @@ -477,12 +468,10 @@ gst_ts_demux_srcpad_query (GstPad * pad, GstQuery * query) static inline GstClockTime calculate_gsttime (TSPcrOffset * start, guint64 pcr) { - GstClockTime time = start->gsttime; if (start->pcr > pcr) - time += PCRTIME_TO_GSTTIME (PCR_MAX_VALUE - start->pcr) + - PCRTIME_TO_GSTTIME (pcr); + time += PCRTIME_TO_GSTTIME (PCR_MAX_VALUE - start->pcr + pcr); else time += PCRTIME_TO_GSTTIME (pcr - start->pcr); @@ -619,20 +608,13 @@ beach: } static gint -TSPcrOffset_find (gconstpointer a, gconstpointer b, gpointer user_data) +TSPcrOffset_find (TSPcrOffset * a, TSPcrOffset * b, gpointer user_data) { - -/* GST_INFO ("a: %" GST_TIME_FORMAT " offset: %" G_GINT64_FORMAT, */ -/* GST_TIME_ARGS (((TSPcrOffset *) a)->gsttime), ((TSPcrOffset *) a)->offset); */ -/* GST_INFO ("b: %" GST_TIME_FORMAT " offset: %" G_GINT64_FORMAT, */ -/* GST_TIME_ARGS (((TSPcrOffset *) b)->gsttime), ((TSPcrOffset *) b)->offset); */ - - if (((TSPcrOffset *) a)->gsttime < ((TSPcrOffset *) b)->gsttime) + if (a->gsttime < b->gsttime) return -1; - else if (((TSPcrOffset *) a)->gsttime > ((TSPcrOffset *) b)->gsttime) + if (a->gsttime > b->gsttime) return 1; - else - return 0; + return 0; } static GstFlowReturn @@ -664,8 +646,8 @@ gst_ts_demux_perform_seek (MpegTSBase * base, GstSegment * segment, guint16 pid) /* get the first index entry before the seek position */ tmp = gst_util_array_binary_search (demux->index->data, demux->index_size, - sizeof (*tmp), TSPcrOffset_find, GST_SEARCH_MODE_BEFORE, &seekpcroffset, - NULL); + sizeof (*tmp), (GCompareDataFunc) TSPcrOffset_find, + GST_SEARCH_MODE_BEFORE, &seekpcroffset, NULL); if (G_UNLIKELY (!tmp)) { GST_ERROR ("value not found"); @@ -1796,7 +1778,6 @@ process_pcr (MpegTSBase * base, guint64 initoff, TSPcrOffset * pcroffset, gst_byte_reader_init_from_buffer (&br, buf); - offset = 0; size = GST_BUFFER_SIZE (buf); resync: @@ -2045,19 +2026,6 @@ calc_gsttime_from_pts (TSPcrOffset * start, guint64 pts) return time; } -#if 0 -static gint -TSPcrOffset_find_offset (gconstpointer a, gconstpointer b, gpointer user_data) -{ - if (((TSPcrOffset *) a)->offset < ((TSPcrOffset *) b)->offset) - return -1; - else if (((TSPcrOffset *) a)->offset > ((TSPcrOffset *) b)->offset) - return 1; - else - return 0; -} -#endif - static GstFlowReturn gst_ts_demux_parse_pes_header (GstTSDemux * demux, TSDemuxStream * stream) { From b6d98aea5f4f7ccb4aba7286605d525c5b3950f9 Mon Sep 17 00:00:00 2001 From: Edward Hervey Date: Fri, 24 Feb 2012 17:53:52 +0100 Subject: [PATCH 017/138] tsdemux: Use new clock skew estimation for outgoing timestamps Only used in live mode --- gst/mpegtsdemux/tsdemux.c | 67 ++++++++++++--------------------------- 1 file changed, 20 insertions(+), 47 deletions(-) diff --git a/gst/mpegtsdemux/tsdemux.c b/gst/mpegtsdemux/tsdemux.c index 48b819fb5a..357aafd328 100644 --- a/gst/mpegtsdemux/tsdemux.c +++ b/gst/mpegtsdemux/tsdemux.c @@ -315,11 +315,14 @@ gst_ts_demux_reset (MpegTSBase * base) demux->index = NULL; } demux->index_size = 0; + demux->need_newsegment = TRUE; demux->program_number = -1; + demux->duration = GST_CLOCK_TIME_NONE; - demux->pts_delta = GST_CLOCK_TIME_NONE; + gst_segment_init (&demux->segment, GST_FORMAT_TIME); + demux->first_pcr = (TSPcrOffset) { GST_CLOCK_TIME_NONE, 0, 0}; demux->cur_pcr = (TSPcrOffset) { @@ -2037,11 +2040,9 @@ gst_ts_demux_parse_pes_header (GstTSDemux * demux, TSDemuxStream * stream) guint32 length; guint64 bufferoffset; PESParsingResult parseres; - GstClockTime origts; data = GST_BUFFER_DATA (stream->pendingbuffers[0]); length = GST_BUFFER_SIZE (stream->pendingbuffers[0]); - origts = GST_BUFFER_TIMESTAMP (stream->pendingbuffers[0]); bufferoffset = GST_BUFFER_OFFSET (stream->pendingbuffers[0]); GST_MEMDUMP ("Header buffer", data, MIN (length, 32)); @@ -2061,45 +2062,11 @@ gst_ts_demux_parse_pes_header (GstTSDemux * demux, TSDemuxStream * stream) if (header.PTS != -1) { gst_ts_demux_record_pts (demux, stream, header.PTS, bufferoffset); -#if 0 - /* WTH IS THIS ??? */ - if (demux->index_pcr.offset + PCR_WRAP_SIZE_128KBPS + 1000 * 128 < offset - || (demux->index_pcr.offset > offset)) { - /* find next entry */ - TSPcrOffset *next; - demux->index_pcr.offset = offset; - next = gst_util_array_binary_search (demux->index->data, - demux->index_size, sizeof (*next), TSPcrOffset_find_offset, - GST_SEARCH_MODE_BEFORE, &demux->index_pcr, NULL); - if (next) { - GST_INFO ("new index_pcr %" GST_TIME_FORMAT " offset: %" - G_GINT64_FORMAT, GST_TIME_ARGS (next->gsttime), next->offset); - - demux->index_pcr = *next; - } - } - time = calc_gsttime_from_pts (&demux->index_pcr, pts); -#endif - GST_DEBUG_OBJECT (base, "stream PTS %" GST_TIME_FORMAT " DTS %" GST_TIME_FORMAT, GST_TIME_ARGS (stream->pts), GST_TIME_ARGS (MPEGTIME_TO_GSTTIME (header.DTS))); - /* FIXME : This will only work if the PES header is contained - * at the beginning of an incoming GstBuffer */ - if (base->upstream_live && GST_CLOCK_TIME_IS_VALID (origts) - && !GST_CLOCK_TIME_IS_VALID (demux->pts_delta)) { - if (header.DTS != -1) - demux->pts_delta = MPEGTIME_TO_GSTTIME (header.DTS) - origts; - else - demux->pts_delta = stream->pts - origts; - GST_DEBUG_OBJECT (base, "buffer timestamp %" GST_TIME_FORMAT, - GST_TIME_ARGS (origts)); - GST_DEBUG_OBJECT (base, "delta %" GST_TIME_FORMAT, - GST_TIME_ARGS (demux->pts_delta)); - } - /* safe default if insufficient upstream info */ if (G_UNLIKELY (!GST_CLOCK_TIME_IS_VALID (base->in_gap) && GST_CLOCK_TIME_IS_VALID (base->first_buf_ts) && @@ -2129,13 +2096,17 @@ gst_ts_demux_parse_pes_header (GstTSDemux * demux, TSDemuxStream * stream) base->in_gap = 0; if (base->upstream_live) { - if (GST_CLOCK_TIME_IS_VALID (demux->pts_delta)) + MpegTSPacketizer2 *packetizer = base->packetizer; + + if (GST_CLOCK_TIME_IS_VALID (packetizer->base_time)) GST_BUFFER_TIMESTAMP (stream->pendingbuffers[0]) = - stream->pts - demux->pts_delta; + stream->pts - packetizer->base_pcrtime + packetizer->base_time + + packetizer->skew; else GST_BUFFER_TIMESTAMP (stream->pendingbuffers[0]) = GST_CLOCK_TIME_NONE; } else - GST_BUFFER_TIMESTAMP (stream->pendingbuffers[0]) = stream->pts + base->in_gap; + GST_BUFFER_TIMESTAMP (stream->pendingbuffers[0]) = + stream->pts + base->in_gap; GST_DEBUG ("buf %" GST_TIME_FORMAT, GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (stream->pendingbuffers[0]))); } @@ -2317,6 +2288,7 @@ gst_ts_demux_push_pending_data (GstTSDemux * demux, TSDemuxStream * stream) MpegTSBaseStream *bs = (MpegTSBaseStream *) stream; /* MpegTSBase *base = (MpegTSBase*) demux; */ GstBuffer *firstbuffer = NULL; + MpegTSPacketizer2 *packetizer = ((MpegTSBase *) demux)->packetizer; GST_DEBUG_OBJECT (stream->pad, "stream:%p, pid:0x%04x stream_type:%d state:%d", stream, bs->pid, @@ -2354,13 +2326,14 @@ gst_ts_demux_push_pending_data (GstTSDemux * demux, TSDemuxStream * stream) firstbuffer = gst_buffer_list_get (stream->current, 0, 0); - GST_DEBUG_OBJECT (stream->pad, - "delta %" GST_TIME_FORMAT " stream->pts %" GST_TIME_FORMAT, - GST_TIME_ARGS (demux->pts_delta), GST_TIME_ARGS (stream->pts)); - if (GST_CLOCK_TIME_IS_VALID (demux->pts_delta) - && GST_CLOCK_TIME_IS_VALID (stream->pts) - && !GST_CLOCK_TIME_IS_VALID (GST_BUFFER_TIMESTAMP (firstbuffer))) { - GST_BUFFER_TIMESTAMP (firstbuffer) = stream->pts - demux->pts_delta; + GST_DEBUG_OBJECT (stream->pad, "stream->pts %" GST_TIME_FORMAT, + GST_TIME_ARGS (stream->pts)); + if (GST_CLOCK_TIME_IS_VALID (stream->pts) + && !GST_CLOCK_TIME_IS_VALID (GST_BUFFER_TIMESTAMP (firstbuffer)) + && GST_CLOCK_TIME_IS_VALID (packetizer->base_time)) { + GST_BUFFER_TIMESTAMP (firstbuffer) = + stream->pts - packetizer->base_pcrtime + packetizer->base_time + + packetizer->skew; } GST_DEBUG_OBJECT (stream->pad, From f977d7e743c3523687958446f6c4a455f67e0edd Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Fri, 24 Feb 2012 15:26:21 -0300 Subject: [PATCH 018/138] tsdemux: Avoid unlinkely leaks and segfault --- gst/mpegtsdemux/tsdemux.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/gst/mpegtsdemux/tsdemux.c b/gst/mpegtsdemux/tsdemux.c index 357aafd328..5b70c44bbd 100644 --- a/gst/mpegtsdemux/tsdemux.c +++ b/gst/mpegtsdemux/tsdemux.c @@ -1270,10 +1270,13 @@ create_pad_for_stream (MpegTSBase * base, MpegTSBaseStream * bstream, gst_pad_set_query_type_function (pad, gst_ts_demux_srcpad_query_types); gst_pad_set_query_function (pad, gst_ts_demux_srcpad_query); gst_pad_set_event_function (pad, gst_ts_demux_srcpad_event); - gst_caps_unref (caps); } - g_free (name); + if (name) + g_free (name); + + if (caps) + gst_caps_unref (caps); return pad; } From 336710d355c598cedb126b318680b44ab082b24e Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Fri, 24 Feb 2012 19:08:40 -0300 Subject: [PATCH 019/138] tsbase: Fix parsing of PSI table IDs (Ported from mpegtsdemux d8fd874f5290e4911437120057ee885cdb68b4af) --- gst/mpegtsdemux/mpegtsbase.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/gst/mpegtsdemux/mpegtsbase.c b/gst/mpegtsdemux/mpegtsbase.c index 193e84ac70..853eb9ff88 100644 --- a/gst/mpegtsdemux/mpegtsbase.c +++ b/gst/mpegtsdemux/mpegtsbase.c @@ -680,7 +680,7 @@ gboolean mpegts_base_is_psi (MpegTSBase * base, MpegTSPacketizerPacket * packet) { gboolean retval = FALSE; - guint8 table_id; + guint8 *data, table_id, pointer; int i; static const guint8 si_tables[] = { 0x00, 0x01, 0x02, 0x03, 0x40, 0x41, 0x42, 0x46, 0x4A, @@ -699,6 +699,18 @@ mpegts_base_is_psi (MpegTSBase * base, MpegTSPacketizerPacket * packet) if (!retval) { if (packet->payload_unit_start_indicator) { + data = packet->data; + pointer = *data++; + data += pointer; + /* 'pointer' value may be invalid on malformed packet + * so we need to avoid out of range + */ + if (!(data < packet->data_end)) { + GST_WARNING_OBJECT (base, + "Wrong offset when retrieving table id: 0x%x", pointer); + return FALSE; + } + table_id = *(packet->data); i = 0; while (si_tables[i] != TABLE_ID_UNSET) { From 58a210e3d33498454c41158a1106955705c23773 Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Mon, 27 Feb 2012 09:42:27 -0300 Subject: [PATCH 020/138] mpegtspacketizer: support more character set encodings Support UTF-16BE, EUC-KR (KSX1001), GB2312 and ISO-10646/UTF8 text encoding and fixed new line for multibyte encoding https://bugzilla.gnome.org/show_bug.cgi?id=664257 (Port of 9759d66407f2be8ec29975b0eff3230bb1dae0ef from the mpegtsdemux element) --- gst/mpegtsdemux/mpegtspacketizer.c | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/gst/mpegtsdemux/mpegtspacketizer.c b/gst/mpegtsdemux/mpegtspacketizer.c index 7972493f70..2453d35d32 100644 --- a/gst/mpegtsdemux/mpegtspacketizer.c +++ b/gst/mpegtsdemux/mpegtspacketizer.c @@ -2542,13 +2542,22 @@ get_encoding (const gchar * text, guint * start_text, gboolean * is_multibyte) *start_text = 1; *is_multibyte = TRUE; } else if (firstbyte == 0x12) { - /* That's korean encoding. - * The spec says it's encoded in KSC 5601, but iconv only knows KSC 5636. - * Couldn't find any information about either of them. - */ - encoding = NULL; + /* EUC-KR implements KSX1001 */ + encoding = g_strdup ("EUC-KR"); *start_text = 1; *is_multibyte = TRUE; + } else if (firstbyte == 0x13) { + encoding = g_strdup ("GB2312"); + *start_text = 1; + *is_multibyte = FALSE; + } else if (firstbyte == 0x14) { + encoding = g_strdup ("UTF-16BE"); + *start_text = 1; + *is_multibyte = TRUE; + } else if (firstbyte == 0x15) { + encoding = g_strdup ("ISO-10646/UTF8"); + *start_text = 1; + *is_multibyte = FALSE; } else { /* reserved */ encoding = NULL; @@ -2600,7 +2609,7 @@ convert_to_utf8 (const gchar * text, gint length, guint start, /* skip it */ break; case 0xE08A:{ - guint8 nl[] = { 0x0A, 0x00 }; /* new line */ + guint8 nl[] = { 0x00, 0x0A }; /* new line */ g_byte_array_append (sb, nl, 2); break; } @@ -2621,7 +2630,7 @@ convert_to_utf8 (const gchar * text, gint length, guint start, /* skip it */ break; case 0xE08A:{ - guint8 nl[] = { 0x0A, 0x00 }; /* new line */ + guint8 nl[] = { 0x00, 0x0A }; /* new line */ g_byte_array_append (sb, nl, 2); break; } From 5c2e6dc5125451e2b7b98bf0fc8222e880aeaa65 Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Mon, 27 Feb 2012 09:45:29 -0300 Subject: [PATCH 021/138] mpegtspacketizer: catch section lengths extending past the buffer length This is probably the cause for an occasional crash while streaming MPEG. Blind fix after staring at the code and following logic, so may or may not fix the issue, I cannot test. (Port of 4275a70cb55d375afa702917f7359ec117ed49d4 from mpegdemux) --- gst/mpegtsdemux/mpegtspacketizer.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/gst/mpegtsdemux/mpegtspacketizer.c b/gst/mpegtsdemux/mpegtspacketizer.c index 2453d35d32..1bc9356406 100644 --- a/gst/mpegtsdemux/mpegtspacketizer.c +++ b/gst/mpegtsdemux/mpegtspacketizer.c @@ -2356,6 +2356,12 @@ mpegts_packetizer_push_section (MpegTSPacketizer2 * packetizer, if (packet->pid == 0x14) { table_id = data[0]; section->section_length = GST_READ_UINT24_BE (data) & 0x000FFF; + if (data - GST_BUFFER_DATA (packet->buffer) + section->section_length + 3 > + GST_BUFFER_SIZE (packet->buffer)) { + GST_WARNING ("PID %dd PSI section length extends past the end " + "of the buffer", packet->pid); + goto out; + } section->buffer = gst_buffer_create_sub (packet->buffer, data - GST_BUFFER_DATA (packet->buffer), section->section_length + 3); section->table_id = table_id; From 5b0d2ce2b27d186b5318ce74af7ec942c10173e3 Mon Sep 17 00:00:00 2001 From: Xavier Queralt Date: Fri, 24 Feb 2012 09:54:35 +0100 Subject: [PATCH 022/138] hlsdemux: don't fail for playlists smaller than fragments-cache https://bugzilla.gnome.org/show_bug.cgi?id=670963 --- gst/hls/gsthlsdemux.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/gst/hls/gsthlsdemux.c b/gst/hls/gsthlsdemux.c index d0f77a39ac..15f0bfa6c6 100644 --- a/gst/hls/gsthlsdemux.c +++ b/gst/hls/gsthlsdemux.c @@ -1067,6 +1067,8 @@ gst_hls_demux_cache_fragments (GstHLSDemux * demux) gst_m3u8_client_get_target_duration (demux->client) / GST_SECOND * G_USEC_PER_SEC); if (!gst_hls_demux_get_next_fragment (demux)) { + if (demux->end_of_playlist) + break; if (!demux->cancelled) GST_ERROR_OBJECT (demux, "Error caching the first fragments"); return FALSE; From ddfcfb5a7a6f708ad3518e9e7a2e67f9568f61da Mon Sep 17 00:00:00 2001 From: Guillaume Desmottes Date: Tue, 28 Feb 2012 16:27:55 +0100 Subject: [PATCH 023/138] Add missing GLIB_DISABLE_DEPRECATION_WARNINGS Suppress warnings about deprecated threading and GValueArray API, so git compiles with -Werror. https://bugzilla.gnome.org/show_bug.cgi?id=670982 --- gst/mpegdemux/flutspmtinfo.c | 4 ++++ gst/mpegdemux/flutspmtstreaminfo.c | 4 ++++ gst/mpegdemux/gstmpegtsdemux.c | 4 ++++ gst/mpegdemux/mpegtspacketizer.c | 4 ++++ gst/rawparse/gstaudioparse.c | 4 ++++ sys/dvb/camutils.c | 4 ++++ tests/examples/opencv/gst_element_print_properties.c | 4 ++++ tests/examples/scaletempo/demo-gui.c | 4 ++++ 8 files changed, 32 insertions(+) diff --git a/gst/mpegdemux/flutspmtinfo.c b/gst/mpegdemux/flutspmtinfo.c index 65402e738d..5b25e258c7 100644 --- a/gst/mpegdemux/flutspmtinfo.c +++ b/gst/mpegdemux/flutspmtinfo.c @@ -45,6 +45,10 @@ #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 "flutspmtinfo.h" diff --git a/gst/mpegdemux/flutspmtstreaminfo.c b/gst/mpegdemux/flutspmtstreaminfo.c index 7ab5ba43c8..95177f82fb 100644 --- a/gst/mpegdemux/flutspmtstreaminfo.c +++ b/gst/mpegdemux/flutspmtstreaminfo.c @@ -45,6 +45,10 @@ #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 "flutspmtstreaminfo.h" diff --git a/gst/mpegdemux/gstmpegtsdemux.c b/gst/mpegdemux/gstmpegtsdemux.c index 012c1cc716..cdfe081d66 100644 --- a/gst/mpegdemux/gstmpegtsdemux.c +++ b/gst/mpegdemux/gstmpegtsdemux.c @@ -45,6 +45,10 @@ #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 diff --git a/gst/mpegdemux/mpegtspacketizer.c b/gst/mpegdemux/mpegtspacketizer.c index ed1d0ac0e6..089254d2f6 100644 --- a/gst/mpegdemux/mpegtspacketizer.c +++ b/gst/mpegdemux/mpegtspacketizer.c @@ -22,6 +22,10 @@ * Boston, MA 02111-1307, USA. */ +/* 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 "mpegtspacketizer.h" diff --git a/gst/rawparse/gstaudioparse.c b/gst/rawparse/gstaudioparse.c index d4f82bad42..12c50975f7 100644 --- a/gst/rawparse/gstaudioparse.c +++ b/gst/rawparse/gstaudioparse.c @@ -28,6 +28,10 @@ # 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 "gstaudioparse.h" #include diff --git a/sys/dvb/camutils.c b/sys/dvb/camutils.c index b3062b5976..721b5cd96d 100644 --- a/sys/dvb/camutils.c +++ b/sys/dvb/camutils.c @@ -21,6 +21,10 @@ * Boston, MA 02111-1307, USA. */ +/* 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 diff --git a/tests/examples/opencv/gst_element_print_properties.c b/tests/examples/opencv/gst_element_print_properties.c index 4192fe84e1..3d7ae78eb2 100644 --- a/tests/examples/opencv/gst_element_print_properties.c +++ b/tests/examples/opencv/gst_element_print_properties.c @@ -20,6 +20,10 @@ * */ +/* 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 diff --git a/tests/examples/scaletempo/demo-gui.c b/tests/examples/scaletempo/demo-gui.c index 61a5a66eb6..9afce890ab 100644 --- a/tests/examples/scaletempo/demo-gui.c +++ b/tests/examples/scaletempo/demo-gui.c @@ -19,6 +19,10 @@ #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 From b5004e058b6da66dd3f5808b5e67bad8b29bf4cd Mon Sep 17 00:00:00 2001 From: Xavier Queralt Date: Tue, 14 Feb 2012 11:57:00 +0100 Subject: [PATCH 024/138] hlsdemux: don't set the fetcher's location twice Calling gst_element_make_from_uri already does it and filesrc fails when using file protocol in a location --- gst/hls/gsthlsdemux.c | 1 - 1 file changed, 1 deletion(-) diff --git a/gst/hls/gsthlsdemux.c b/gst/hls/gsthlsdemux.c index 15f0bfa6c6..afafacaf04 100644 --- a/gst/hls/gsthlsdemux.c +++ b/gst/hls/gsthlsdemux.c @@ -845,7 +845,6 @@ gst_hls_demux_make_fetcher_locked (GstHLSDemux * demux, const gchar * uri) demux->stopping_fetcher = FALSE; gst_element_set_bus (GST_ELEMENT (demux->fetcher), demux->fetcher_bus); - g_object_set (G_OBJECT (demux->fetcher), "location", uri, NULL); pad = gst_element_get_static_pad (demux->fetcher, "src"); if (pad) { gst_pad_link (pad, demux->fetcherpad); From d920d9d64f3d3aa7f3910c9763bfd0fd728335b9 Mon Sep 17 00:00:00 2001 From: Edward Hervey Date: Wed, 29 Feb 2012 10:33:00 +0100 Subject: [PATCH 025/138] tsdemux: Remove all seeking code It was more than bogus --- gst/mpegtsdemux/Makefile.am | 2 - gst/mpegtsdemux/mpegtsbase.c | 15 +- gst/mpegtsdemux/mpegtsbase.h | 4 +- gst/mpegtsdemux/mpegtsparse.c | 3 +- gst/mpegtsdemux/payload_parsers.c | 313 ----------- gst/mpegtsdemux/payload_parsers.h | 36 -- gst/mpegtsdemux/tsdemux.c | 899 +----------------------------- gst/mpegtsdemux/tsdemux.h | 21 +- 8 files changed, 27 insertions(+), 1266 deletions(-) delete mode 100644 gst/mpegtsdemux/payload_parsers.c delete mode 100644 gst/mpegtsdemux/payload_parsers.h diff --git a/gst/mpegtsdemux/Makefile.am b/gst/mpegtsdemux/Makefile.am index 55b57d9600..ced0eacee5 100644 --- a/gst/mpegtsdemux/Makefile.am +++ b/gst/mpegtsdemux/Makefile.am @@ -6,7 +6,6 @@ libgstmpegtsdemux_la_SOURCES = \ mpegtsbase.c \ mpegtspacketizer.c \ mpegtsparse.c \ - payload_parsers.c \ tsdemux.c \ pesparse.c @@ -25,7 +24,6 @@ noinst_HEADERS = \ mpegtsbase.h \ mpegtspacketizer.h \ mpegtsparse.h \ - payload_parsers.h \ tsdemux.h \ pesparse.h diff --git a/gst/mpegtsdemux/mpegtsbase.c b/gst/mpegtsdemux/mpegtsbase.c index 853eb9ff88..ee46e64266 100644 --- a/gst/mpegtsdemux/mpegtsbase.c +++ b/gst/mpegtsdemux/mpegtsbase.c @@ -1478,8 +1478,6 @@ mpegts_base_handle_seek_event (MpegTSBase * base, GstPad * pad, GstSeekFlags flags; GstSeekType start_type, stop_type; gint64 start, stop; - gchar *pad_name; - guint16 pid = 0; gst_event_parse_seek (event, &rate, &format, &flags, &start_type, &start, &stop_type, &stop); @@ -1498,17 +1496,6 @@ mpegts_base_handle_seek_event (MpegTSBase * base, GstPad * pad, " stop: %" GST_TIME_FORMAT, rate, GST_TIME_ARGS (start), GST_TIME_ARGS (stop)); - /* extract the pid from the pad name */ - pad_name = gst_pad_get_name (pad); - if (pad_name) { - gchar *pidstr = g_strrstr (pad_name, "_"); - if (pidstr) { - pidstr++; - pid = g_ascii_strtoull (pidstr, NULL, 16); - } - g_free (pad_name); - } - flush = flags & GST_SEEK_FLAG_FLUSH; if (base->mode == BASE_MODE_PUSHING) { @@ -1543,7 +1530,7 @@ mpegts_base_handle_seek_event (MpegTSBase * base, GstPad * pad, if (format == GST_FORMAT_TIME) { /* If the subclass can seek, do that */ if (klass->seek) { - ret = klass->seek (base, event, pid); + ret = klass->seek (base, event); if (G_UNLIKELY (ret != GST_FLOW_OK)) { GST_WARNING ("seeking failed %s", gst_flow_get_name (ret)); goto done; diff --git a/gst/mpegtsdemux/mpegtsbase.h b/gst/mpegtsdemux/mpegtsbase.h index 499ea6a318..9e6363e424 100644 --- a/gst/mpegtsdemux/mpegtsbase.h +++ b/gst/mpegtsdemux/mpegtsbase.h @@ -48,6 +48,8 @@ G_BEGIN_DECLS #define GST_MPEGTS_BASE_GET_CLASS(obj) \ (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_MPEGTS_BASE, MpegTSBaseClass)) +#define MPEG_TS_BASE_PACKETIZER(b) (((MpegTSBase*)b)->packetizer) + typedef struct _MpegTSBase MpegTSBase; typedef struct _MpegTSBaseClass MpegTSBaseClass; typedef struct _MpegTSBaseStream MpegTSBaseStream; @@ -168,7 +170,7 @@ struct _MpegTSBaseClass { GstFlowReturn (*find_timestamps) (MpegTSBase * base, guint64 initoff, guint64 *offset); /* seek is called to wait for seeking */ - GstFlowReturn (*seek) (MpegTSBase * base, GstEvent * event, guint16 pid); + GstFlowReturn (*seek) (MpegTSBase * base, GstEvent * event); /* flush all streams */ void (*flush) (MpegTSBase * base); diff --git a/gst/mpegtsdemux/mpegtsparse.c b/gst/mpegtsdemux/mpegtsparse.c index 26dde896ad..37b6da6e98 100644 --- a/gst/mpegtsdemux/mpegtsparse.c +++ b/gst/mpegtsdemux/mpegtsparse.c @@ -126,8 +126,7 @@ mpegts_parse_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, - &program_template); + gst_element_class_add_static_pad_template (element_class, &program_template); gst_element_class_set_details_simple (element_class, "MPEG transport stream parser", "Codec/Parser", diff --git a/gst/mpegtsdemux/payload_parsers.c b/gst/mpegtsdemux/payload_parsers.c deleted file mode 100644 index ca2c75efd4..0000000000 --- a/gst/mpegtsdemux/payload_parsers.c +++ /dev/null @@ -1,313 +0,0 @@ -/* - * payload_parsers.c - * Copyright (C) 2011 Janne Grunau - * - * Authors: - * Janne Grunau - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * 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 "payload_parsers.h" -#include - -#define PICTURE_START_CODE 0x00000100 -#define GROUP_START_CODE 0x000001B8 - -#define SLICE_NAL_UNIT_TYPE 0x01 -#define SLICE_IDR_NAL_UNIT_TYPE 0x05 -#define SEI_NAL_UNIT_TYPE 0x06 - -#define SEI_TYPE_RECOVERY_POINT 0x06 - -typedef struct Mpeg2PictureHeader -{ - guint16 temporal_reference; - guint8 picture_coding_type; - guint16 vbv_delay; - - /* picture_coding_type == 2 || picture_coding_type */ - guint8 full_pel_forward_vector; - guint8 forward_f_code; - - /* picture_coding_type == 3 */ - guint8 full_pel_backward_vector; - guint8 backward_f_code; -} Mpeg2PictureHeader; - -/* shortened slice header */ -typedef struct H264SliceHeader -{ - guint32 first_mb_in_slice; - guint8 slice_type; -} H264SliceHeader; - - -static guint8 * -find_start_code (guint32 * start_code, guint8 * buffer, guint8 * buffer_end) -{ - if (G_UNLIKELY (buffer == NULL) || G_UNLIKELY (buffer_end == NULL) - || G_UNLIKELY (start_code == NULL)) - return NULL; - - while (buffer <= buffer_end) { - - *start_code <<= 8; - *start_code |= *buffer++; - - if ((*start_code & 0xffffff00) == 0x00000100) - return buffer; - } - - return NULL; -} - -static gboolean -parse_mpeg2_picture_header (Mpeg2PictureHeader * hdr, guint8 * buffer, - guint8 * buffer_end) -{ - GstBitReader br = GST_BIT_READER_INIT (buffer, buffer_end - buffer); - - if (gst_bit_reader_get_remaining (&br) < 40) - return FALSE; - - hdr->temporal_reference = gst_bit_reader_get_bits_uint16_unchecked (&br, 10); - hdr->picture_coding_type = gst_bit_reader_get_bits_uint8_unchecked (&br, 3); - hdr->vbv_delay = gst_bit_reader_get_bits_uint16_unchecked (&br, 16); - - if (hdr->picture_coding_type == 2 || hdr->picture_coding_type == 3) { - hdr->full_pel_forward_vector = - gst_bit_reader_get_bits_uint8_unchecked (&br, 1); - hdr->forward_f_code = gst_bit_reader_get_bits_uint8_unchecked (&br, 3); - } - if (hdr->picture_coding_type == 3) { - hdr->full_pel_backward_vector = - gst_bit_reader_get_bits_uint8_unchecked (&br, 1); - hdr->backward_f_code = gst_bit_reader_get_bits_uint8_unchecked (&br, 3); - } - return TRUE; -} - -gboolean -gst_tsdemux_has_mpeg2_keyframe (guint32 * state, - MpegTSPacketizerPacket * packet, gboolean * need_more) -{ - guint8 *data = packet->payload; - guint8 *data_end = packet->data_end; - - GST_LOG ("state: 0x%08x", *state); - - while (data <= data_end) { - - data = find_start_code (state, data, data_end); - - if (!data) - return FALSE; - - GST_LOG ("found start code: 0x%08x", *state); - - if (*state == GROUP_START_CODE) { - GST_DEBUG ("found group start code"); - *state = 0xffffffff; - *need_more = FALSE; - return TRUE; - } else if (*state == PICTURE_START_CODE) { - Mpeg2PictureHeader hdr = { 0 }; - gboolean success; - - success = parse_mpeg2_picture_header (&hdr, data, data_end); - GST_DEBUG ("found picture start code, %sparsed, picture coding type: %d", - success ? "" : "not ", hdr.picture_coding_type); - - *state = 0xffffffff; - *need_more = FALSE; - return success && hdr.picture_coding_type == 1; - } - } - - return FALSE; -} - -/* variable length Exp-Golomb parsing according to H.264 spec 9.1*/ -static gboolean -read_golomb (GstBitReader * br, guint32 * value) -{ - guint8 b, leading_zeros = -1; - *value = 1; - - for (b = 0; !b; leading_zeros++) { - if (!gst_bit_reader_get_bits_uint8 (br, &b, 1)) - return FALSE; - *value *= 2; - } - - *value = (*value >> 1) - 1; - if (leading_zeros > 0) { - guint32 tmp = 0; - if (!gst_bit_reader_get_bits_uint32 (br, &tmp, leading_zeros)) - return FALSE; - *value += tmp; - } - - return TRUE; -} - -/* just parse the requirred bits of the slice header */ -static gboolean -parse_h264_slice_header (H264SliceHeader * hdr, guint8 * buffer, - guint8 * buffer_end) -{ - guint32 value; - GstBitReader br = GST_BIT_READER_INIT (buffer, buffer_end - buffer); - - if (!read_golomb (&br, &value)) - return FALSE; - hdr->first_mb_in_slice = value; - - if (!read_golomb (&br, &value)) - return FALSE; - hdr->slice_type = value; - - return TRUE; -} - -enum H264SliceTypes -{ - h264_p_slice = 0, - h264_b_slice, - h264_i_slice, - h264_sp_slice, - h264_si_slice, - h264_p_slice_a, - h264_b_slice_a, - h264_i_slice_a, - h264_sp_slice_a, - h264_si_slice_a, -}; - -static gboolean -is_key_slice (guint8 slice_type) -{ - switch (slice_type) { - case h264_i_slice: - case h264_si_slice: - case h264_i_slice_a: - case h264_si_slice_a: - return TRUE; - } - return FALSE; -} - -gboolean -gst_tsdemux_has_h264_keyframe (guint32 * state, MpegTSPacketizerPacket * packet, - gboolean * need_more) -{ - guint8 *data = packet->payload; - guint8 *data_end = packet->data_end; - - GST_LOG ("state: 0x%08x", *state); - - while (data <= data_end) { - guint8 nal_unit_type; - guint8 *next_data = NULL; - - data = find_start_code (state, data, data_end); - - if (!data) - goto beach; - - GST_LOG ("found start code: 0x%08x", *state); - - /* determine length */ - nal_unit_type = *state & 0x1f; - next_data = find_start_code (state, data, data_end); - - if (nal_unit_type == SEI_NAL_UNIT_TYPE && !next_data) { - GST_WARNING ("NAL unit 0x%02x not completely in ts packet", - nal_unit_type); - goto beach; - } - next_data -= 4; - - switch (nal_unit_type) { - case SLICE_IDR_NAL_UNIT_TYPE: - GST_DEBUG ("found SLICE_IDR NAL unit type"); - *state = 0xffffffff; - *need_more = FALSE; - return TRUE; - case SLICE_NAL_UNIT_TYPE: - { - H264SliceHeader hdr = { 0 }; - gboolean success; - - success = parse_h264_slice_header (&hdr, data, data_end); - GST_DEBUG ("found SLICE NAL unit type with slice type %d", - hdr.slice_type); - - *state = 0xffffffff; - *need_more = FALSE; - return success && is_key_slice (hdr.slice_type); - } - case SEI_NAL_UNIT_TYPE: - { - guint32 recovery_frame_count; - GstBitReader br = GST_BIT_READER_INIT (data, next_data - data); - - break; - - /* SEI message is at least 24 bit long */ - while (gst_bit_reader_get_remaining (&br) >= 24) { - gint type = 0, size = 0; - guint8 tmp = 0; - - do { - if (!gst_bit_reader_get_bits_uint8 (&br, &tmp, 8)) - goto beach; - type += tmp; - } while (tmp == 255); - - do { - if (!gst_bit_reader_get_bits_uint8 (&br, &tmp, 8)) - goto beach; - size += tmp; - } while (tmp == 255); - - - GST_LOG ("found SEI msg type: %d, len: %d", type, size); - - switch (type) { - case SEI_TYPE_RECOVERY_POINT: - if (!read_golomb (&br, &recovery_frame_count)) - return FALSE; - gst_bit_reader_skip (&br, 1); /* exact_match */ - gst_bit_reader_skip (&br, 1); /* broken_link_flag */ - gst_bit_reader_skip (&br, 2); /* changing_slice_group_idc */ - GST_DEBUG ("found SEI with recovery point message, " - "recovery_frame_count: %d", recovery_frame_count); - return TRUE; - default: - /* skip all other sei messages */ - gst_bit_reader_skip (&br, size * 8); - } - } - } - data = next_data; - *state = 0xffffffff; - } - } -beach: - return FALSE; -} diff --git a/gst/mpegtsdemux/payload_parsers.h b/gst/mpegtsdemux/payload_parsers.h deleted file mode 100644 index 7f7a480052..0000000000 --- a/gst/mpegtsdemux/payload_parsers.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - * payload_parsers.h - * Copyright (C) 2011 Janne Grunau - * - * Authors: - * Janne Grunau - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * 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 "mpegtspacketizer.h" - -typedef gboolean (*payload_parse_keyframe) (guint32 *state, - MpegTSPacketizerPacket * packet, - gboolean *need_more); - -gboolean gst_tsdemux_has_mpeg2_keyframe (guint32 *state, - MpegTSPacketizerPacket * packet, - gboolean *need_more); - -gboolean gst_tsdemux_has_h264_keyframe (guint32 *state, - MpegTSPacketizerPacket * packet, - gboolean *need_more); diff --git a/gst/mpegtsdemux/tsdemux.c b/gst/mpegtsdemux/tsdemux.c index 5b70c44bbd..812addb3cd 100644 --- a/gst/mpegtsdemux/tsdemux.c +++ b/gst/mpegtsdemux/tsdemux.c @@ -41,7 +41,6 @@ #include "gstmpegdesc.h" #include "gstmpegdefs.h" #include "mpegtspacketizer.h" -#include "payload_parsers.h" #include "pesparse.h" /* @@ -65,11 +64,15 @@ #define PCR_MAX_VALUE (((((guint64)1)<<33) * 300) + 298) #define PTS_DTS_MAX_VALUE (((guint64)1) << 33) +/* Seeking/Scanning related variables */ + /* seek to SEEK_TIMESTAMP_OFFSET before the desired offset and search then * either accurately or for the next timestamp */ #define SEEK_TIMESTAMP_OFFSET (1000 * GST_MSECOND) + + GST_DEBUG_CATEGORY_STATIC (ts_demux_debug); #define GST_CAT_DEFAULT ts_demux_debug @@ -218,19 +221,11 @@ gst_ts_demux_stream_added (MpegTSBase * base, MpegTSBaseStream * stream, MpegTSBaseProgram * program); static void gst_ts_demux_stream_removed (MpegTSBase * base, MpegTSBaseStream * stream); -static GstFlowReturn gst_ts_demux_do_seek (MpegTSBase * base, GstEvent * event, - guint16 pid); -static GstFlowReturn find_pcr_packet (MpegTSBase * base, guint64 offset, - gint64 length, TSPcrOffset * pcroffset); -static GstFlowReturn find_timestamps (MpegTSBase * base, guint64 initoff, - guint64 * offset); +static GstFlowReturn gst_ts_demux_do_seek (MpegTSBase * base, GstEvent * event); static void gst_ts_demux_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_ts_demux_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); -static GstFlowReturn -process_pcr (MpegTSBase * base, guint64 initoff, TSPcrOffset * pcroffset, - guint numpcr, gboolean isinitial); static void gst_ts_demux_flush_streams (GstTSDemux * tsdemux); static GstFlowReturn gst_ts_demux_push_pending_data (GstTSDemux * demux, TSDemuxStream * stream); @@ -300,7 +295,6 @@ gst_ts_demux_class_init (GstTSDemuxClass * klass) ts_class->program_started = GST_DEBUG_FUNCPTR (gst_ts_demux_program_started); ts_class->stream_added = gst_ts_demux_stream_added; ts_class->stream_removed = gst_ts_demux_stream_removed; - ts_class->find_timestamps = GST_DEBUG_FUNCPTR (find_timestamps); ts_class->seek = GST_DEBUG_FUNCPTR (gst_ts_demux_do_seek); ts_class->flush = GST_DEBUG_FUNCPTR (gst_ts_demux_flush); } @@ -310,25 +304,12 @@ gst_ts_demux_reset (MpegTSBase * base) { GstTSDemux *demux = (GstTSDemux *) base; - if (demux->index) { - g_array_free (demux->index, TRUE); - demux->index = NULL; - } - demux->index_size = 0; - demux->need_newsegment = TRUE; demux->program_number = -1; demux->duration = GST_CLOCK_TIME_NONE; gst_segment_init (&demux->segment, GST_FORMAT_TIME); - - demux->first_pcr = (TSPcrOffset) { - GST_CLOCK_TIME_NONE, 0, 0}; - demux->cur_pcr = (TSPcrOffset) { - 0}; - demux->last_pcr = (TSPcrOffset) { - 0}; } static void @@ -404,6 +385,7 @@ gst_ts_demux_srcpad_query (GstPad * pad, GstQuery * query) switch (GST_QUERY_TYPE (query)) { case GST_QUERY_DURATION: + { GST_DEBUG ("query duration"); gst_query_parse_duration (query, &format, NULL); if (format == GST_FORMAT_TIME) { @@ -415,6 +397,7 @@ gst_ts_demux_srcpad_query (GstPad * pad, GstQuery * query) res = FALSE; } break; + } case GST_QUERY_LATENCY: { GST_DEBUG ("query latency"); @@ -437,9 +420,10 @@ gst_ts_demux_srcpad_query (GstPad * pad, GstQuery * query) max_lat += 700 * GST_MSECOND; gst_query_set_latency (query, live, min_lat, max_lat); } - } break; + } case GST_QUERY_SEEKING: + { GST_DEBUG ("query seeking"); gst_query_parse_seeking (query, &format, NULL, NULL, NULL); if (format == GST_FORMAT_TIME) { @@ -459,6 +443,7 @@ gst_ts_demux_srcpad_query (GstPad * pad, GstQuery * query) res = FALSE; } break; + } default: res = gst_pad_query_default (pad, query); } @@ -468,365 +453,15 @@ gst_ts_demux_srcpad_query (GstPad * pad, GstQuery * query) } -static inline GstClockTime -calculate_gsttime (TSPcrOffset * start, guint64 pcr) -{ - GstClockTime time = start->gsttime; - - if (start->pcr > pcr) - time += PCRTIME_TO_GSTTIME (PCR_MAX_VALUE - start->pcr + pcr); - else - time += PCRTIME_TO_GSTTIME (pcr - start->pcr); - - return time; -} - static GstFlowReturn -gst_ts_demux_parse_pes_header_pts (GstTSDemux * demux, - MpegTSPacketizerPacket * packet, guint64 * time) +gst_ts_demux_perform_seek (MpegTSBase * base, GstSegment * segment) { - PESHeader header; - gint offset = 0; - - if (mpegts_parse_pes_header (packet->payload, - packet->data_end - packet->payload, &header, &offset)) - return GST_FLOW_ERROR; - - *time = header.PTS; - return GST_FLOW_OK; -} - -/* performs a accurate/key_unit seek */ -static GstFlowReturn -gst_ts_demux_perform_auxiliary_seek (MpegTSBase * base, GstClockTime seektime, - TSPcrOffset * pcroffset, gint64 length, gint16 pid, GstSeekFlags flags, - payload_parse_keyframe auxiliary_seek_fn) -{ - GstTSDemux *demux = (GstTSDemux *) base; - GstFlowReturn res = GST_FLOW_ERROR; - gboolean done = FALSE; - gboolean found_keyframe = FALSE, found_accurate = FALSE, need_more = TRUE; - GstBuffer *buf; - MpegTSPacketizerPacket packet; - MpegTSPacketizerPacketReturn pret; - gint64 offset = pcroffset->offset; - gint64 scan_offset = MIN (length, 50 * MPEGTS_MAX_PACKETSIZE); - guint32 state = 0xffffffff; - TSPcrOffset key_pos = { 0 }; - - GST_DEBUG ("auxiliary seek for %" GST_TIME_FORMAT " from offset: %" - G_GINT64_FORMAT " in %" G_GINT64_FORMAT " bytes for PID: %d " - "%s %s", GST_TIME_ARGS (seektime), pcroffset->offset, length, pid, - (flags & GST_SEEK_FLAG_ACCURATE) ? "accurate" : "", - (flags & GST_SEEK_FLAG_KEY_UNIT) ? "key_unit" : ""); - - mpegts_packetizer_flush (base->packetizer); - - if (base->packetizer->packet_size == MPEGTS_M2TS_PACKETSIZE) - offset -= 4; - - while (!done && scan_offset <= length) { - res = - gst_pad_pull_range (base->sinkpad, offset + scan_offset, - 50 * MPEGTS_MAX_PACKETSIZE, &buf); - if (res != GST_FLOW_OK) - goto beach; - mpegts_packetizer_push (base->packetizer, buf); - - while ((!done) - && ((pret = - mpegts_packetizer_next_packet (base->packetizer, - &packet)) != PACKET_NEED_MORE)) { - if (G_UNLIKELY (pret == PACKET_BAD)) - /* bad header, skip the packet */ - goto next; - - if (packet.payload_unit_start_indicator) - GST_DEBUG ("found packet for PID: %d with pcr: %" GST_TIME_FORMAT - " at offset: %" G_GINT64_FORMAT, packet.pid, - GST_TIME_ARGS (packet.pcr), packet.offset); - - if (packet.payload != NULL && packet.pid == pid) { - - if (packet.payload_unit_start_indicator) { - guint64 pts = 0; - GstFlowReturn ok = - gst_ts_demux_parse_pes_header_pts (demux, &packet, &pts); - if (ok == GST_FLOW_OK) { - GstClockTime time = calculate_gsttime (pcroffset, pts * 300); - - GST_DEBUG ("packet has PTS: %" GST_TIME_FORMAT, - GST_TIME_ARGS (time)); - - if (time <= seektime) { - pcroffset->gsttime = time; - pcroffset->pcr = packet.pcr; - pcroffset->offset = packet.offset; - } else - found_accurate = TRUE; - } else - goto next; - /* reset state for new packet */ - state = 0xffffffff; - need_more = TRUE; - } - - if (auxiliary_seek_fn) { - if (need_more) { - if (auxiliary_seek_fn (&state, &packet, &need_more)) { - found_keyframe = TRUE; - key_pos = *pcroffset; - GST_DEBUG ("found keyframe: time: %" GST_TIME_FORMAT " pcr: %" - GST_TIME_FORMAT " offset %" G_GINT64_FORMAT, - GST_TIME_ARGS (pcroffset->gsttime), - GST_TIME_ARGS (pcroffset->pcr), pcroffset->offset); - } - } - } else { - /* if we don't have a payload parsing function - * every frame is a keyframe */ - found_keyframe = TRUE; - } - } - if (flags & GST_SEEK_FLAG_ACCURATE) - done = found_accurate && found_keyframe; - else - done = found_keyframe; - if (done) - *pcroffset = key_pos; - next: - mpegts_packetizer_clear_packet (base->packetizer, &packet); - } - scan_offset += 50 * MPEGTS_MAX_PACKETSIZE; - } - -beach: - if (done) - res = GST_FLOW_OK; - else if (GST_FLOW_OK == res) - res = GST_FLOW_CUSTOM_ERROR_1; - - mpegts_packetizer_flush (base->packetizer); - return res; -} - -static gint -TSPcrOffset_find (TSPcrOffset * a, TSPcrOffset * b, gpointer user_data) -{ - if (a->gsttime < b->gsttime) - return -1; - if (a->gsttime > b->gsttime) - return 1; - return 0; -} - -static GstFlowReturn -gst_ts_demux_perform_seek (MpegTSBase * base, GstSegment * segment, guint16 pid) -{ - GstTSDemux *demux = (GstTSDemux *) base; - GstFlowReturn res = GST_FLOW_ERROR; - int max_loop_cnt, loop_cnt = 0; - gint64 seekpos = 0; - gint64 time_diff; - GstClockTime seektime; - TSPcrOffset seekpcroffset, pcr_start, pcr_stop, *tmp; - - max_loop_cnt = (segment->flags & GST_SEEK_FLAG_ACCURATE) ? 25 : 10; - - seektime = - MAX (0, - segment->last_stop - SEEK_TIMESTAMP_OFFSET) + demux->first_pcr.gsttime; - seekpcroffset.gsttime = seektime; - - GST_DEBUG ("seeking to %" GST_TIME_FORMAT, GST_TIME_ARGS (seektime)); - - gst_ts_demux_flush_streams (demux); - - if (G_UNLIKELY (!demux->index)) { - GST_ERROR ("no index"); - goto done; - } - - /* get the first index entry before the seek position */ - tmp = gst_util_array_binary_search (demux->index->data, demux->index_size, - sizeof (*tmp), (GCompareDataFunc) TSPcrOffset_find, - GST_SEARCH_MODE_BEFORE, &seekpcroffset, NULL); - - if (G_UNLIKELY (!tmp)) { - GST_ERROR ("value not found"); - goto done; - } - - pcr_start = *tmp; - pcr_stop = *(++tmp); - - if (G_UNLIKELY (!pcr_stop.offset)) { - GST_ERROR ("invalid entry"); - goto done; - } - - /* check if the last recorded pcr can be used */ - if (pcr_start.offset < demux->cur_pcr.offset - && demux->cur_pcr.offset < pcr_stop.offset) { - demux->cur_pcr.gsttime = calculate_gsttime (&pcr_start, demux->cur_pcr.pcr); - if (demux->cur_pcr.gsttime < seekpcroffset.gsttime) - pcr_start = demux->cur_pcr; - else - pcr_stop = demux->cur_pcr; - } - - GST_DEBUG ("start %" GST_TIME_FORMAT " offset: %" G_GINT64_FORMAT, - GST_TIME_ARGS (pcr_start.gsttime), pcr_start.offset); - GST_DEBUG ("stop %" GST_TIME_FORMAT " offset: %" G_GINT64_FORMAT, - GST_TIME_ARGS (pcr_stop.gsttime), pcr_stop.offset); - - time_diff = seektime - pcr_start.gsttime; - seekpcroffset = pcr_start; - - GST_DEBUG ("cur %" GST_TIME_FORMAT " offset: %" G_GINT64_FORMAT - " time diff: %" G_GINT64_FORMAT, - GST_TIME_ARGS (demux->cur_pcr.gsttime), demux->cur_pcr.offset, time_diff); - - /* seek loop */ - while (loop_cnt++ < max_loop_cnt && (time_diff > SEEK_TIMESTAMP_OFFSET >> 1) - && (pcr_stop.gsttime - pcr_start.gsttime > SEEK_TIMESTAMP_OFFSET)) { - gint64 duration = pcr_stop.gsttime - pcr_start.gsttime; - gint64 size = pcr_stop.offset - pcr_start.offset; - - if (loop_cnt & 1) - seekpos = pcr_start.offset + (size >> 1); - else - seekpos = - pcr_start.offset + size * ((double) (seektime - - pcr_start.gsttime) / duration); - - /* look a litle bit behind */ - seekpos = - MAX (pcr_start.offset + 188, seekpos - 55 * MPEGTS_MAX_PACKETSIZE); - - GST_DEBUG ("looking for time: %" GST_TIME_FORMAT " .. %" GST_TIME_FORMAT - " .. %" GST_TIME_FORMAT, - GST_TIME_ARGS (pcr_start.gsttime), - GST_TIME_ARGS (seektime), GST_TIME_ARGS (pcr_stop.gsttime)); - GST_DEBUG ("looking in bytes: %" G_GINT64_FORMAT " .. %" G_GINT64_FORMAT - " .. %" G_GINT64_FORMAT, pcr_start.offset, seekpos, pcr_stop.offset); - - res = - find_pcr_packet (&demux->parent, seekpos, 4000 * MPEGTS_MAX_PACKETSIZE, - &seekpcroffset); - if (G_UNLIKELY (res == GST_FLOW_UNEXPECTED)) { - seekpos = - MAX ((gint64) pcr_start.offset, - seekpos - 2000 * MPEGTS_MAX_PACKETSIZE) + 188; - res = - find_pcr_packet (&demux->parent, seekpos, - 8000 * MPEGTS_MAX_PACKETSIZE, &seekpcroffset); - } - if (G_UNLIKELY (res != GST_FLOW_OK)) { - GST_WARNING ("seeking failed %s", gst_flow_get_name (res)); - goto done; - } - - seekpcroffset.gsttime = calculate_gsttime (&pcr_start, seekpcroffset.pcr); - - /* validate */ - if (G_UNLIKELY ((seekpcroffset.gsttime < pcr_start.gsttime) || - (seekpcroffset.gsttime > pcr_stop.gsttime))) { - GST_ERROR ("Unexpected timestamp found, seeking failed! %" - GST_TIME_FORMAT, GST_TIME_ARGS (seekpcroffset.gsttime)); - res = GST_FLOW_ERROR; - goto done; - } - - if (seekpcroffset.gsttime > seektime) { - pcr_stop = seekpcroffset; - } else { - pcr_start = seekpcroffset; - } - time_diff = seektime - pcr_start.gsttime; - GST_DEBUG ("seeking: %" GST_TIME_FORMAT " found: %" GST_TIME_FORMAT - " diff = %" G_GINT64_FORMAT, GST_TIME_ARGS (seektime), - GST_TIME_ARGS (seekpcroffset.gsttime), time_diff); - } - - GST_DEBUG ("seeking finished after %d loops", loop_cnt); - - /* use correct seek position for the auxiliary search */ - seektime += SEEK_TIMESTAMP_OFFSET; - - { - payload_parse_keyframe keyframe_seek = NULL; - MpegTSBaseProgram *program = demux->program; - guint64 avg_bitrate, length; - - if (program->streams[pid]) { - switch (program->streams[pid]->stream_type) { - case ST_VIDEO_MPEG1: - case ST_VIDEO_MPEG2: - keyframe_seek = gst_tsdemux_has_mpeg2_keyframe; - break; - case ST_VIDEO_H264: - keyframe_seek = gst_tsdemux_has_h264_keyframe; - break; - case ST_VIDEO_MPEG4: - case ST_VIDEO_DIRAC: - GST_WARNING ("no payload parser for stream 0x%04x type: 0x%02x", pid, - program->streams[pid]->stream_type); - break; - } - } else - GST_WARNING ("no stream info for PID: 0x%04x", pid); - - avg_bitrate = - (pcr_stop.offset - - pcr_start.offset) * 1000 * GST_MSECOND / (pcr_stop.gsttime - - pcr_start.gsttime); - - seekpcroffset = pcr_start; - /* search in 2500ms for a keyframe */ - length = - MIN (demux->last_pcr.offset - pcr_start.offset, - (avg_bitrate * 25) / 10); - res = - gst_ts_demux_perform_auxiliary_seek (base, seektime, &seekpcroffset, - length, pid, segment->flags, keyframe_seek); - - if (res == GST_FLOW_CUSTOM_ERROR_1) { - GST_ERROR ("no keyframe found in %" G_GUINT64_FORMAT - " bytes starting from %" G_GUINT64_FORMAT, length, - seekpcroffset.offset); - res = GST_FLOW_ERROR; - } - if (res != GST_FLOW_OK) - goto done; - } - - - /* update seektime to the actual timestamp of the found keyframe */ - if (segment->flags & GST_SEEK_FLAG_KEY_UNIT) - seektime = seekpcroffset.gsttime; - - seektime -= demux->first_pcr.gsttime; - - segment->last_stop = seektime; - segment->time = seektime; - - /* we stop at the end */ - if (segment->stop == -1) - segment->stop = demux->first_pcr.gsttime + segment->duration; - - demux->need_newsegment = TRUE; - demux->parent.seek_offset = seekpcroffset.offset; - GST_DEBUG ("seeked to postion:%" GST_TIME_FORMAT, GST_TIME_ARGS (seektime)); - res = GST_FLOW_OK; - -done: - return res; + return GST_FLOW_ERROR; } static GstFlowReturn -gst_ts_demux_do_seek (MpegTSBase * base, GstEvent * event, guint16 pid) +gst_ts_demux_do_seek (MpegTSBase * base, GstEvent * event) { GstTSDemux *demux = (GstTSDemux *) base; GstFlowReturn res = GST_FLOW_ERROR; @@ -876,7 +511,7 @@ gst_ts_demux_do_seek (MpegTSBase * base, GstEvent * event, guint16 pid) GST_TIME_ARGS (seeksegment.last_stop), GST_TIME_ARGS (seeksegment.duration)); - res = gst_ts_demux_perform_seek (base, &seeksegment, pid); + res = gst_ts_demux_perform_seek (base, &seeksegment); if (G_UNLIKELY (res != GST_FLOW_OK)) { GST_WARNING ("seeking failed %s", gst_flow_get_name (res)); goto done; @@ -1401,475 +1036,6 @@ gst_ts_demux_program_started (MpegTSBase * base, MpegTSBaseProgram * program) } } -static gboolean -process_section (MpegTSBase * base) -{ - GstTSDemux *demux = GST_TS_DEMUX (base); - gboolean based; - gboolean done = FALSE; - MpegTSPacketizerPacket packet; - MpegTSPacketizerPacketReturn pret; - - while ((!done) && - ((pret = mpegts_packetizer_next_packet (base->packetizer, &packet)) - != PACKET_NEED_MORE)) { - - if (G_UNLIKELY (pret == PACKET_BAD)) - /* bad header, skip the packet */ - goto next; - - /* base PSI data */ - if (packet.payload != NULL && mpegts_base_is_psi (base, &packet)) { - MpegTSPacketizerSection section; - - based = mpegts_packetizer_push_section (base->packetizer, &packet, - §ion); - - if (G_UNLIKELY (!based)) - /* bad section data */ - goto next; - - if (G_LIKELY (section.complete)) { - /* section complete */ - GST_DEBUG ("Section Complete"); - based = mpegts_base_handle_psi (base, §ion); - gst_buffer_unref (section.buffer); - if (G_UNLIKELY (!based)) - /* bad PSI table */ - goto next; - - } - - if (demux->program != NULL) { - GST_DEBUG ("Got Program"); - done = TRUE; - } - } - next: - mpegts_packetizer_clear_packet (base->packetizer, &packet); - } - return done; -} - -static gboolean -process_pes (MpegTSBase * base, TSPcrOffset * pcroffset) -{ - gboolean based, done = FALSE; - MpegTSPacketizerPacket packet; - MpegTSPacketizerPacketReturn pret; - GstTSDemux *demux = GST_TS_DEMUX (base); - guint16 pcr_pid = 0; - - while ((!done) && - ((pret = mpegts_packetizer_next_packet (base->packetizer, &packet)) - != PACKET_NEED_MORE)) { - if (G_UNLIKELY (pret == PACKET_BAD)) - /* bad header, skip the packet */ - goto next; - - if (demux->program != NULL) { - pcr_pid = demux->program->pcr_pid; - } - - /* base PSI data */ - if (packet.payload != NULL && mpegts_base_is_psi (base, &packet)) { - MpegTSPacketizerSection section; - - based = mpegts_packetizer_push_section (base->packetizer, &packet, - §ion); - - if (G_UNLIKELY (!based)) - /* bad section data */ - goto next; - - if (G_LIKELY (section.complete)) { - /* section complete */ - GST_DEBUG ("Section Complete"); - based = mpegts_base_handle_psi (base, §ion); - gst_buffer_unref (section.buffer); - if (G_UNLIKELY (!based)) - /* bad PSI table */ - goto next; - - } - } - if (packet.pid == pcr_pid && (packet.adaptation_field_control & 0x02) - && (packet.afc_flags & MPEGTS_AFC_PCR_FLAG)) { - GST_DEBUG ("PCR[0x%x]: %" G_GINT64_FORMAT, packet.pid, packet.pcr); - pcroffset->pcr = packet.pcr; - pcroffset->offset = packet.offset; - done = TRUE; - } - next: - mpegts_packetizer_clear_packet (base->packetizer, &packet); - } - return done; -} - -static GstFlowReturn -find_pcr_packet (MpegTSBase * base, guint64 offset, gint64 length, - TSPcrOffset * pcroffset) -{ - GstFlowReturn ret = GST_FLOW_OK; - GstTSDemux *demux = GST_TS_DEMUX (base); - MpegTSBaseProgram *program; - GstBuffer *buf; - gboolean done = FALSE; - guint64 scan_offset = 0; - - GST_DEBUG ("Scanning for PCR between:%" G_GINT64_FORMAT - " and the end:%" G_GINT64_FORMAT, offset, offset + length); - - /* Get the program */ - program = demux->program; - if (G_UNLIKELY (program == NULL)) - return GST_FLOW_ERROR; - - mpegts_packetizer_flush (base->packetizer); - if (offset >= 4 && base->packetizer->packet_size == MPEGTS_M2TS_PACKETSIZE) - offset -= 4; - - while (!done && scan_offset < length) { - ret = - gst_pad_pull_range (base->sinkpad, offset + scan_offset, - 50 * MPEGTS_MAX_PACKETSIZE, &buf); - if (ret != GST_FLOW_OK) - goto beach; - mpegts_packetizer_push (base->packetizer, buf); - done = process_pes (base, pcroffset); - scan_offset += 50 * MPEGTS_MAX_PACKETSIZE; - } - - if (!done || scan_offset >= length) { - GST_WARNING ("No PCR found!"); - ret = GST_FLOW_ERROR; - goto beach; - } - -beach: - mpegts_packetizer_flush (base->packetizer); - return ret; -} - -static gboolean -verify_timestamps (MpegTSBase * base, TSPcrOffset * first, TSPcrOffset * last) -{ - GstTSDemux *demux = GST_TS_DEMUX (base); - guint64 length = 4000 * MPEGTS_MAX_PACKETSIZE; - guint64 offset = PCR_WRAP_SIZE_128KBPS; - - demux->index = - g_array_sized_new (TRUE, TRUE, sizeof (*first), - 2 + 1 + ((last->offset - first->offset) / PCR_WRAP_SIZE_128KBPS)); - - first->gsttime = PCRTIME_TO_GSTTIME (first->pcr); - demux->index = g_array_append_val (demux->index, *first); - demux->index_size++; - demux->first_pcr = *first; - demux->index_pcr = *first; - GST_DEBUG ("first time: %" GST_TIME_FORMAT " pcr: %" GST_TIME_FORMAT - " offset: %" G_GINT64_FORMAT - " last pcr: %" GST_TIME_FORMAT " offset: %" G_GINT64_FORMAT, - GST_TIME_ARGS (first->gsttime), - GST_TIME_ARGS (PCRTIME_TO_GSTTIME (first->pcr)), first->offset, - GST_TIME_ARGS (PCRTIME_TO_GSTTIME (last->pcr)), last->offset); - - while (offset + length < last->offset) { - TSPcrOffset half; - GstFlowReturn ret; - gint tries = 0; - - retry: - ret = find_pcr_packet (base, offset, length, &half); - if (G_UNLIKELY (ret != GST_FLOW_OK)) { - GST_WARNING ("no pcr found, retrying"); - if (tries++ < 3) { - offset += length; - length *= 2; - goto retry; - } - return FALSE; - } - - half.gsttime = calculate_gsttime (first, half.pcr); - - GST_DEBUG ("add half time: %" GST_TIME_FORMAT " pcr: %" GST_TIME_FORMAT - " offset: %" G_GINT64_FORMAT, - GST_TIME_ARGS (half.gsttime), - GST_TIME_ARGS (PCRTIME_TO_GSTTIME (half.pcr)), half.offset); - demux->index = g_array_append_val (demux->index, half); - demux->index_size++; - - length = 4000 * MPEGTS_MAX_PACKETSIZE; - offset += PCR_WRAP_SIZE_128KBPS; - *first = half; - } - - last->gsttime = calculate_gsttime (first, last->pcr); - - GST_DEBUG ("add last time: %" GST_TIME_FORMAT " pcr: %" GST_TIME_FORMAT - " offset: %" G_GINT64_FORMAT, - GST_TIME_ARGS (last->gsttime), - GST_TIME_ARGS (PCRTIME_TO_GSTTIME (last->pcr)), last->offset); - - demux->index = g_array_append_val (demux->index, *last); - demux->index_size++; - - demux->last_pcr = *last; - return TRUE; -} - -static GstFlowReturn -find_timestamps (MpegTSBase * base, guint64 initoff, guint64 * offset) -{ - - GstFlowReturn ret = GST_FLOW_OK; - GstBuffer *buf; - gboolean done = FALSE; - GstFormat format = GST_FORMAT_BYTES; - gint64 total_bytes; - guint64 scan_offset; - guint i = 0; - TSPcrOffset initial, final; - GstTSDemux *demux = GST_TS_DEMUX (base); - - GST_DEBUG ("Scanning for timestamps"); - - /* Start scanning from now PAT offset */ - - while (!done) { - ret = gst_pad_pull_range (base->sinkpad, i * 50 * MPEGTS_MAX_PACKETSIZE, - 50 * MPEGTS_MAX_PACKETSIZE, &buf); - - if (ret != GST_FLOW_OK) - goto beach; - - mpegts_packetizer_push (base->packetizer, buf); - done = process_section (base); - i++; - } - mpegts_packetizer_clear (base->packetizer); - done = FALSE; - i = 1; - - *offset = base->seek_offset; - - /* Search for the first PCRs */ - ret = process_pcr (base, base->first_pat_offset, &initial, 10, TRUE); - - if (ret != GST_FLOW_OK && ret != GST_FLOW_UNEXPECTED) { - GST_WARNING ("Problem getting initial PCRs"); - goto beach; - } - - mpegts_packetizer_clear (base->packetizer); - /* Remove current program so we ensure looking for a PAT when scanning - * for the final PCR */ - gst_structure_free (base->pat); - base->pat = NULL; - mpegts_base_remove_program (base, demux->current_program_number); - demux->program = NULL; - - /* Find end position */ - if (G_UNLIKELY (!gst_pad_query_peer_duration (base->sinkpad, &format, - &total_bytes) || format != GST_FORMAT_BYTES)) { - GST_WARNING_OBJECT (base, "Couldn't get upstream size in bytes"); - mpegts_packetizer_clear (base->packetizer); - - return GST_FLOW_ERROR; - } - GST_DEBUG ("Upstream is %" G_GINT64_FORMAT " bytes", total_bytes); - - - /* Let's start scanning 4000 packets from the end */ - scan_offset = MAX (188, total_bytes - 4000 * MPEGTS_MAX_PACKETSIZE); - - GST_DEBUG ("Scanning for last sync point between:%" G_GINT64_FORMAT - " and the end:%" G_GINT64_FORMAT, scan_offset, total_bytes); - - while ((!done) && (scan_offset < total_bytes)) { - ret = gst_pad_pull_range (base->sinkpad, scan_offset, - 50 * MPEGTS_MAX_PACKETSIZE, &buf); - - if (ret != GST_FLOW_OK) - goto beach; - - mpegts_packetizer_push (base->packetizer, buf); - done = process_section (base); - scan_offset += 50 * MPEGTS_MAX_PACKETSIZE; - } - - mpegts_packetizer_clear (base->packetizer); - - ret = process_pcr (base, scan_offset - 50 * MPEGTS_MAX_PACKETSIZE, &final, - 10, FALSE); - - if (ret != GST_FLOW_OK) { - GST_DEBUG ("Problem getting last PCRs"); - goto beach; - } - - verify_timestamps (base, &initial, &final); - - gst_segment_set_duration (&demux->segment, GST_FORMAT_TIME, - demux->last_pcr.gsttime - demux->first_pcr.gsttime); - demux->duration = demux->last_pcr.gsttime - demux->first_pcr.gsttime; - - GST_DEBUG ("Done, duration:%" GST_TIME_FORMAT, - GST_TIME_ARGS (demux->duration)); - -beach: - - mpegts_packetizer_clear (base->packetizer); - /* Remove current program */ - if (base->pat) { - gst_structure_free (base->pat); - base->pat = NULL; - } - mpegts_base_remove_program (base, demux->current_program_number); - demux->program = NULL; - - return ret; -} - -static GstFlowReturn -process_pcr (MpegTSBase * base, guint64 initoff, TSPcrOffset * pcroffset, - guint numpcr, gboolean isinitial) -{ - GstTSDemux *demux = GST_TS_DEMUX (base); - GstFlowReturn ret = GST_FLOW_OK; - MpegTSBaseProgram *program; - GstBuffer *buf; - guint i, nbpcr = 0; - guint32 pcrmask, pcrpattern; - guint64 pcrs[50]; - guint64 pcroffs[50]; - GstByteReader br; - - GST_DEBUG ("initoff:%" G_GUINT64_FORMAT ", numpcr:%d, isinitial:%d", - initoff, numpcr, isinitial); - - /* Get the program */ - program = demux->program; - if (G_UNLIKELY (program == NULL)) { - GST_DEBUG ("No program set, can not keep processing pcr"); - - ret = GST_FLOW_ERROR; - goto beach; - } - - /* First find the first X PCR */ - nbpcr = 0; - /* Mask/pattern is PID:PCR_PID, AFC&0x02 */ - /* sync_byte (0x47) : 8bits => 0xff - * transport_error_indicator : 1bit ACTIVATE - * payload_unit_start_indicator : 1bit IGNORE - * transport_priority : 1bit IGNORE - * PID : 13bit => 0x9f 0xff - * transport_scrambling_control : 2bit - * adaptation_field_control : 2bit - * continuity_counter : 4bit => 0x30 - */ - pcrmask = 0xff9fff20; - pcrpattern = 0x47000020 | ((program->pcr_pid & 0x1fff) << 8); - - for (i = 0; (i < 20) && (nbpcr < numpcr); i++) { - guint offset, size; - - ret = gst_pad_pull_range (base->sinkpad, - initoff + i * 500 * base->packetsize, 500 * base->packetsize, &buf); - - if (G_UNLIKELY (ret != GST_FLOW_OK)) - goto beach; - - gst_byte_reader_init_from_buffer (&br, buf); - - size = GST_BUFFER_SIZE (buf); - - resync: - offset = gst_byte_reader_masked_scan_uint32 (&br, 0xff000000, 0x47000000, - 0, base->packetsize); - - if (offset == -1) - continue; - - while ((nbpcr < numpcr) && (size >= base->packetsize)) { - - guint32 header = GST_READ_UINT32_BE (br.data + offset); - - if ((header >> 24) != 0x47) - goto resync; - - if ((header & pcrmask) != pcrpattern) { - /* Move offset forward by 1 packet */ - size -= base->packetsize; - offset += base->packetsize; - continue; - } - - /* Potential PCR */ -/* GST_DEBUG ("offset %" G_GUINT64_FORMAT, GST_BUFFER_OFFSET (buf) + offset); - GST_MEMDUMP ("something", GST_BUFFER_DATA (buf) + offset, 16);*/ - if ((*(br.data + offset + 5)) & MPEGTS_AFC_PCR_FLAG) { - guint64 lpcr = mpegts_packetizer_compute_pcr (br.data + offset + 6); - - GST_INFO ("Found PCR %" G_GUINT64_FORMAT " %" GST_TIME_FORMAT - " at offset %" G_GUINT64_FORMAT, lpcr, - GST_TIME_ARGS (PCRTIME_TO_GSTTIME (lpcr)), - GST_BUFFER_OFFSET (buf) + offset); - pcrs[nbpcr] = lpcr; - pcroffs[nbpcr] = GST_BUFFER_OFFSET (buf) + offset; - /* Safeguard against bogus PCR (by detecting if it's the same as the - * previous one or wheter the difference with the previous one is - * greater than 10mins */ - if (nbpcr > 1) { - if (pcrs[nbpcr] == pcrs[nbpcr - 1]) { - GST_WARNING ("Found same PCR at different offset"); - } else if (pcrs[nbpcr] < pcrs[nbpcr - 1]) { - GST_WARNING ("Found PCR wraparound"); - nbpcr += 1; - } else if ((pcrs[nbpcr] - pcrs[nbpcr - 1]) > - (guint64) 10 * 60 * 27000000) { - GST_WARNING ("PCR differs with previous PCR by more than 10 mins"); - } else - nbpcr += 1; - } else - nbpcr += 1; - } - /* Move offset forward by 1 packet */ - size -= base->packetsize; - offset += base->packetsize; - } - } - -beach: - GST_DEBUG ("Found %d PCR", nbpcr); - if (nbpcr) { - if (isinitial) { - pcroffset->pcr = pcrs[0]; - pcroffset->offset = pcroffs[0]; - } else { - pcroffset->pcr = pcrs[nbpcr - 1]; - pcroffset->offset = pcroffs[nbpcr - 1]; - } - if (nbpcr > 1) { - GST_DEBUG ("pcrdiff:%" GST_TIME_FORMAT " offsetdiff %" G_GUINT64_FORMAT, - GST_TIME_ARGS (PCRTIME_TO_GSTTIME (pcrs[nbpcr - 1] - pcrs[0])), - pcroffs[nbpcr - 1] - pcroffs[0]); - GST_DEBUG ("Estimated bitrate %" G_GUINT64_FORMAT, - gst_util_uint64_scale (GST_SECOND, pcroffs[nbpcr - 1] - pcroffs[0], - PCRTIME_TO_GSTTIME (pcrs[nbpcr - 1] - pcrs[0]))); - GST_DEBUG ("Average PCR interval %" G_GUINT64_FORMAT, - (pcroffs[nbpcr - 1] - pcroffs[0]) / nbpcr); - } - } - /* Swallow any errors if it happened during the end scanning */ - if (!isinitial) - ret = GST_FLOW_OK; - return ret; -} - - static inline void @@ -1882,17 +1048,7 @@ gst_ts_demux_record_pcr (GstTSDemux * demux, TSDemuxStream * stream, G_GUINT64_FORMAT, bs->pid, GST_TIME_ARGS (PCRTIME_TO_GSTTIME (pcr)), offset); - if (G_LIKELY (bs->pid == demux->program->pcr_pid)) { - demux->cur_pcr.gsttime = GST_CLOCK_TIME_NONE; - demux->cur_pcr.offset = offset; - demux->cur_pcr.pcr = pcr; - /* set first_pcr in push mode */ - if (G_UNLIKELY (!demux->first_pcr.gsttime == GST_CLOCK_TIME_NONE)) { - demux->first_pcr.gsttime = PCRTIME_TO_GSTTIME (pcr); - demux->first_pcr.offset = offset; - demux->first_pcr.pcr = pcr; - } - } + /* FIXME : packetizer should record this */ if (G_UNLIKELY (demux->emit_statistics)) { GstStructure *st; @@ -1916,6 +1072,8 @@ gst_ts_demux_record_opcr (GstTSDemux * demux, TSDemuxStream * stream, G_GUINT64_FORMAT, bs->pid, GST_TIME_ARGS (PCRTIME_TO_GSTTIME (opcr)), offset); + /* FIXME : packetizer should record this */ + if (G_UNLIKELY (demux->emit_statistics)) { GstStructure *st; st = gst_structure_id_empty_new (QUARK_TSDEMUX); @@ -2019,19 +1177,6 @@ gst_ts_demux_record_dts (GstTSDemux * demux, TSDemuxStream * stream, } } -static inline GstClockTime -calc_gsttime_from_pts (TSPcrOffset * start, guint64 pts) -{ - GstClockTime time = start->gsttime - PCRTIME_TO_GSTTIME (start->pcr); - - if (start->pcr > pts * 300) - time += PCRTIME_TO_GSTTIME (PCR_MAX_VALUE) + MPEGTIME_TO_GSTTIME (pts); - else - time += MPEGTIME_TO_GSTTIME (pts); - - return time; -} - static GstFlowReturn gst_ts_demux_parse_pes_header (GstTSDemux * demux, TSDemuxStream * stream) { @@ -2261,14 +1406,12 @@ calculate_and_push_newsegment (GstTSDemux * demux, TSDemuxStream * stream) GST_TIME_ARGS (demux->segment.duration), GST_TIME_ARGS (demux->segment.time)); - GST_DEBUG ("firstpcr gsttime : %" GST_TIME_FORMAT, - GST_TIME_ARGS (demux->first_pcr.gsttime)); - /* FIXME : This is not entirely correct. We should be using the PTS time * realm and not the PCR one. Doesn't matter *too* much if PTS/PCR values * aren't too far apart, but still. */ - start = demux->first_pcr.gsttime + demux->segment.start; - stop = demux->first_pcr.gsttime + demux->segment.duration; + /* FIXME : EDWARD : Removed previous first pcr gsttime */ + start = demux->segment.start; + stop = demux->segment.duration; position = demux->segment.time; } @@ -2291,7 +1434,7 @@ gst_ts_demux_push_pending_data (GstTSDemux * demux, TSDemuxStream * stream) MpegTSBaseStream *bs = (MpegTSBaseStream *) stream; /* MpegTSBase *base = (MpegTSBase*) demux; */ GstBuffer *firstbuffer = NULL; - MpegTSPacketizer2 *packetizer = ((MpegTSBase *) demux)->packetizer; + MpegTSPacketizer2 *packetizer = MPEG_TS_BASE_PACKETIZER (demux); GST_DEBUG_OBJECT (stream->pad, "stream:%p, pid:0x%04x stream_type:%d state:%d", stream, bs->pid, diff --git a/gst/mpegtsdemux/tsdemux.h b/gst/mpegtsdemux/tsdemux.h index 0a7d880732..4dff579af4 100644 --- a/gst/mpegtsdemux/tsdemux.h +++ b/gst/mpegtsdemux/tsdemux.h @@ -48,14 +48,6 @@ G_BEGIN_DECLS #define GST_TS_DEMUX_CAST(obj) ((GstTSDemux*) obj) typedef struct _GstTSDemux GstTSDemux; typedef struct _GstTSDemuxClass GstTSDemuxClass; -typedef struct _TSPcrOffset TSPcrOffset; - -struct _TSPcrOffset -{ - guint64 gsttime; - guint64 pcr; - guint64 offset; -}; struct _GstTSDemux { @@ -70,21 +62,10 @@ struct _GstTSDemux MpegTSBaseProgram *program; /* Current program */ guint current_program_number; gboolean need_newsegment; + /* Downstream segment */ GstSegment segment; GstClockTime duration; /* Total duration */ - - /* pcr wrap and seeking */ - GArray *index; - gint index_size; - TSPcrOffset first_pcr; - TSPcrOffset last_pcr; - TSPcrOffset cur_pcr; - TSPcrOffset index_pcr; - - /* LIVE MODE ONLY */ - /* Delta between incoming ts and PTS */ - GstClockTime pts_delta; }; struct _GstTSDemuxClass From c10fc17a1e930c2cfd9cacb7f90d8b6a6cec4a88 Mon Sep 17 00:00:00 2001 From: Edward Hervey Date: Wed, 29 Feb 2012 18:19:23 +0100 Subject: [PATCH 026/138] Revert "mpegtsdemux: Not apply various time the same PMT to a program when repetead" This reverts commit 8cb0e87f5623836ddc361eb91dcf9b50b48048e7. mpegtspacketizer already checks if it's a new PMT or not --- gst/mpegtsdemux/mpegtsbase.c | 20 +++----------------- 1 file changed, 3 insertions(+), 17 deletions(-) diff --git a/gst/mpegtsdemux/mpegtsbase.c b/gst/mpegtsdemux/mpegtsbase.c index ee46e64266..a62314fd91 100644 --- a/gst/mpegtsdemux/mpegtsbase.c +++ b/gst/mpegtsdemux/mpegtsbase.c @@ -968,8 +968,6 @@ mpegts_base_handle_psi (MpegTSBase * base, MpegTSPacketizerSection * section) { gboolean res = TRUE; GstStructure *structure = NULL; - gint program_number; - MpegTSBaseProgram *program = NULL; /* table ids 0x70 - 0x73 do not have a crc */ if (G_LIKELY (section->table_id < 0x70 || section->table_id > 0x73)) { @@ -999,22 +997,10 @@ mpegts_base_handle_psi (MpegTSBase * base, MpegTSPacketizerSection * section) break; case 0x02: structure = mpegts_packetizer_parse_pmt (base->packetizer, section); - if (G_UNLIKELY (structure == NULL)) - return FALSE; - - gst_structure_id_get (structure, QUARK_PROGRAM_NUMBER, G_TYPE_UINT, - &program_number, NULL); - program = mpegts_base_get_program (base, program_number); - - /* We already have the same PMT for the current program in use, so we do - * not need to reset it */ - if (program && program->active && program->pmt_pid == section->pid) { - GST_DEBUG ("Already have the PMT %u for program %i, not applying again", - program->pmt_pid, program_number); - res = TRUE; - } else { + if (G_LIKELY (structure)) mpegts_base_apply_pmt (base, section->pid, structure); - } + else + res = FALSE; break; case 0x40: From 39cc29a7d26c920825e6ed4ebcd2cbd310a21328 Mon Sep 17 00:00:00 2001 From: Edward Hervey Date: Thu, 1 Mar 2012 17:53:41 +0100 Subject: [PATCH 027/138] mpegtspacketizer: clock fix and minor addition * Don't take into account packets that arrived at the same time as previous ones for clock skew estimation * Add convenience method for processing the next ts packet --- gst/mpegtsdemux/mpegtspacketizer.c | 16 +++++++++++++++- gst/mpegtsdemux/mpegtspacketizer.h | 7 +++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/gst/mpegtsdemux/mpegtspacketizer.c b/gst/mpegtsdemux/mpegtspacketizer.c index 1bc9356406..dc11922201 100644 --- a/gst/mpegtsdemux/mpegtspacketizer.c +++ b/gst/mpegtsdemux/mpegtspacketizer.c @@ -212,7 +212,7 @@ mpegts_packetizer_finalize (GObject * object) G_OBJECT_CLASS (mpegts_packetizer_parent_class)->finalize (object); } -guint64 +static inline guint64 mpegts_packetizer_compute_pcr (const guint8 * data) { guint32 pcr1; @@ -2318,6 +2318,14 @@ done: return PACKET_NEED_MORE; } +MpegTSPacketizerPacketReturn +mpegts_packetizer_process_next_packet (MpegTSPacketizer2 * packetizer) +{ + MpegTSPacketizerPacket packet; + + return mpegts_packetizer_next_packet (packetizer, &packet); +} + void mpegts_packetizer_clear_packet (MpegTSPacketizer2 * packetizer, MpegTSPacketizerPacket * packet) @@ -2927,6 +2935,11 @@ calculate_skew (MpegTSPacketizer2 * packetizer, guint64 pcrtime, /* elapsed time at receiver, includes the jitter */ recv_diff = time - packetizer->base_time; + /* Ignore packets received at 100% the same time (i.e. from the same input buffer) */ + if (G_UNLIKELY (time == packetizer->prev_in_time + && GST_CLOCK_TIME_IS_VALID (packetizer->prev_in_time))) + goto no_skew; + /* measure the diff */ delta = ((gint64) recv_diff) - ((gint64) send_diff); @@ -3061,6 +3074,7 @@ no_skew: } packetizer->prev_out_time = out_time; + packetizer->prev_in_time = time; packetizer->prev_send_diff = send_diff; GST_DEBUG ("skew %" G_GINT64_FORMAT ", out %" GST_TIME_FORMAT, diff --git a/gst/mpegtsdemux/mpegtspacketizer.h b/gst/mpegtsdemux/mpegtspacketizer.h index 3b18535e49..845541afed 100644 --- a/gst/mpegtsdemux/mpegtspacketizer.h +++ b/gst/mpegtsdemux/mpegtspacketizer.h @@ -86,9 +86,14 @@ struct _MpegTSPacketizer2 { /* clock skew calculation */ gboolean calculate_skew; + + /* Following variables are only active/used when + * calculate_skew is TRUE */ + /* FIXME : These variables should be *per* PCR PID */ GstClockTime base_time; GstClockTime base_pcrtime; GstClockTime prev_out_time; + GstClockTime prev_in_time; GstClockTime last_pcrtime; gint64 window[MAX_WINDOW]; guint window_pos; @@ -161,6 +166,8 @@ void mpegts_packetizer_push (MpegTSPacketizer2 *packetizer, GstBuffer *buffer); gboolean mpegts_packetizer_has_packets (MpegTSPacketizer2 *packetizer); MpegTSPacketizerPacketReturn mpegts_packetizer_next_packet (MpegTSPacketizer2 *packetizer, MpegTSPacketizerPacket *packet); +MpegTSPacketizerPacketReturn +mpegts_packetizer_process_next_packet(MpegTSPacketizer2 * packetizer); void mpegts_packetizer_clear_packet (MpegTSPacketizer2 *packetizer, MpegTSPacketizerPacket *packet); void mpegts_packetizer_remove_stream(MpegTSPacketizer2 *packetizer, From a4899af8d6d9219409ea40b74055bc9d66eb346d Mon Sep 17 00:00:00 2001 From: Edward Hervey Date: Thu, 1 Mar 2012 17:56:34 +0100 Subject: [PATCH 028/138] mpegtspacketizer: Offset calculation Allows PCR<=>PTS<=>offset estimation/calculation Right now the calculation is very naive, but can be extended later on without disrupting the code in tsdemux/mpegtsbase --- gst/mpegtsdemux/mpegtspacketizer.c | 157 ++++++++++++++++++++++++++++- gst/mpegtsdemux/mpegtspacketizer.h | 23 ++++- 2 files changed, 177 insertions(+), 3 deletions(-) diff --git a/gst/mpegtsdemux/mpegtspacketizer.c b/gst/mpegtsdemux/mpegtspacketizer.c index dc11922201..84f5161b62 100644 --- a/gst/mpegtsdemux/mpegtspacketizer.c +++ b/gst/mpegtsdemux/mpegtspacketizer.c @@ -69,10 +69,35 @@ static GQuark QUARK_SEGMENT_LAST_SECTION_NUMBER; static GQuark QUARK_LAST_TABLE_ID; static GQuark QUARK_EVENTS; + +#define MPEGTS_PACKETIZER_GET_PRIVATE(obj) \ + (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GST_TYPE_MPEGTS_PACKETIZER, MpegTSPacketizerPrivate)) + static void _init_local (void); G_DEFINE_TYPE_EXTENDED (MpegTSPacketizer2, mpegts_packetizer, G_TYPE_OBJECT, 0, _init_local ()); +typedef struct +{ + guint64 offset; /* offset in upstream */ + guint64 pcr; /* pcr (wraparound not fixed) */ +} MpegTSPacketizerOffset; + +struct _MpegTSPacketizerPrivate +{ + /* Used for bitrate calculation */ + /* FIXME : Replace this later on with a balanced tree or sequence */ + guint64 first_offset; + guint64 first_pcr; + guint64 last_offset; + guint64 last_pcr; + + /* Reference offset */ + guint64 refoffset; + + guint nb_seen_offsets; +}; + static void mpegts_packetizer_dispose (GObject * object); static void mpegts_packetizer_finalize (GObject * object); static gchar *convert_to_utf8 (const gchar * text, gint length, guint start, @@ -82,6 +107,8 @@ static gchar *get_encoding (const gchar * text, guint * start_text, static gchar *get_encoding_and_convert (const gchar * text, guint length); static GstClockTime calculate_skew (MpegTSPacketizer2 * packetizer, guint64 pcrtime, GstClockTime time); +static void record_pcr (MpegTSPacketizer2 * packetizer, guint64 pcr, + guint64 offset); static void mpegts_packetizer_reset_skew (MpegTSPacketizer2 * packetizer); #define CONTINUITY_UNSET 255 @@ -156,6 +183,8 @@ mpegts_packetizer_class_init (MpegTSPacketizer2Class * klass) { GObjectClass *gobject_class; + g_type_class_add_private (klass, sizeof (MpegTSPacketizerPrivate)); + gobject_class = G_OBJECT_CLASS (klass); gobject_class->dispose = mpegts_packetizer_dispose; @@ -165,13 +194,22 @@ mpegts_packetizer_class_init (MpegTSPacketizer2Class * klass) static void mpegts_packetizer_init (MpegTSPacketizer2 * packetizer) { + packetizer->priv = MPEGTS_PACKETIZER_GET_PRIVATE (packetizer); packetizer->adapter = gst_adapter_new (); packetizer->offset = 0; packetizer->empty = TRUE; packetizer->streams = g_new0 (MpegTSPacketizerStream *, 8192); packetizer->know_packet_size = FALSE; packetizer->calculate_skew = FALSE; + packetizer->calculate_offset = FALSE; mpegts_packetizer_reset_skew (packetizer); + + packetizer->priv->first_offset = -1; + packetizer->priv->first_pcr = -1; + packetizer->priv->last_offset = -1; + packetizer->priv->last_pcr = -1; + packetizer->priv->nb_seen_offsets = 0; + packetizer->priv->refoffset = -1; } static void @@ -269,17 +307,24 @@ mpegts_packetizer_parse_adaptation_field_control (MpegTSPacketizer2 * /* PCR */ if (afcflags & MPEGTS_AFC_PCR_FLAG) { packet->pcr = mpegts_packetizer_compute_pcr (data); + *data += 6; + GST_DEBUG ("pcr %" G_GUINT64_FORMAT " (%" GST_TIME_FORMAT ")", + packet->pcr, GST_TIME_ARGS (PCRTIME_TO_GSTTIME (packet->pcr))); + if (packetizer->calculate_skew) GST_BUFFER_TIMESTAMP (packet->buffer) = calculate_skew (packetizer, packet->pcr, GST_BUFFER_TIMESTAMP (packet->buffer)); - *data += 6; + if (packetizer->calculate_offset) + record_pcr (packetizer, packet->pcr, packet->offset); } /* OPCR */ if (afcflags & MPEGTS_AFC_OPCR_FLAG) { packet->opcr = mpegts_packetizer_compute_pcr (data); - *data += 6; + /* *data += 6; */ + GST_DEBUG ("opcr %" G_GUINT64_FORMAT " (%" GST_TIME_FORMAT ")", + packet->pcr, GST_TIME_ARGS (PCRTIME_TO_GSTTIME (packet->pcr))); } return TRUE; @@ -2782,6 +2827,7 @@ failed: static void mpegts_packetizer_reset_skew (MpegTSPacketizer2 * packetizer) { + /* FIXME : These variables should be *per* PCR PID */ packetizer->base_time = GST_CLOCK_TIME_NONE; packetizer->base_pcrtime = GST_CLOCK_TIME_NONE; packetizer->last_pcrtime = GST_CLOCK_TIME_NONE; @@ -2798,6 +2844,7 @@ static void mpegts_packetizer_resync (MpegTSPacketizer2 * packetizer, GstClockTime time, GstClockTime gstpcrtime, gboolean reset_skew) { + /* FIXME : These variables should be *per* PCR PID */ packetizer->base_time = time; packetizer->base_pcrtime = gstpcrtime; packetizer->prev_out_time = GST_CLOCK_TIME_NONE; @@ -3082,3 +3129,109 @@ no_skew: return out_time; } + +static void +record_pcr (MpegTSPacketizer2 * packetizer, guint64 pcr, guint64 offset) +{ + MpegTSPacketizerPrivate *priv = packetizer->priv; + + /* Check against first PCR */ + if (priv->first_pcr == -1 || priv->first_offset > offset) { + GST_DEBUG ("Recording first value. PCR:%" G_GUINT64_FORMAT " offset:%" + G_GUINT64_FORMAT, pcr, offset); + priv->first_pcr = pcr; + priv->first_offset = offset; + priv->nb_seen_offsets++; + } else + /* If we didn't update the first PCR, let's check against last PCR */ + if (priv->last_pcr == -1 || priv->last_offset < offset) { + GST_DEBUG ("Recording last value. PCR:%" G_GUINT64_FORMAT " offset:%" + G_GUINT64_FORMAT, pcr, offset); + priv->last_pcr = pcr; + priv->last_offset = offset; + priv->nb_seen_offsets++; + } +} + +guint +mpegts_packetizer_get_seen_pcr (MpegTSPacketizer2 * packetizer) +{ + return packetizer->priv->nb_seen_offsets; +} + +GstClockTime +mpegts_packetizer_offset_to_ts (MpegTSPacketizer2 * packetizer, guint64 offset) +{ + MpegTSPacketizerPrivate *priv = packetizer->priv; + GstClockTime res; + + if (G_UNLIKELY (!packetizer->calculate_offset)) + return GST_CLOCK_TIME_NONE; + + if (G_UNLIKELY (priv->refoffset == -1)) + return GST_CLOCK_TIME_NONE; + + if (G_UNLIKELY (offset < priv->refoffset)) + return GST_CLOCK_TIME_NONE; + + /* Convert byte difference into time difference */ + res = PCRTIME_TO_GSTTIME (gst_util_uint64_scale (offset - priv->refoffset, + priv->last_pcr - priv->first_pcr, + priv->last_offset - priv->first_offset)); + GST_DEBUG ("Returning timestamp %" GST_TIME_FORMAT " for offset %" + G_GUINT64_FORMAT, GST_TIME_ARGS (res), offset); + + return res; +} + +GstClockTime +mpegts_packetizer_pts_to_ts (MpegTSPacketizer2 * packetizer, guint64 pts) +{ + /* Use clock skew if present */ + if (packetizer->calculate_skew + && GST_CLOCK_TIME_IS_VALID (packetizer->base_time)) { + GST_DEBUG ("pts %" G_GUINT64_FORMAT " base_pcrtime:%" G_GUINT64_FORMAT + " base_time:%" GST_TIME_FORMAT, pts, packetizer->base_pcrtime, + GST_TIME_ARGS (packetizer->base_time)); + return pts - packetizer->base_pcrtime + packetizer->base_time + + packetizer->skew; + } + + /* If not, use pcr observations */ + if (packetizer->calculate_offset && packetizer->priv->first_pcr != -1) + return pts - PCRTIME_TO_GSTTIME (packetizer->priv->first_pcr); + + return GST_CLOCK_TIME_NONE; +} + +guint64 +mpegts_packetizer_ts_to_offset (MpegTSPacketizer2 * packetizer, GstClockTime ts) +{ + MpegTSPacketizerPrivate *priv = packetizer->priv; + guint64 res; + + if (!packetizer->calculate_offset || packetizer->priv->first_pcr == -1) + return -1; + + GST_DEBUG ("ts(pcr) %" G_GUINT64_FORMAT " first_pcr:%" G_GUINT64_FORMAT, + GSTTIME_TO_MPEGTIME (ts), priv->first_pcr); + + /* Convert ts to PCRTIME */ + res = gst_util_uint64_scale (GSTTIME_TO_PCRTIME (ts), + priv->last_offset - priv->first_offset, priv->last_pcr - priv->first_pcr); + res += priv->first_offset + priv->refoffset; + + GST_DEBUG ("Returning offset %" G_GUINT64_FORMAT " for ts %" GST_TIME_FORMAT, + res, GST_TIME_ARGS (ts)); + + return res; +} + +void +mpegts_packetizer_set_reference_offset (MpegTSPacketizer2 * packetizer, + guint64 refoffset) +{ + GST_DEBUG ("Setting reference offset to %" G_GUINT64_FORMAT, refoffset); + + packetizer->priv->refoffset = refoffset; +} diff --git a/gst/mpegtsdemux/mpegtspacketizer.h b/gst/mpegtsdemux/mpegtspacketizer.h index 845541afed..4f1f337ba7 100644 --- a/gst/mpegtsdemux/mpegtspacketizer.h +++ b/gst/mpegtsdemux/mpegtspacketizer.h @@ -58,6 +58,7 @@ G_BEGIN_DECLS typedef struct _MpegTSPacketizer2 MpegTSPacketizer2; typedef struct _MpegTSPacketizer2Class MpegTSPacketizer2Class; +typedef struct _MpegTSPacketizerPrivate MpegTSPacketizerPrivate; typedef struct { @@ -74,6 +75,7 @@ struct _MpegTSPacketizer2 { GstAdapter *adapter; /* streams hashed by pid */ + /* FIXME : be more memory efficient (see how it's done in mpegtsbase) */ MpegTSPacketizerStream **streams; gboolean disposed; gboolean know_packet_size; @@ -102,6 +104,11 @@ struct _MpegTSPacketizer2 { gint64 window_min; gint64 skew; gint64 prev_send_diff; + + /* offset/bitrate calculator */ + gboolean calculate_offset; + + MpegTSPacketizerPrivate *priv; }; struct _MpegTSPacketizer2Class { @@ -187,8 +194,22 @@ GstStructure *mpegts_packetizer_parse_eit (MpegTSPacketizer2 *packetizer, MpegTSPacketizerSection *section); GstStructure *mpegts_packetizer_parse_tdt (MpegTSPacketizer2 *packetizer, MpegTSPacketizerSection *section); -guint64 mpegts_packetizer_compute_pcr(const guint8 * data); +/* Only valid if calculate_offset is TRUE */ +guint mpegts_packetizer_get_seen_pcr (MpegTSPacketizer2 *packetizer); + +GstClockTime +mpegts_packetizer_offset_to_ts (MpegTSPacketizer2 * packetizer, + guint64 offset); +guint64 +mpegts_packetizer_ts_to_offset (MpegTSPacketizer2 * packetizer, + GstClockTime ts); +GstClockTime +mpegts_packetizer_pts_to_ts (MpegTSPacketizer2 * packetizer, + guint64 pcr); +void +mpegts_packetizer_set_reference_offset (MpegTSPacketizer2 * packetizer, + guint64 refoffset); G_END_DECLS #endif /* GST_MPEGTS_PACKETIZER_H */ From 77ece06a3f1bfe8746585984c387f99f126278a1 Mon Sep 17 00:00:00 2001 From: Edward Hervey Date: Thu, 1 Mar 2012 17:59:57 +0100 Subject: [PATCH 029/138] mpegtsbase: Error out on EOS without any pad Avoids ending up with hanging pipelines --- gst/mpegtsdemux/mpegtsbase.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/gst/mpegtsdemux/mpegtsbase.c b/gst/mpegtsdemux/mpegtsbase.c index a62314fd91..0f6a308c82 100644 --- a/gst/mpegtsdemux/mpegtsbase.c +++ b/gst/mpegtsdemux/mpegtsbase.c @@ -1439,9 +1439,16 @@ error: { const gchar *reason = gst_flow_get_name (ret); GST_DEBUG_OBJECT (base, "Pausing task, reason %s", reason); - if (ret == GST_FLOW_UNEXPECTED) - GST_MPEGTS_BASE_GET_CLASS (base)->push_event (base, gst_event_new_eos ()); - else if (ret == GST_FLOW_NOT_LINKED || ret < GST_FLOW_UNEXPECTED) { + if (ret == GST_FLOW_UNEXPECTED) { + /* Push EOS downstream */ + if (!GST_MPEGTS_BASE_GET_CLASS (base)->push_event (base, + gst_event_new_eos ())) { + /* If that failed, emit an error so the pipeline can be stopped */ + GST_ELEMENT_ERROR (base, STREAM, DEMUX, (NULL), + ("got eos but no streams (yet)")); + + } + } else if (ret == GST_FLOW_NOT_LINKED || ret < GST_FLOW_UNEXPECTED) { GST_ELEMENT_ERROR (base, STREAM, FAILED, (_("Internal data stream error.")), ("stream stopped, reason %s", reason)); From 097f09b8237d2ad3f72b96be4bc76b668a7c2513 Mon Sep 17 00:00:00 2001 From: Edward Hervey Date: Thu, 1 Mar 2012 18:05:17 +0100 Subject: [PATCH 030/138] mpegtsbase/tsdemux: Refactor seek and segment handling All calculations go through the mpegtspacketizer Remove unused variables/code --- gst/mpegtsdemux/gstmpegdefs.h | 2 + gst/mpegtsdemux/mpegtsbase.c | 140 ++++++++++----- gst/mpegtsdemux/mpegtsbase.h | 12 +- gst/mpegtsdemux/tsdemux.c | 317 +++++++++++++++++----------------- gst/mpegtsdemux/tsdemux.h | 13 +- 5 files changed, 264 insertions(+), 220 deletions(-) diff --git a/gst/mpegtsdemux/gstmpegdefs.h b/gst/mpegtsdemux/gstmpegdefs.h index 66f922b715..62d98c75b1 100644 --- a/gst/mpegtsdemux/gstmpegdefs.h +++ b/gst/mpegtsdemux/gstmpegdefs.h @@ -206,6 +206,8 @@ GST_MSECOND/10, CLOCK_BASE)) #define GSTTIME_TO_MPEGTIME(time) (gst_util_uint64_scale ((time), \ CLOCK_BASE, GST_MSECOND/10)) +#define GSTTIME_TO_PCRTIME(time) (gst_util_uint64_scale ((time), \ + 300 * CLOCK_BASE, GST_MSECOND/10)) #define MPEG_MUX_RATE_MULT 50 diff --git a/gst/mpegtsdemux/mpegtsbase.c b/gst/mpegtsdemux/mpegtsbase.c index 0f6a308c82..45630f2ebe 100644 --- a/gst/mpegtsdemux/mpegtsbase.c +++ b/gst/mpegtsdemux/mpegtsbase.c @@ -221,9 +221,7 @@ mpegts_base_reset (MpegTSBase * base) base->mode = BASE_MODE_STREAMING; base->seen_pat = FALSE; - base->first_pat_offset = -1; - base->in_gap = 0; - base->first_buf_ts = GST_CLOCK_TIME_NONE; + base->seek_offset = -1; base->upstream_live = FALSE; base->query_latency = FALSE; @@ -621,7 +619,7 @@ mpegts_base_deactivate_program (MpegTSBase * base, MpegTSBaseProgram * program) static void mpegts_base_activate_program (MpegTSBase * base, MpegTSBaseProgram * program, - guint16 pmt_pid, GstStructure * pmt_info) + guint16 pmt_pid, GstStructure * pmt_info, gboolean initial_program) { guint i, nbstreams; guint pcr_pid; @@ -666,8 +664,8 @@ mpegts_base_activate_program (MpegTSBase * base, MpegTSBaseProgram * program, mpegts_base_program_add_stream (base, program, (guint16) pcr_pid, -1, NULL); MPEGTS_BIT_SET (base->is_pes, pcr_pid); - program->active = TRUE; + program->initial_program = initial_program; klass = GST_MPEGTS_BASE_GET_CLASS (base); if (klass->program_started != NULL) @@ -855,6 +853,7 @@ mpegts_base_apply_pmt (MpegTSBase * base, { MpegTSBaseProgram *program, *old_program; guint program_number; + gboolean initial_program = TRUE; /* FIXME : not so sure this is valid anymore */ if (G_UNLIKELY (base->seen_pat == FALSE)) { @@ -889,11 +888,13 @@ mpegts_base_apply_pmt (MpegTSBase * base, /* Desactivate the old program */ mpegts_base_deactivate_program (base, old_program); mpegts_base_free_program (old_program); + initial_program = FALSE; } else program = old_program; /* First activate program */ - mpegts_base_activate_program (base, program, pmt_pid, pmt_info); + mpegts_base_activate_program (base, program, pmt_pid, pmt_info, + initial_program); /* if (program->pmt_info) */ /* gst_structure_free (program->pmt_info); */ @@ -986,9 +987,10 @@ mpegts_base_handle_psi (MpegTSBase * base, MpegTSPacketizerSection * section) mpegts_base_apply_pat (base, structure); if (base->seen_pat == FALSE) { base->seen_pat = TRUE; - base->first_pat_offset = GST_BUFFER_OFFSET (section->buffer); GST_DEBUG ("First PAT offset: %" G_GUINT64_FORMAT, - base->first_pat_offset); + GST_BUFFER_OFFSET (section->buffer)); + mpegts_packetizer_set_reference_offset (base->packetizer, + GST_BUFFER_OFFSET (section->buffer)); } } else @@ -1215,8 +1217,6 @@ mpegts_base_sink_event (GstPad * pad, GstEvent * event) gst_segment_set_newsegment_full (&base->segment, update, rate, applied_rate, format, start, stop, position); gst_event_unref (event); - base->in_gap = GST_CLOCK_TIME_NONE; - base->first_buf_ts = GST_CLOCK_TIME_NONE; } break; case GST_EVENT_EOS: @@ -1231,7 +1231,6 @@ mpegts_base_sink_event (GstPad * pad, GstEvent * event) case GST_EVENT_FLUSH_STOP: gst_segment_init (&base->segment, GST_FORMAT_UNDEFINED); base->seen_pat = FALSE; - base->first_pat_offset = -1; /* Passthrough */ default: res = GST_MPEGTS_BASE_GET_CLASS (base)->push_event (base, event); @@ -1256,9 +1255,6 @@ query_upstream_latency (MpegTSBase * base) GST_WARNING_OBJECT (base, "Failed to query upstream latency"); gst_query_unref (query); base->query_latency = TRUE; - - /* Calculate clock skew for live streams only */ - base->packetizer->calculate_skew = base->upstream_live; } static inline GstFlowReturn @@ -1293,13 +1289,6 @@ mpegts_base_chain (GstPad * pad, GstBuffer * buf) query_upstream_latency (base); } - if (G_UNLIKELY (!GST_CLOCK_TIME_IS_VALID (base->first_buf_ts)) && - GST_BUFFER_TIMESTAMP_IS_VALID (buf)) { - base->first_buf_ts = GST_BUFFER_TIMESTAMP (buf); - GST_DEBUG_OBJECT (base, "first buffer timestamp %" GST_TIME_FORMAT, - GST_TIME_ARGS (base->first_buf_ts)); - } - mpegts_packetizer_push (base->packetizer, buf); while (((pret = mpegts_packetizer_next_packet (base->packetizer, &packet)) != PACKET_NEED_MORE) && res == GST_FLOW_OK) { @@ -1347,17 +1336,20 @@ mpegts_base_scan (MpegTSBase * base) GstFlowReturn ret; GstBuffer *buf; guint i; - MpegTSBaseClass *klass = GST_MPEGTS_BASE_GET_CLASS (base); + gboolean done = FALSE; + MpegTSPacketizerPacketReturn pret; + gint64 tmpval; + guint64 upstream_size, seek_pos; + GstFormat format; + guint initial_pcr_seen; GST_DEBUG ("Scanning for initial sync point"); - /* Find initial sync point */ - for (i = 0; i < 10; i++) { - GST_DEBUG ("Grabbing %d => %d", i * 50 * MPEGTS_MAX_PACKETSIZE, - 50 * MPEGTS_MAX_PACKETSIZE); + /* Find initial sync point and at least 5 PCR values */ + for (i = 0; i < 10 && !done; i++) { + GST_DEBUG ("Grabbing %d => %d", i * 65536, 65536); - ret = gst_pad_pull_range (base->sinkpad, i * 50 * MPEGTS_MAX_PACKETSIZE, - 50 * MPEGTS_MAX_PACKETSIZE, &buf); + ret = gst_pad_pull_range (base->sinkpad, i * 65536, 65536, &buf); if (G_UNLIKELY (ret != GST_FLOW_OK)) goto beach; @@ -1365,33 +1357,80 @@ mpegts_base_scan (MpegTSBase * base) mpegts_packetizer_push (base->packetizer, buf); if (mpegts_packetizer_has_packets (base->packetizer)) { - /* Mark the initial sync point and remember the packetsize */ - base->initial_sync_point = base->seek_offset = base->packetizer->offset; - GST_DEBUG ("Sync point is now %" G_GUINT64_FORMAT, base->seek_offset); - base->packetsize = base->packetizer->packet_size; - - /* If the subclass can seek for timestamps, do that */ - if (klass->find_timestamps) { - guint64 offset; - mpegts_packetizer_clear (base->packetizer); - - ret = klass->find_timestamps (base, 0, &offset); - - base->initial_sync_point = base->seek_offset = - base->packetizer->offset = base->first_pat_offset; + if (base->seek_offset == -1) { + /* Mark the initial sync point and remember the packetsize */ + base->seek_offset = base->packetizer->offset; GST_DEBUG ("Sync point is now %" G_GUINT64_FORMAT, base->seek_offset); + base->packetsize = base->packetizer->packet_size; + } + while (1) { + /* Eat up all packets */ + pret = mpegts_packetizer_process_next_packet (base->packetizer); + if (pret == PACKET_NEED_MORE) + break; + if (pret != PACKET_BAD && + mpegts_packetizer_get_seen_pcr (base->packetizer) >= 5) { + GST_DEBUG ("Got enough initial PCR"); + done = TRUE; + break; + } } - goto beach; } } - GST_WARNING ("Didn't find initial sync point"); - ret = GST_FLOW_ERROR; + initial_pcr_seen = mpegts_packetizer_get_seen_pcr (base->packetizer); + if (G_UNLIKELY (initial_pcr_seen == 0)) + goto no_initial_pcr; + GST_DEBUG ("Seen %d initial PCR", initial_pcr_seen); + + /* Now send data from the end */ + mpegts_packetizer_clear (base->packetizer); + + /* Get the size of upstream */ + format = GST_FORMAT_BYTES; + if (!gst_pad_query_peer_duration (base->sinkpad, &format, &tmpval)) + goto beach; + upstream_size = tmpval; + done = FALSE; + + /* Find last PCR value */ + for (seek_pos = MAX (0, upstream_size - 655360); + seek_pos < upstream_size && !done; seek_pos += 65536) { + GST_DEBUG ("Grabbing %d => %d", seek_pos, 65536); + + ret = gst_pad_pull_range (base->sinkpad, seek_pos, 65536, &buf); + if (G_UNLIKELY (ret != GST_FLOW_OK)) + goto beach; + + /* Push to packetizer */ + mpegts_packetizer_push (base->packetizer, buf); + + if (mpegts_packetizer_has_packets (base->packetizer)) { + while (1) { + /* Eat up all packets */ + pret = mpegts_packetizer_process_next_packet (base->packetizer); + if (pret == PACKET_NEED_MORE) + break; + if (pret != PACKET_BAD && + mpegts_packetizer_get_seen_pcr (base->packetizer) > + initial_pcr_seen) { + GST_DEBUG ("Got last PCR"); + done = TRUE; + break; + } + } + } + } beach: mpegts_packetizer_clear (base->packetizer); return ret; +no_initial_pcr: + mpegts_packetizer_clear (base->packetizer); + GST_WARNING_OBJECT (base, "Couldn't find any PCR within the first %d bytes", + 10 * 65536); + return GST_FLOW_ERROR; } @@ -1409,7 +1448,7 @@ mpegts_base_loop (MpegTSBase * base) GST_DEBUG ("Changing to Streaming"); break; case BASE_MODE_SEEKING: - /* FIXME : yes, we should do something here */ + /* FIXME : unclear if we still need mode_seeking... */ base->mode = BASE_MODE_STREAMING; break; case BASE_MODE_STREAMING: @@ -1492,6 +1531,8 @@ mpegts_base_handle_seek_event (MpegTSBase * base, GstPad * pad, flush = flags & GST_SEEK_FLAG_FLUSH; if (base->mode == BASE_MODE_PUSHING) { + /* FIXME : Actually ... it is supported, we just need to convert + * the seek event to BYTES */ GST_ERROR ("seeking in push mode not supported"); goto push_mode; } @@ -1505,6 +1546,7 @@ mpegts_base_handle_seek_event (MpegTSBase * base, GstPad * pad, gst_event_new_flush_start ()); } else gst_pad_pause_task (base->sinkpad); + /* wait for streaming to finish */ GST_PAD_STREAM_LOCK (base->sinkpad); @@ -1512,6 +1554,8 @@ mpegts_base_handle_seek_event (MpegTSBase * base, GstPad * pad, /* send a FLUSH_STOP for the sinkpad, since we need data for seeking */ GST_DEBUG_OBJECT (base, "sending flush stop"); gst_pad_push_event (base->sinkpad, gst_event_new_flush_stop ()); + /* And actually flush our pending data */ + mpegts_base_flush (base); } if (flags & (GST_SEEK_FLAG_SEGMENT | GST_SEEK_FLAG_SKIP)) { @@ -1526,11 +1570,9 @@ mpegts_base_handle_seek_event (MpegTSBase * base, GstPad * pad, ret = klass->seek (base, event); if (G_UNLIKELY (ret != GST_FLOW_OK)) { GST_WARNING ("seeking failed %s", gst_flow_get_name (ret)); - goto done; } } else { GST_WARNING ("subclass has no seek implementation"); - goto done; } } @@ -1568,6 +1610,7 @@ mpegts_base_sink_activate_pull (GstPad * pad, gboolean active) MpegTSBase *base = GST_MPEGTS_BASE (GST_OBJECT_PARENT (pad)); if (active) { base->mode = BASE_MODE_SCANNING; + base->packetizer->calculate_offset = TRUE; return gst_pad_start_task (pad, (GstTaskFunction) mpegts_base_loop, base); } else return gst_pad_stop_task (pad); @@ -1578,6 +1621,7 @@ mpegts_base_sink_activate_push (GstPad * pad, gboolean active) { MpegTSBase *base = GST_MPEGTS_BASE (GST_OBJECT_PARENT (pad)); base->mode = BASE_MODE_PUSHING; + base->packetizer->calculate_skew = TRUE; return TRUE; } diff --git a/gst/mpegtsdemux/mpegtsbase.h b/gst/mpegtsdemux/mpegtsbase.h index 9e6363e424..b0183dfaf2 100644 --- a/gst/mpegtsdemux/mpegtsbase.h +++ b/gst/mpegtsdemux/mpegtsbase.h @@ -78,6 +78,8 @@ struct _MpegTSBaseProgram /* TRUE if the program is currently being used */ gboolean active; + /* TRUE if this is the first program created */ + gboolean initial_program; }; typedef enum { @@ -98,9 +100,6 @@ struct _MpegTSBase { /* pull-based behaviour */ MpegTSBaseMode mode; - /* location of first sync point */ - guint64 initial_sync_point; - /* Current pull offset (also set by seek handler) */ guint64 seek_offset; @@ -132,13 +131,6 @@ struct _MpegTSBase { /* Whether we saw a PAT yet */ gboolean seen_pat; - /* Offset from the origin to the first PAT (pullmode) */ - guint64 first_pat_offset; - - /* interpolation gap between the upstream timestamp and the pts */ - GstClockTime in_gap; - GstClockTime first_buf_ts; - /* Whether upstream is live or not */ gboolean upstream_live; /* Whether we queried the upstream latency or not */ diff --git a/gst/mpegtsdemux/tsdemux.c b/gst/mpegtsdemux/tsdemux.c index 812addb3cd..c941be991b 100644 --- a/gst/mpegtsdemux/tsdemux.c +++ b/gst/mpegtsdemux/tsdemux.c @@ -69,8 +69,17 @@ /* seek to SEEK_TIMESTAMP_OFFSET before the desired offset and search then * either accurately or for the next timestamp */ -#define SEEK_TIMESTAMP_OFFSET (1000 * GST_MSECOND) +#define SEEK_TIMESTAMP_OFFSET (500 * GST_MSECOND) +#define SEGMENT_FORMAT "[format:%s, rate:%f, start:%" \ + GST_TIME_FORMAT", stop:%"GST_TIME_FORMAT", time:%"GST_TIME_FORMAT \ + ", accum:%"GST_TIME_FORMAT", last_stop:%"GST_TIME_FORMAT \ + ", duration:%"GST_TIME_FORMAT"]" + +#define SEGMENT_ARGS(a) gst_format_get_name((a).format), (a).rate, \ + GST_TIME_ARGS((a).start), GST_TIME_ARGS((a).stop), \ + GST_TIME_ARGS((a).time), GST_TIME_ARGS((a).accum), \ + GST_TIME_ARGS((a).last_stop), GST_TIME_ARGS((a).duration) GST_DEBUG_CATEGORY_STATIC (ts_demux_debug); @@ -128,9 +137,15 @@ struct _TSDemuxStream /* Raw value of current PTS/DTS */ guint64 raw_pts; guint64 raw_dts; + /* PTS/DTS with rollover fixed */ + guint64 fixed_pts; + guint64 fixed_dts; /* Number of rollover seen for PTS/DTS (default:0) */ guint nb_pts_rollover; guint nb_dts_rollover; + + /* Whether this stream needs to send a newsegment */ + gboolean need_newsegment; }; #define VIDEO_CAPS \ @@ -204,8 +219,6 @@ enum }; /* Pad functions */ -static const GstQueryType *gst_ts_demux_srcpad_query_types (GstPad * pad); -static gboolean gst_ts_demux_srcpad_query (GstPad * pad, GstQuery * query); /* mpegtsbase methods */ @@ -304,12 +317,19 @@ gst_ts_demux_reset (MpegTSBase * base) { GstTSDemux *demux = (GstTSDemux *) base; - demux->need_newsegment = TRUE; demux->program_number = -1; - - demux->duration = GST_CLOCK_TIME_NONE; + demux->calculate_update_segment = FALSE; gst_segment_init (&demux->segment, GST_FORMAT_TIME); + if (demux->segment_event) { + gst_event_unref (demux->segment_event); + demux->segment_event = NULL; + } + + if (demux->update_segment) { + gst_event_unref (demux->update_segment); + demux->update_segment = NULL; + } } static void @@ -389,9 +409,21 @@ gst_ts_demux_srcpad_query (GstPad * pad, GstQuery * query) GST_DEBUG ("query duration"); gst_query_parse_duration (query, &format, NULL); if (format == GST_FORMAT_TIME) { - if (!gst_pad_peer_query (base->sinkpad, query)) - gst_query_set_duration (query, GST_FORMAT_TIME, - demux->segment.duration); + if (!gst_pad_peer_query (base->sinkpad, query)) { + gint64 val; + + format = GST_FORMAT_BYTES; + if (!gst_pad_query_peer_duration (base->sinkpad, &format, &val)) + res = FALSE; + else { + GstClockTime dur = + mpegts_packetizer_offset_to_ts (base->packetizer, val); + if (GST_CLOCK_TIME_IS_VALID (dur)) + gst_query_set_duration (query, GST_FORMAT_TIME, dur); + else + res = FALSE; + } + } } else { GST_DEBUG_OBJECT (demux, "only query duration on TIME is supported"); res = FALSE; @@ -453,13 +485,6 @@ gst_ts_demux_srcpad_query (GstPad * pad, GstQuery * query) } -static GstFlowReturn -gst_ts_demux_perform_seek (MpegTSBase * base, GstSegment * segment) -{ - return GST_FLOW_ERROR; -} - - static GstFlowReturn gst_ts_demux_do_seek (MpegTSBase * base, GstEvent * event) { @@ -472,6 +497,7 @@ gst_ts_demux_do_seek (MpegTSBase * base, GstEvent * event) gint64 start, stop; GstSegment seeksegment; gboolean update; + guint64 start_offset; gst_event_parse_seek (event, &rate, &format, &flags, &start_type, &start, &stop_type, &stop); @@ -492,31 +518,35 @@ gst_ts_demux_do_seek (MpegTSBase * base, GstEvent * event) /* copy segment, we need this because we still need the old * segment when we close the current segment. */ memcpy (&seeksegment, &demux->segment, sizeof (GstSegment)); + if (demux->segment_event) { + gst_event_unref (demux->segment_event); + demux->segment_event = NULL; + } /* configure the segment with the seek variables */ GST_DEBUG_OBJECT (demux, "configuring seek"); - GST_DEBUG ("seeksegment: start: %" GST_TIME_FORMAT " stop: %" - GST_TIME_FORMAT " time: %" GST_TIME_FORMAT " accum: %" GST_TIME_FORMAT - " last_stop: %" GST_TIME_FORMAT " duration: %" GST_TIME_FORMAT, - GST_TIME_ARGS (seeksegment.start), GST_TIME_ARGS (seeksegment.stop), - GST_TIME_ARGS (seeksegment.time), GST_TIME_ARGS (seeksegment.accum), - GST_TIME_ARGS (seeksegment.last_stop), - GST_TIME_ARGS (seeksegment.duration)); + GST_DEBUG ("seeksegment before set_seek " SEGMENT_FORMAT, + SEGMENT_ARGS (seeksegment)); + gst_segment_set_seek (&seeksegment, rate, format, flags, start_type, start, stop_type, stop, &update); - GST_DEBUG ("seeksegment: start: %" GST_TIME_FORMAT " stop: %" - GST_TIME_FORMAT " time: %" GST_TIME_FORMAT " accum: %" GST_TIME_FORMAT - " last_stop: %" GST_TIME_FORMAT " duration: %" GST_TIME_FORMAT, - GST_TIME_ARGS (seeksegment.start), GST_TIME_ARGS (seeksegment.stop), - GST_TIME_ARGS (seeksegment.time), GST_TIME_ARGS (seeksegment.accum), - GST_TIME_ARGS (seeksegment.last_stop), - GST_TIME_ARGS (seeksegment.duration)); - res = gst_ts_demux_perform_seek (base, &seeksegment); - if (G_UNLIKELY (res != GST_FLOW_OK)) { - GST_WARNING ("seeking failed %s", gst_flow_get_name (res)); + GST_DEBUG ("seeksegment after set_seek " SEGMENT_FORMAT, + SEGMENT_ARGS (seeksegment)); + + /* Convert start/stop to offset */ + start_offset = + mpegts_packetizer_ts_to_offset (base->packetizer, MAX (0, + start - SEEK_TIMESTAMP_OFFSET)); + + if (G_UNLIKELY (start_offset == -1)) { + GST_WARNING ("Couldn't convert start position to an offset"); goto done; } + /* record offset */ + base->seek_offset = start_offset; + res = GST_FLOW_OK; + /* commit the new segment */ memcpy (&demux->segment, &seeksegment, sizeof (GstSegment)); @@ -927,10 +957,13 @@ gst_ts_demux_stream_added (MpegTSBase * base, MpegTSBaseStream * bstream, if (bstream->stream_type != 0xff) stream->pad = create_pad_for_stream (base, bstream, program); + stream->need_newsegment = TRUE; stream->pts = GST_CLOCK_TIME_NONE; stream->dts = GST_CLOCK_TIME_NONE; stream->raw_pts = 0; stream->raw_dts = 0; + stream->fixed_pts = 0; + stream->fixed_dts = 0; stream->nb_pts_rollover = 0; stream->nb_dts_rollover = 0; } @@ -940,24 +973,14 @@ gst_ts_demux_stream_added (MpegTSBase * base, MpegTSBaseStream * bstream, static void gst_ts_demux_stream_removed (MpegTSBase * base, MpegTSBaseStream * bstream) { - GstTSDemux *demux = GST_TS_DEMUX (base); TSDemuxStream *stream = (TSDemuxStream *) bstream; if (stream->pad) { if (gst_pad_is_active (stream->pad)) { - gboolean need_newsegment = demux->need_newsegment; - - /* We must not send the newsegment when flushing the pending data - on the removed stream. We should only push it when the newly added - stream finishes parsing its PTS */ - demux->need_newsegment = FALSE; - /* Flush out all data */ GST_DEBUG_OBJECT (stream->pad, "Flushing out pending data"); gst_ts_demux_push_pending_data ((GstTSDemux *) base, stream); - demux->need_newsegment = need_newsegment; - GST_DEBUG_OBJECT (stream->pad, "Pushing out EOS"); gst_pad_push_event (stream->pad, gst_event_new_eos ()); GST_DEBUG_OBJECT (stream->pad, "Deactivating and removing pad"); @@ -998,6 +1021,15 @@ gst_ts_demux_stream_flush (TSDemuxStream * stream) stream->nbpending = 0; stream->current = NULL; + stream->need_newsegment = TRUE; + stream->pts = GST_CLOCK_TIME_NONE; + stream->dts = GST_CLOCK_TIME_NONE; + stream->raw_pts = 0; + stream->raw_dts = 0; + stream->fixed_pts = 0; + stream->fixed_dts = 0; + stream->nb_pts_rollover = 0; + stream->nb_dts_rollover = 0; } static void @@ -1023,6 +1055,20 @@ gst_ts_demux_program_started (MpegTSBase * base, MpegTSBaseProgram * program) demux->program_number = program->program_number; demux->program = program; + /* If this is not the initial program, we need to calculate + * an update newsegment */ + demux->calculate_update_segment = !program->initial_program; + + /* If we have an upstream time segment and it's the initial program, just use that */ + if (program->initial_program && base->segment.format == GST_FORMAT_TIME) { + demux->segment = base->segment; + demux->segment_event = + gst_event_new_new_segment_full (FALSE, base->segment.rate, + base->segment.applied_rate, GST_FORMAT_TIME, base->segment.start, + base->segment.stop, base->segment.time); + GST_EVENT_SRC (demux->segment_event) = gst_object_ref (demux); + } + /* Activate all stream pads, pads will already have been created */ if (base->mode != BASE_MODE_SCANNING) { for (tmp = program->stream_list; tmp; tmp = tmp->next) @@ -1032,7 +1078,6 @@ gst_ts_demux_program_started (MpegTSBase * base, MpegTSBaseProgram * program) /* Inform scanner we have got our program */ demux->current_program_number = program->program_number; - demux->need_newsegment = TRUE; } } @@ -1113,8 +1158,8 @@ gst_ts_demux_record_pts (GstTSDemux * demux, TSDemuxStream * stream, /* Compute PTS in GstClockTime */ stream->raw_pts = pts; - stream->pts = - MPEGTIME_TO_GSTTIME (pts + stream->nb_pts_rollover * PTS_DTS_MAX_VALUE); + stream->fixed_pts = pts + stream->nb_pts_rollover * PTS_DTS_MAX_VALUE; + stream->pts = MPEGTIME_TO_GSTTIME (stream->fixed_pts); GST_LOG ("pid 0x%04x Stored PTS %" G_GUINT64_FORMAT " (%" GST_TIME_FORMAT ")", bs->pid, stream->raw_pts, GST_TIME_ARGS (stream->pts)); @@ -1159,8 +1204,8 @@ gst_ts_demux_record_dts (GstTSDemux * demux, TSDemuxStream * stream, /* Compute DTS in GstClockTime */ stream->raw_dts = dts; - stream->dts = - MPEGTIME_TO_GSTTIME (dts + stream->nb_dts_rollover * PTS_DTS_MAX_VALUE); + stream->fixed_dts = dts + stream->nb_dts_rollover * PTS_DTS_MAX_VALUE; + stream->dts = MPEGTIME_TO_GSTTIME (stream->fixed_dts); GST_LOG ("pid 0x%04x Stored DTS %" G_GUINT64_FORMAT " (%" GST_TIME_FORMAT ")", bs->pid, stream->raw_dts, GST_TIME_ARGS (stream->dts)); @@ -1215,46 +1260,12 @@ gst_ts_demux_parse_pes_header (GstTSDemux * demux, TSDemuxStream * stream) GST_TIME_ARGS (stream->pts), GST_TIME_ARGS (MPEGTIME_TO_GSTTIME (header.DTS))); - /* safe default if insufficient upstream info */ - if (G_UNLIKELY (!GST_CLOCK_TIME_IS_VALID (base->in_gap) && - GST_CLOCK_TIME_IS_VALID (base->first_buf_ts) && - base->mode == BASE_MODE_PUSHING && - base->segment.format == GST_FORMAT_TIME)) { - /* Find the earliest current PTS we're going to push */ - GstClockTime firstpts = GST_CLOCK_TIME_NONE; - GList *tmp; - - for (tmp = demux->program->stream_list; tmp; tmp = tmp->next) { - TSDemuxStream *pstream = (TSDemuxStream *) tmp->data; - if (!GST_CLOCK_TIME_IS_VALID (firstpts) || pstream->pts < firstpts) - firstpts = pstream->pts; - } - - base->in_gap = base->first_buf_ts - firstpts; - GST_DEBUG_OBJECT (base, "upstream segment start %" GST_TIME_FORMAT - ", first buffer timestamp: %" GST_TIME_FORMAT - ", first PTS: %" GST_TIME_FORMAT - ", interpolation gap: %" GST_TIME_FORMAT, - GST_TIME_ARGS (base->segment.start), - GST_TIME_ARGS (base->first_buf_ts), GST_TIME_ARGS (firstpts), - GST_TIME_ARGS (base->in_gap)); - } - - if (!GST_CLOCK_TIME_IS_VALID (base->in_gap)) - base->in_gap = 0; - - if (base->upstream_live) { + { MpegTSPacketizer2 *packetizer = base->packetizer; - if (GST_CLOCK_TIME_IS_VALID (packetizer->base_time)) - GST_BUFFER_TIMESTAMP (stream->pendingbuffers[0]) = - stream->pts - packetizer->base_pcrtime + packetizer->base_time + - packetizer->skew; - else - GST_BUFFER_TIMESTAMP (stream->pendingbuffers[0]) = GST_CLOCK_TIME_NONE; - } else GST_BUFFER_TIMESTAMP (stream->pendingbuffers[0]) = - stream->pts + base->in_gap; + mpegts_packetizer_pts_to_ts (packetizer, stream->pts); + } GST_DEBUG ("buf %" GST_TIME_FORMAT, GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (stream->pendingbuffers[0]))); } @@ -1346,85 +1357,77 @@ static void calculate_and_push_newsegment (GstTSDemux * demux, TSDemuxStream * stream) { MpegTSBase *base = (MpegTSBase *) demux; - GstEvent *newsegmentevent; - gint64 start = 0, stop = GST_CLOCK_TIME_NONE, position = 0; - GstClockTime firstpts = GST_CLOCK_TIME_NONE; + GstClockTime lowest_pts = GST_CLOCK_TIME_NONE; + GstClockTime firstts = GST_CLOCK_TIME_NONE; GList *tmp; GST_DEBUG ("Creating new newsegment for stream %p", stream); - /* Outgoing newsegment values - * start : The first/start PTS - * stop : The last PTS (or -1) - * position : The stream time corresponding to start - * - * Except for live mode with incoming GST_TIME_FORMAT newsegment where - * it is the same values as that incoming newsegment (and we convert the - * PTS to that remote clock). - */ + /* 1) If we need to calculate an update newsegment, do it + * 2) If we need to calculate a new newsegment, do it + * 3) If an update_segment is valid, push it + * 4) If a newsegment is valid, push it */ + /* Speedup : if we don't need to calculate anything, go straight to pushing */ + if (!demux->calculate_update_segment && demux->segment_event) + goto push_new_segment; + + /* Calculate the 'new_start' value, used for both updates and newsegment */ for (tmp = demux->program->stream_list; tmp; tmp = tmp->next) { TSDemuxStream *pstream = (TSDemuxStream *) tmp->data; - if (!GST_CLOCK_TIME_IS_VALID (firstpts) || pstream->pts < firstpts) - firstpts = pstream->pts; + if (GST_CLOCK_TIME_IS_VALID (pstream->pts)) { + if (!GST_CLOCK_TIME_IS_VALID (lowest_pts) || pstream->pts < lowest_pts) + lowest_pts = pstream->pts; + } + if (GST_CLOCK_TIME_IS_VALID (pstream->dts)) { + if (!GST_CLOCK_TIME_IS_VALID (lowest_pts) || pstream->dts < lowest_pts) + lowest_pts = pstream->dts; + } + } + if (GST_CLOCK_TIME_IS_VALID (lowest_pts)) + firstts = mpegts_packetizer_pts_to_ts (base->packetizer, lowest_pts); + GST_DEBUG ("lowest_pts %" G_GUINT64_FORMAT " => clocktime %" GST_TIME_FORMAT, + lowest_pts, GST_TIME_ARGS (firstts)); + + if (demux->calculate_update_segment) { + GST_DEBUG ("Calculating update segment"); + /* If we have a valid segment, create an update of that */ + if (demux->segment.format == GST_FORMAT_TIME) { + GST_DEBUG ("Re-using segment " SEGMENT_FORMAT, + SEGMENT_ARGS (demux->segment)); + demux->update_segment = + gst_event_new_new_segment_full (TRUE, demux->segment.rate, + demux->segment.applied_rate, GST_FORMAT_TIME, demux->segment.start, + firstts, demux->segment.time); + GST_EVENT_SRC (demux->update_segment) = gst_object_ref (demux); + } + demux->calculate_update_segment = FALSE; } - if (base->mode == BASE_MODE_PUSHING) { - /* FIXME : We're just ignore the upstream format for the time being */ - /* FIXME : We should use base->segment.format and a upstream latency query - * to decide if we need to use live values or not */ - GST_DEBUG ("push-based. base Segment start:%" GST_TIME_FORMAT " duration:%" - GST_TIME_FORMAT ", stop:%" GST_TIME_FORMAT ", time:%" GST_TIME_FORMAT, - GST_TIME_ARGS (base->segment.start), - GST_TIME_ARGS (base->segment.duration), - GST_TIME_ARGS (base->segment.stop), GST_TIME_ARGS (base->segment.time)); - GST_DEBUG ("push-based. demux Segment start:%" GST_TIME_FORMAT " duration:%" - GST_TIME_FORMAT ", stop:%" GST_TIME_FORMAT ", time:%" GST_TIME_FORMAT, - GST_TIME_ARGS (demux->segment.start), - GST_TIME_ARGS (demux->segment.duration), - GST_TIME_ARGS (demux->segment.stop), - GST_TIME_ARGS (demux->segment.time)); - - GST_DEBUG ("stream pts: %" GST_TIME_FORMAT " first pts: %" GST_TIME_FORMAT, - GST_TIME_ARGS (stream->pts), GST_TIME_ARGS (firstpts)); - - if (base->segment.format == GST_FORMAT_TIME) { - start = base->segment.start; - stop = base->segment.stop; - } - if (!base->upstream_live) { - /* Shift the start depending on our position in the stream */ - start += firstpts + base->in_gap - base->first_buf_ts; - } - position = start; - } else { - /* pull mode */ - GST_DEBUG ("pull-based. Segment start:%" GST_TIME_FORMAT " duration:%" - GST_TIME_FORMAT ", time:%" GST_TIME_FORMAT, - GST_TIME_ARGS (demux->segment.start), - GST_TIME_ARGS (demux->segment.duration), - GST_TIME_ARGS (demux->segment.time)); - - /* FIXME : This is not entirely correct. We should be using the PTS time - * realm and not the PCR one. Doesn't matter *too* much if PTS/PCR values - * aren't too far apart, but still. */ - /* FIXME : EDWARD : Removed previous first pcr gsttime */ - start = demux->segment.start; - stop = demux->segment.duration; - position = demux->segment.time; + if (!demux->segment_event) { + GST_DEBUG ("Calculating actual segment"); + /* FIXME : Set proper values */ + demux->segment_event = + gst_event_new_new_segment_full (FALSE, 1.0, 1.0, GST_FORMAT_TIME, + firstts, GST_CLOCK_TIME_NONE, firstts); + GST_EVENT_SRC (demux->segment_event) = gst_object_ref (demux); } - GST_DEBUG ("new segment: start: %" GST_TIME_FORMAT " stop: %" - GST_TIME_FORMAT " time: %" GST_TIME_FORMAT, GST_TIME_ARGS (start), - GST_TIME_ARGS (stop), GST_TIME_ARGS (position)); - newsegmentevent = - gst_event_new_new_segment (FALSE, 1.0, GST_FORMAT_TIME, start, stop, - position); +push_new_segment: + if (demux->update_segment) { + GST_DEBUG_OBJECT (stream->pad, "Pushing update segment"); + gst_event_ref (demux->update_segment); + gst_pad_push_event (stream->pad, demux->update_segment); + } - push_event ((MpegTSBase *) demux, newsegmentevent); + if (demux->segment_event) { + GST_DEBUG_OBJECT (stream->pad, "Pushing newsegment event"); + gst_event_ref (demux->segment_event); + gst_pad_push_event (stream->pad, demux->segment_event); + } - demux->need_newsegment = FALSE; + stream->need_newsegment = FALSE; } static GstFlowReturn @@ -1461,7 +1464,7 @@ gst_ts_demux_push_pending_data (GstTSDemux * demux, TSDemuxStream * stream) goto beach; } - if (G_UNLIKELY (demux->need_newsegment)) + if (G_UNLIKELY (stream->need_newsegment)) calculate_and_push_newsegment (demux, stream); /* We have a confirmed buffer, let's push it out */ @@ -1475,12 +1478,9 @@ gst_ts_demux_push_pending_data (GstTSDemux * demux, TSDemuxStream * stream) GST_DEBUG_OBJECT (stream->pad, "stream->pts %" GST_TIME_FORMAT, GST_TIME_ARGS (stream->pts)); if (GST_CLOCK_TIME_IS_VALID (stream->pts) - && !GST_CLOCK_TIME_IS_VALID (GST_BUFFER_TIMESTAMP (firstbuffer)) - && GST_CLOCK_TIME_IS_VALID (packetizer->base_time)) { + && !GST_CLOCK_TIME_IS_VALID (GST_BUFFER_TIMESTAMP (firstbuffer))) GST_BUFFER_TIMESTAMP (firstbuffer) = - stream->pts - packetizer->base_pcrtime + packetizer->base_time + - packetizer->skew; - } + mpegts_packetizer_pts_to_ts (packetizer, stream->pts); GST_DEBUG_OBJECT (stream->pad, "Pushing buffer list with timestamp: %" GST_TIME_FORMAT, @@ -1493,7 +1493,7 @@ gst_ts_demux_push_pending_data (GstTSDemux * demux, TSDemuxStream * stream) beach: /* Reset everything */ - GST_LOG ("Resetting to EMPTY"); + GST_LOG ("Resetting to EMPTY, returning %s", gst_flow_get_name (res)); stream->state = PENDING_PACKET_EMPTY; memset (stream->pendingbuffers, 0, TS_MAX_PENDING_BUFFERS); stream->nbpending = 0; @@ -1536,7 +1536,7 @@ gst_ts_demux_handle_packet (GstTSDemux * demux, TSDemuxStream * stream, GST_BUFFER_OFFSET (packet->buffer)); } - if (packet->payload) + if (packet->payload && (res == GST_FLOW_OK || res == GST_FLOW_NOT_LINKED)) gst_ts_demux_queue_data (demux, stream, packet); else gst_buffer_unref (packet->buffer); @@ -1549,7 +1549,6 @@ gst_ts_demux_flush (MpegTSBase * base) { GstTSDemux *demux = GST_TS_DEMUX_CAST (base); - demux->need_newsegment = TRUE; gst_ts_demux_flush_streams (demux); } diff --git a/gst/mpegtsdemux/tsdemux.h b/gst/mpegtsdemux/tsdemux.h index 4dff579af4..d23e9d2ee4 100644 --- a/gst/mpegtsdemux/tsdemux.h +++ b/gst/mpegtsdemux/tsdemux.h @@ -61,11 +61,18 @@ struct _GstTSDemux /*< private >*/ MpegTSBaseProgram *program; /* Current program */ guint current_program_number; - gboolean need_newsegment; - /* Downstream segment */ + /* segments to be sent */ GstSegment segment; - GstClockTime duration; /* Total duration */ + GstEvent *segment_event; + + /* Set when program change */ + gboolean calculate_update_segment; + /* update segment is */ + GstEvent *update_segment; + + /* Full stream duration */ + GstClockTime duration; }; struct _GstTSDemuxClass From 044df35560bb095f2d244147928f291a4e65f5d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Thu, 1 Mar 2012 18:46:51 +0000 Subject: [PATCH 031/138] vdpau: relicense four source files from GPL3+ to LGPL2+ These source files were mistakenly licensed as GPL3, the author (Carl-Anton Ingmarsson) has given permission to relicense them to LGPL2+. https://bugzilla.gnome.org/show_bug.cgi?id=671142 --- sys/vdpau/gstvdp/gstvdpoutputbufferpool.c | 26 ++++++++++++----------- sys/vdpau/gstvdp/gstvdpoutputbufferpool.h | 26 ++++++++++++----------- sys/vdpau/gstvdp/gstvdpvideobufferpool.c | 26 ++++++++++++----------- sys/vdpau/gstvdp/gstvdpvideobufferpool.h | 26 ++++++++++++----------- 4 files changed, 56 insertions(+), 48 deletions(-) diff --git a/sys/vdpau/gstvdp/gstvdpoutputbufferpool.c b/sys/vdpau/gstvdp/gstvdpoutputbufferpool.c index 826ef218ba..27f6689885 100644 --- a/sys/vdpau/gstvdp/gstvdpoutputbufferpool.c +++ b/sys/vdpau/gstvdp/gstvdpoutputbufferpool.c @@ -3,18 +3,20 @@ * gst-plugins-bad * Copyright (C) Carl-Anton Ingmarsson 2010 * - * gst-plugins-bad 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 3 of the License, or - * (at your option) any later version. - * - * gst-plugins-bad is distributed in the hope that 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 . + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * 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 "gstvdpdevice.h" diff --git a/sys/vdpau/gstvdp/gstvdpoutputbufferpool.h b/sys/vdpau/gstvdp/gstvdpoutputbufferpool.h index 354461c0e1..7c40684b46 100644 --- a/sys/vdpau/gstvdp/gstvdpoutputbufferpool.h +++ b/sys/vdpau/gstvdp/gstvdpoutputbufferpool.h @@ -3,18 +3,20 @@ * gst-plugins-bad * Copyright (C) Carl-Anton Ingmarsson 2010 * - * gst-plugins-bad 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 3 of the License, or - * (at your option) any later version. - * - * gst-plugins-bad is distributed in the hope that 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 . + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. */ #ifndef _GST_VDP_OUTPUT_BUFFER_POOL_H_ diff --git a/sys/vdpau/gstvdp/gstvdpvideobufferpool.c b/sys/vdpau/gstvdp/gstvdpvideobufferpool.c index 889367d987..fdecb0d482 100644 --- a/sys/vdpau/gstvdp/gstvdpvideobufferpool.c +++ b/sys/vdpau/gstvdp/gstvdpvideobufferpool.c @@ -3,18 +3,20 @@ * gst-plugins-bad * Copyright (C) Carl-Anton Ingmarsson 2010 * - * gst-plugins-bad 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 3 of the License, or - * (at your option) any later version. - * - * gst-plugins-bad is distributed in the hope that 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 . + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * 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 "gstvdpdevice.h" diff --git a/sys/vdpau/gstvdp/gstvdpvideobufferpool.h b/sys/vdpau/gstvdp/gstvdpvideobufferpool.h index e22e9b939c..8676102f1d 100644 --- a/sys/vdpau/gstvdp/gstvdpvideobufferpool.h +++ b/sys/vdpau/gstvdp/gstvdpvideobufferpool.h @@ -3,18 +3,20 @@ * gst-plugins-bad * Copyright (C) Carl-Anton Ingmarsson 2010 * - * gst-plugins-bad 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 3 of the License, or - * (at your option) any later version. - * - * gst-plugins-bad is distributed in the hope that 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 . + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. */ #ifndef _GST_VDP_VIDEO_BUFFERPOOL_H_ From 671550714f2fa4eb011a1b2c7d68f93d8176944a Mon Sep 17 00:00:00 2001 From: Edward Hervey Date: Fri, 2 Mar 2012 10:54:48 +0100 Subject: [PATCH 032/138] mpegtsbase: Check harder for program changes And don't just rely on the section crc/version_number changing to indicate that the program actually changed. --- gst/mpegtsdemux/mpegtsbase.c | 78 ++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) diff --git a/gst/mpegtsdemux/mpegtsbase.c b/gst/mpegtsdemux/mpegtsbase.c index 45630f2ebe..f09d17504b 100644 --- a/gst/mpegtsdemux/mpegtsbase.c +++ b/gst/mpegtsdemux/mpegtsbase.c @@ -569,6 +569,74 @@ mpegts_base_program_remove_stream (MpegTSBase * base, program->streams[pid] = NULL; } +/* Return TRUE if programs are equal */ +static gboolean +mpegts_base_is_same_program (MpegTSBase * base, MpegTSBaseProgram * oldprogram, + guint16 new_pmt_pid, GstStructure * new_pmt_info) +{ + guint i, nbstreams; + guint pcr_pid; + guint pid; + guint stream_type; + GstStructure *stream; + MpegTSBaseStream *oldstream; + gboolean sawpcrpid = FALSE; + const GValue *new_streams; + const GValue *value; + + if (oldprogram->pmt_pid != new_pmt_pid) { + GST_DEBUG ("Different pmt_pid (new:0x%04x, old:0x%04x)", new_pmt_pid, + oldprogram->pmt_pid); + return FALSE; + } + + gst_structure_id_get (new_pmt_info, QUARK_PCR_PID, G_TYPE_UINT, &pcr_pid, + NULL); + if (oldprogram->pcr_pid != pcr_pid) { + GST_DEBUG ("Different pcr_pid (new:0x%04x, old:0x%04x)", + pcr_pid, oldprogram->pcr_pid); + return FALSE; + } + + /* Check the streams */ + new_streams = gst_structure_id_get_value (new_pmt_info, QUARK_STREAMS); + nbstreams = gst_value_list_get_size (new_streams); + + for (i = 0; i < nbstreams; ++i) { + value = gst_value_list_get_value (new_streams, i); + stream = g_value_get_boxed (value); + + gst_structure_id_get (stream, QUARK_PID, G_TYPE_UINT, &pid, + QUARK_STREAM_TYPE, G_TYPE_UINT, &stream_type, NULL); + oldstream = oldprogram->streams[pid]; + if (!oldstream) { + GST_DEBUG ("New stream 0x%04x not present in old program", pid); + return FALSE; + } + if (oldstream->stream_type != stream_type) { + GST_DEBUG + ("New stream 0x%04x has a different stream type (new:%d, old:%d)", + pid, stream_type, oldstream->stream_type); + return FALSE; + } + if (pid == oldprogram->pcr_pid) + sawpcrpid = TRUE; + } + + /* If the pcr is not shared with an existing stream, we'll have one extra stream */ + if (!sawpcrpid) + nbstreams += 1; + + if (nbstreams != g_list_length (oldprogram->stream_list)) { + GST_DEBUG ("Different number of streams (new:%d, old:%d)", + nbstreams, g_list_length (oldprogram->stream_list)); + return FALSE; + } + + GST_DEBUG ("Programs are equal"); + return TRUE; +} + static void mpegts_base_deactivate_program (MpegTSBase * base, MpegTSBaseProgram * program) { @@ -878,6 +946,10 @@ mpegts_base_apply_pmt (MpegTSBase * base, if (G_UNLIKELY (old_program == NULL)) goto no_program; + if (G_UNLIKELY (mpegts_base_is_same_program (base, old_program, pmt_pid, + pmt_info))) + goto same_program; + /* If the current program is active, this means we have a new program */ if (old_program->active) { old_program = mpegts_base_steal_program (base, program_number); @@ -911,6 +983,12 @@ no_program: GST_ERROR ("Attempted to apply a PMT on a program that wasn't created"); return; } + +same_program: + { + GST_DEBUG ("Not applying identical program"); + return; + } } static void From a274bc5b7678926930c5304fb8f80571348f30ba Mon Sep 17 00:00:00 2001 From: Edward Hervey Date: Fri, 2 Mar 2012 11:07:47 +0100 Subject: [PATCH 033/138] mpegvideoparse: Fix level code Valid ranges are from 4 to 10 Valid ranges >> 1 are from 2 to 5 Valid ranges >> 1 - 2 are from 0 to 3 (and not from 1 to 4) --- gst/videoparsers/gstmpegvideoparse.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/gst/videoparsers/gstmpegvideoparse.c b/gst/videoparsers/gstmpegvideoparse.c index 8d19046e7a..f00a795cc5 100644 --- a/gst/videoparsers/gstmpegvideoparse.c +++ b/gst/videoparsers/gstmpegvideoparse.c @@ -636,7 +636,7 @@ gst_mpegv_parse_update_src_caps (GstMpegvParse * mpvparse) profile = profiles[profile_c - 1]; if ((level_c > 3) && (level_c < 11) && (level_c % 2 == 0)) - level = levels[(level_c >> 1) - 1]; + level = levels[(level_c >> 1) - 2]; if (profile_c == 8) { /* Non-hierarchical profile */ @@ -664,6 +664,8 @@ gst_mpegv_parse_update_src_caps (GstMpegvParse * mpvparse) /* FIXME does it make sense to expose profile/level in the caps ? */ + GST_DEBUG_OBJECT (mpvparse, "profile:'%s' level:'%s'", profile, level); + if (profile) gst_caps_set_simple (caps, "profile", G_TYPE_STRING, profile, NULL); else From 4b48c43b31b18f30b706b715c23151a577d34b86 Mon Sep 17 00:00:00 2001 From: Andoni Morales Alastruey Date: Fri, 2 Mar 2012 15:37:57 +0100 Subject: [PATCH 034/138] d3dvideosink: add missing directx headers --- sys/d3dvideosink/Makefile.am | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sys/d3dvideosink/Makefile.am b/sys/d3dvideosink/Makefile.am index 183e460cf6..76b79209df 100644 --- a/sys/d3dvideosink/Makefile.am +++ b/sys/d3dvideosink/Makefile.am @@ -4,11 +4,11 @@ libgstd3dvideosink_la_SOURCES = d3dvideosink.c directx/d3d.c directx/dx.c \ directx/directx9/dx9.c directx/directx9/dx9_d3d.c \ directx/directx10/dx10.c directx/directx10/dx10_d3d.c \ directx/directx11/dx11.c directx/directx11/dx11_d3d.c -libgstd3dvideosink_la_CFLAGS = $(GST_PLUGINS_BAD_CFLAGS) $(GST_CFLAGS) +libgstd3dvideosink_la_CFLAGS = $(GST_PLUGINS_BAD_CFLAGS) $(GST_CFLAGS) $(DIRECTX_CFLAGS) libgstd3dvideosink_la_LIBADD = $(GST_BASE_LIBS) $(GST_PLUGINS_BASE_LIBS) \ -lgstvideo-$(GST_MAJORMINOR) -lgstinterfaces-$(GST_MAJORMINOR) \ $(DIRECT3D_LIBS) -libgstd3dvideosink_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstd3dvideosink_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) $(DIRECTX_LDFAGS) libgstd3dvideosink_la_LIBTOOLFLAGS = --tag=disable-static noinst_HEADERS = d3dvideosink.h directx/d3d.h directx/dx.h directx/directx.h \ From ece4dfc3c6316e77a21d794d6df42244bdf382dd Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Wed, 29 Feb 2012 11:14:15 -0300 Subject: [PATCH 035/138] tsdemux: Activate pads only when receiving data for the stream https://bugzilla.gnome.org/show_bug.cgi?id=670921 --- gst/mpegtsdemux/tsdemux.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/gst/mpegtsdemux/tsdemux.c b/gst/mpegtsdemux/tsdemux.c index c941be991b..6e9107b10e 100644 --- a/gst/mpegtsdemux/tsdemux.c +++ b/gst/mpegtsdemux/tsdemux.c @@ -114,6 +114,8 @@ struct _TSDemuxStream MpegTSBaseStream stream; GstPad *pad; + /* Whether the pad was added or not */ + gboolean active; /* the return of the latest push */ GstFlowReturn flow_return; @@ -956,6 +958,7 @@ gst_ts_demux_stream_added (MpegTSBase * base, MpegTSBaseStream * bstream, /* Create the pad */ if (bstream->stream_type != 0xff) stream->pad = create_pad_for_stream (base, bstream, program); + stream->active = FALSE; stream->need_newsegment = TRUE; stream->pts = GST_CLOCK_TIME_NONE; @@ -976,7 +979,7 @@ gst_ts_demux_stream_removed (MpegTSBase * base, MpegTSBaseStream * bstream) TSDemuxStream *stream = (TSDemuxStream *) bstream; if (stream->pad) { - if (gst_pad_is_active (stream->pad)) { + if (stream->active && gst_pad_is_active (stream->pad)) { /* Flush out all data */ GST_DEBUG_OBJECT (stream->pad, "Flushing out pending data"); gst_ts_demux_push_pending_data ((GstTSDemux *) base, stream); @@ -986,6 +989,7 @@ gst_ts_demux_stream_removed (MpegTSBase * base, MpegTSBaseStream * bstream) GST_DEBUG_OBJECT (stream->pad, "Deactivating and removing pad"); gst_pad_set_active (stream->pad, FALSE); gst_element_remove_pad (GST_ELEMENT_CAST (base), stream->pad); + stream->active = FALSE; } stream->pad = NULL; } @@ -1000,6 +1004,7 @@ activate_pad_for_stream (GstTSDemux * tsdemux, TSDemuxStream * stream) GST_DEBUG_PAD_NAME (stream->pad), stream); gst_pad_set_active (stream->pad, TRUE); gst_element_add_pad ((GstElement *) tsdemux, stream->pad); + stream->active = TRUE; GST_DEBUG_OBJECT (stream->pad, "done adding pad"); } else GST_WARNING_OBJECT (tsdemux, @@ -1049,7 +1054,6 @@ gst_ts_demux_program_started (MpegTSBase * base, MpegTSBaseProgram * program) if (demux->program_number == -1 || demux->program_number == program->program_number) { - GList *tmp; GST_LOG ("program %d started", program->program_number); demux->program_number = program->program_number; @@ -1069,12 +1073,7 @@ gst_ts_demux_program_started (MpegTSBase * base, MpegTSBaseProgram * program) GST_EVENT_SRC (demux->segment_event) = gst_object_ref (demux); } - /* Activate all stream pads, pads will already have been created */ - if (base->mode != BASE_MODE_SCANNING) { - for (tmp = program->stream_list; tmp; tmp = tmp->next) - activate_pad_for_stream (demux, (TSDemuxStream *) tmp->data); - gst_element_no_more_pads ((GstElement *) demux); - } + /* FIXME : When do we emit no_more_pads ? */ /* Inform scanner we have got our program */ demux->current_program_number = program->program_number; @@ -1456,6 +1455,9 @@ gst_ts_demux_push_pending_data (GstTSDemux * demux, TSDemuxStream * stream) if (G_UNLIKELY (stream->state != PENDING_PACKET_BUFFER)) goto beach; + if (G_UNLIKELY (!stream->active)) + activate_pad_for_stream (demux, stream); + if (G_UNLIKELY (stream->pad == NULL)) { g_list_foreach (stream->currentlist, (GFunc) gst_buffer_unref, NULL); g_list_free (stream->currentlist); From a3ae51be29c454bcf5362c3825933177f1dd2ec9 Mon Sep 17 00:00:00 2001 From: Edward Hervey Date: Fri, 2 Mar 2012 17:10:28 +0100 Subject: [PATCH 036/138] mpegtsbase: Flush out the packetizer on flushing seeks ... else we end up with bogus data/offsets --- gst/mpegtsdemux/mpegtsbase.c | 1 + 1 file changed, 1 insertion(+) diff --git a/gst/mpegtsdemux/mpegtsbase.c b/gst/mpegtsdemux/mpegtsbase.c index f09d17504b..68af31221e 100644 --- a/gst/mpegtsdemux/mpegtsbase.c +++ b/gst/mpegtsdemux/mpegtsbase.c @@ -1634,6 +1634,7 @@ mpegts_base_handle_seek_event (MpegTSBase * base, GstPad * pad, gst_pad_push_event (base->sinkpad, gst_event_new_flush_stop ()); /* And actually flush our pending data */ mpegts_base_flush (base); + mpegts_packetizer_flush (base->packetizer); } if (flags & (GST_SEEK_FLAG_SEGMENT | GST_SEEK_FLAG_SKIP)) { From 01f5f62d9559b552afb63432186cd5ffd2625df2 Mon Sep 17 00:00:00 2001 From: Edward Hervey Date: Fri, 2 Mar 2012 17:11:33 +0100 Subject: [PATCH 037/138] tsdemux: Fix segment start position If we *really* can't figure out the first start position, that most likely means the data to push out doesn't have any timestamp. Use a default value of 0 then --- gst/mpegtsdemux/tsdemux.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gst/mpegtsdemux/tsdemux.c b/gst/mpegtsdemux/tsdemux.c index 6e9107b10e..9bb05cd5b9 100644 --- a/gst/mpegtsdemux/tsdemux.c +++ b/gst/mpegtsdemux/tsdemux.c @@ -1357,7 +1357,7 @@ calculate_and_push_newsegment (GstTSDemux * demux, TSDemuxStream * stream) { MpegTSBase *base = (MpegTSBase *) demux; GstClockTime lowest_pts = GST_CLOCK_TIME_NONE; - GstClockTime firstts = GST_CLOCK_TIME_NONE; + GstClockTime firstts = 0; GList *tmp; GST_DEBUG ("Creating new newsegment for stream %p", stream); From 0bb5a01639079e30f7236b932ad11d4a48cda47c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Sat, 3 Mar 2012 15:47:01 +0000 Subject: [PATCH 038/138] tsdemux: fix confusing variable name --- gst/mpegtsdemux/mpegtsbase.c | 6 +++--- gst/mpegtsdemux/mpegtsbase.h | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/gst/mpegtsdemux/mpegtsbase.c b/gst/mpegtsdemux/mpegtsbase.c index 68af31221e..dee31fb22f 100644 --- a/gst/mpegtsdemux/mpegtsbase.c +++ b/gst/mpegtsdemux/mpegtsbase.c @@ -224,7 +224,7 @@ mpegts_base_reset (MpegTSBase * base) base->seek_offset = -1; base->upstream_live = FALSE; - base->query_latency = FALSE; + base->queried_latency = FALSE; if (klass->reset) klass->reset (base); @@ -1332,7 +1332,7 @@ query_upstream_latency (MpegTSBase * base) } else GST_WARNING_OBJECT (base, "Failed to query upstream latency"); gst_query_unref (query); - base->query_latency = TRUE; + base->queried_latency = TRUE; } static inline GstFlowReturn @@ -1363,7 +1363,7 @@ mpegts_base_chain (GstPad * pad, GstBuffer * buf) base = GST_MPEGTS_BASE (gst_object_get_parent (GST_OBJECT (pad))); packetizer = base->packetizer; - if (G_UNLIKELY (base->query_latency == FALSE)) { + if (G_UNLIKELY (base->queried_latency == FALSE)) { query_upstream_latency (base); } diff --git a/gst/mpegtsdemux/mpegtsbase.h b/gst/mpegtsdemux/mpegtsbase.h index b0183dfaf2..edce58d506 100644 --- a/gst/mpegtsdemux/mpegtsbase.h +++ b/gst/mpegtsdemux/mpegtsbase.h @@ -134,7 +134,7 @@ struct _MpegTSBase { /* Whether upstream is live or not */ gboolean upstream_live; /* Whether we queried the upstream latency or not */ - gboolean query_latency; + gboolean queried_latency; /* Upstream segment */ GstSegment segment; From 5c9f7900759d3ea2ae740e4dd04079381678fed8 Mon Sep 17 00:00:00 2001 From: Gwenole Beauchesne Date: Fri, 2 Mar 2012 11:45:41 +0100 Subject: [PATCH 039/138] codecparsers: h264: record number of emulation prevention bytes in slice_header(). Some hardware video decode acceleration API (VA-API, DXVA) require a bit count to the first macroblock, minus the number of emulation prevention bytes. So, instead of having the consumer of the library scan the slice_header() again, just record that number while parsing. Signed-off-by: Gwenole Beauchesne https://bugzilla.gnome.org/show_bug.cgi?id=671203 --- gst-libs/gst/codecparsers/gsth264parser.c | 10 ++++++++++ gst-libs/gst/codecparsers/gsth264parser.h | 3 +++ 2 files changed, 13 insertions(+) diff --git a/gst-libs/gst/codecparsers/gsth264parser.c b/gst-libs/gst/codecparsers/gsth264parser.c index 572a28dedf..efb4c739db 100644 --- a/gst-libs/gst/codecparsers/gsth264parser.c +++ b/gst-libs/gst/codecparsers/gsth264parser.c @@ -167,6 +167,7 @@ typedef struct const guint8 *data; guint size; + guint n_epb; /* Number of emulation prevention bytes */ guint byte; /* Byte position */ guint bits_in_cache; /* bitpos in the cache of next bit */ guint8 first_byte; @@ -178,6 +179,7 @@ nal_reader_init (NalReader * nr, const guint8 * data, guint size) { nr->data = data; nr->size = size; + nr->n_epb = 0; nr->byte = 0; nr->bits_in_cache = 0; @@ -211,6 +213,7 @@ nal_reader_read (NalReader * nr, guint nbits) ((nr->cache & 0xff) == 0)) { /* next byte goes unconditionally to the cache, even if it's 0x03 */ check_three_byte = FALSE; + nr->n_epb++; goto next_byte; } nr->cache = (nr->cache << 8) | nr->first_byte; @@ -263,6 +266,12 @@ nal_reader_get_remaining (const NalReader * nr) return (nr->size - nr->byte) * 8 + nr->bits_in_cache; } +static inline guint +nal_reader_get_epb_count (const NalReader * nr) +{ + return nr->n_epb; +} + #define GST_NAL_READER_READ_BITS(bits) \ static gboolean \ nal_reader_get_bits_uint##bits (NalReader *nr, guint##bits *val, guint nbits) \ @@ -1882,6 +1891,7 @@ gst_h264_parser_parse_slice_hdr (GstH264NalParser * nalparser, } slice->header_size = nal_reader_get_pos (&nr); + slice->n_emulation_prevention_bytes = nal_reader_get_epb_count (&nr); return GST_H264_PARSER_OK; diff --git a/gst-libs/gst/codecparsers/gsth264parser.h b/gst-libs/gst/codecparsers/gsth264parser.h index 3c221560e8..2e570c8a98 100644 --- a/gst-libs/gst/codecparsers/gsth264parser.h +++ b/gst-libs/gst/codecparsers/gsth264parser.h @@ -599,6 +599,9 @@ struct _GstH264SliceHdr /* Size of the slice_header() in bits */ guint header_size; + + /* Number of emulation prevention bytes (EPB) in this slice_header() */ + guint n_emulation_prevention_bytes; }; From 0b8fb8b587fdfb7d117a3e8756f17e4bafca9f16 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Sat, 3 Mar 2012 15:57:11 +0000 Subject: [PATCH 040/138] configure: use AS_LIBTOOL and bump version for ABI change in h.264 codec parser Backported from the 0.10 release branch, where v.23 was used. https://bugzilla.gnome.org/show_bug.cgi?id=671203 --- configure.ac | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/configure.ac b/configure.ac index 63a0104920..72f327293e 100644 --- a/configure.ac +++ b/configure.ac @@ -41,6 +41,14 @@ dnl we override it here if we need to for the release candidate of new series GST_MAJORMINOR=0.10 AC_SUBST(GST_MAJORMINOR) +dnl CURRENT, REVISION, AGE +dnl - library source changed -> increment REVISION +dnl - interfaces added/removed/changed -> increment CURRENT, REVISION = 0 +dnl - interfaces added -> increment AGE +dnl - interfaces removed -> AGE = 0 +dnl sets GST_LT_LDFLAGS +AS_LIBTOOL(GST, 24, 0, 0) + AG_GST_LIBTOOL_PREPARE dnl FIXME: this macro doesn't actually work; From 740c3101ac538a4a3f7e502aa2d8ceea54c2dca6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A0=D1=83=D1=81=D0=BB=D0=B0=D0=BD=20=D0=98=D0=B6=D0=B1?= =?UTF-8?q?=D1=83=D0=BB=D0=B0=D1=82=D0=BE=D0=B2?= Date: Fri, 2 Mar 2012 21:41:39 +0400 Subject: [PATCH 041/138] d3dvideosink: fix compiler warnings and build failure with mingw shared.d3ddev was removed a while back, not sure how this still compiles for anyone (tpm). https://bugzilla.gnome.org/show_bug.cgi?id=653718 https://bugzilla.gnome.org/show_bug.cgi?id=670143 https://bugzilla.gnome.org/show_bug.cgi?id=656905 --- sys/d3dvideosink/d3dvideosink.c | 14 ++++++++------ sys/d3dvideosink/directx/d3d.h | 6 +++--- sys/d3dvideosink/directx/dx.h | 2 +- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/sys/d3dvideosink/d3dvideosink.c b/sys/d3dvideosink/d3dvideosink.c index 1bca84703b..504d8104f5 100644 --- a/sys/d3dvideosink/d3dvideosink.c +++ b/sys/d3dvideosink/d3dvideosink.c @@ -63,7 +63,7 @@ struct _GstD3DVideoSinkHookData static GstD3DVideoSinkShared shared; /* Define a shared lock to synchronize the creation/destruction of the d3d device */ static GStaticMutex shared_d3d_lock = G_STATIC_MUTEX_INIT; -static GStaticMutex shared_d3d_dev_lock = G_STATIC_MUTEX_INIT; +static G_GNUC_UNUSED GStaticMutex shared_d3d_dev_lock = G_STATIC_MUTEX_INIT; static GStaticMutex shared_d3d_hook_lock = G_STATIC_MUTEX_INIT; /* Hold a reference to our dll's HINSTANCE */ static HINSTANCE g_hinstDll = NULL; @@ -156,7 +156,7 @@ static void gst_d3dvideosink_remove_window_for_renderer (GstD3DVideoSink * static gboolean gst_d3dvideosink_initialize_direct3d (GstD3DVideoSink * sink); static gboolean gst_d3dvideosink_initialize_d3d_device (GstD3DVideoSink * sink); static gboolean gst_d3dvideosink_resize_swap_chain (GstD3DVideoSink * sink, - gint width, gint height); + gint width, gint height) G_GNUC_UNUSED; static gboolean gst_d3dvideosink_notify_device_init (GstD3DVideoSink * sink); static gboolean gst_d3dvideosink_notify_device_lost (GstD3DVideoSink * sink); static gboolean gst_d3dvideosink_notify_device_reset (GstD3DVideoSink * sink); @@ -468,11 +468,13 @@ gst_d3dvideosink_get_caps (GstBaseSink * basesink) GstStructure *stru = gst_caps_get_structure (c, i); if (!gst_structure_has_name (stru, "video/x-raw-rgb")) { gst_structure_get_fourcc (stru, "format", (guint32 *) & d3dfourcc); - switch (d3dfourcc) { + switch ((guint32) d3dfourcc) { case GST_MAKE_FOURCC ('Y', 'V', '1', '2'): case GST_MAKE_FOURCC ('I', '4', '2', '0'): d3dfourcc = (D3DFORMAT) MAKEFOURCC ('Y', 'V', '1', '2'); break; + default: + break; } if (d3dfourcc && SUCCEEDED (IDirect3D9_CheckDeviceFormat (shared.d3d, D3DADAPTER_DEFAULT, @@ -529,10 +531,10 @@ gst_d3dvideosink_create_shared_hidden_window (GstD3DVideoSink * sink) goto failed; CloseHandle (shared.hidden_window_created_signal); - +/* if (!shared.d3ddev) goto failed; - +*/ GST_DEBUG ("Successfully created Direct3D hidden window, handle: %p", shared.hidden_window_handle); @@ -1567,7 +1569,7 @@ gst_d3dvideosink_flush_gpu (GstD3DVideoSink * sink) } } -static void +static G_GNUC_UNUSED void gst_d3dvideosink_wait_for_vsync (GstD3DVideoSink * sink) { if (sink->d3dpp.PresentationInterval == D3DPRESENT_INTERVAL_IMMEDIATE) { diff --git a/sys/d3dvideosink/directx/d3d.h b/sys/d3dvideosink/directx/d3d.h index c58310fd9f..238349c27c 100644 --- a/sys/d3dvideosink/directx/d3d.h +++ b/sys/d3dvideosink/directx/d3d.h @@ -33,8 +33,8 @@ G_BEGIN_DECLS #define WM_DIRECTX_D3D_RESIZE WM_DIRECTX + 5 #define DIRECTX_D3D_API(version, dispatch_table, init_function, create_function, resize_function, device_lost_function, notify_device_reset_function, release_function) \ - static gpointer DIRECTX_API_COMPONENT_D3D_ ## version ## _DISPATCH_TABLE = &dispatch_table; \ - static DirectXAPIComponentD3D DIRECTX_API_COMPONENT_D3D_ ## version ## _INIT = { \ + static gpointer G_GNUC_UNUSED DIRECTX_API_COMPONENT_D3D_ ## version ## _DISPATCH_TABLE = &dispatch_table; \ + static DirectXAPIComponentD3D G_GNUC_UNUSED DIRECTX_API_COMPONENT_D3D_ ## version ## _INIT = { \ create_function /*create_function*/ \ , resize_function /*resize_function*/ \ , device_lost_function /*device_lost_function*/ \ @@ -42,7 +42,7 @@ G_BEGIN_DECLS , release_function /*release_function*/ \ , NULL /*private_data*/ \ }; \ - static void init_directx_api_component_d3d_ ## version ## _(const DirectXAPI* api) { \ + static void G_GNUC_UNUSED init_directx_api_component_d3d_ ## version ## _(const DirectXAPI* api) { \ gpointer private_data = &DIRECTX_API_COMPONENT_D3D_ ## version ## _INIT; \ gpointer vtable = DIRECTX_API_COMPONENT_D3D_ ## version ## _DISPATCH_TABLE; \ DIRECTX_SET_COMPONENT_INIT(DIRECTX_D3D(api), init_function); \ diff --git a/sys/d3dvideosink/directx/dx.h b/sys/d3dvideosink/directx/dx.h index 60dd6d869c..dcf7c05dbc 100644 --- a/sys/d3dvideosink/directx/dx.h +++ b/sys/d3dvideosink/directx/dx.h @@ -111,7 +111,7 @@ typedef enum , &DIRECTX_ ## version ## _DIRECTCOMPUTE_COMPONENT \ , {NULL, NULL, NULL} /*reserved*/ \ }; \ - static void init_directx_ ## version ## _supported_api(void) { \ + static void G_GNUC_UNUSED init_directx_ ## version ## _supported_api(void) { \ DirectXAPI* api; \ api = &DIRECTX_ ## version ## _API; \ api->d3d->api = api; \ From f88c45c0cfded0579bea6cc0a001b8a60b7c7e4a Mon Sep 17 00:00:00 2001 From: Stefan Sauer Date: Tue, 13 Dec 2011 10:26:50 +0100 Subject: [PATCH 042/138] audiovisualizers: planning + example update --- gst/audiovisualizers/README | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/gst/audiovisualizers/README b/gst/audiovisualizers/README index be2491e06d..3c59f0e01e 100644 --- a/gst/audiovisualizers/README +++ b/gst/audiovisualizers/README @@ -58,6 +58,11 @@ xxxscope - element maker template - test for baseclass +- actors + - we use the wave, filtered waves, balance and fft so far + - we could have narrow filters over harmonic frequencies + - we could use loudness like determined in level-meter + - we probably want a VisBin like the gnome video effects - this way we can specify pipeline fragments - VisBin can use a videomixer to switch effects based on time or song @@ -82,3 +87,5 @@ GST_PLUGIN_PATH=$GST_PLUGIN_PATH:$PWD gst-launch filesrc location=$HOME/Music/1. GST_PLUGIN_PATH=$GST_PLUGIN_PATH:$PWD gst-launch filesrc location=$HOME/Music/1.mp3 ! decodebin2 ! tee name=t ! queue ! audioconvert ! synaesthesia ! ximagesink t. ! queue ! synaescope shade-amount=0x00040404 ! colorspace ! ximagesink +gst-launch filesrc location=$HOME/Music/1.mp3 ! decodebin2 ! tee name=t ! queue ! audioconvert ! wavescope style=color-lines shade-amount=0x00080402 ! alpha alpha=0.5 ! videomixer2 name=m background=black ! colorspace ! vertigotv ! ximagesink t. ! queue ! audioconvert ! spacescope style=color-lines shade-amount=0x00080402 ! alpha alpha=0.5 ! m. t. ! queue ! pulsesink + From b84271faa6510475079c7578e23ca60d19321141 Mon Sep 17 00:00:00 2001 From: Stefan Sauer Date: Tue, 13 Dec 2011 23:43:59 +0100 Subject: [PATCH 043/138] resindvd: send duration message on duration updates When we know a new duration, report it. Add more logging. --- ext/resindvd/resindvdsrc.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/ext/resindvd/resindvdsrc.c b/ext/resindvd/resindvdsrc.c index 53320752bd..76139aa529 100644 --- a/ext/resindvd/resindvdsrc.c +++ b/ext/resindvd/resindvdsrc.c @@ -1036,6 +1036,7 @@ rsn_dvdsrc_step (resinDvdSrc * src, gboolean have_dvd_lock) break; case DVDNAV_CELL_CHANGE:{ dvdnav_cell_change_event_t *event = (dvdnav_cell_change_event_t *) data; + GstMessage *message; src->pgc_duration = MPEGTIME_TO_GSTTIME (event->pgc_length); /* event->cell_start has the wrong time - it doesn't handle @@ -1049,6 +1050,10 @@ rsn_dvdsrc_step (resinDvdSrc * src, gboolean have_dvd_lock) GST_TIME_FORMAT, GST_TIME_ARGS (src->pgc_duration), GST_TIME_ARGS (src->cur_position)); + message = gst_message_new_duration (GST_OBJECT (src), GST_FORMAT_TIME, + src->pgc_duration); + gst_element_post_message (GST_ELEMENT (src), message); + rsn_dvdsrc_prepare_streamsinfo_event (src); src->need_tag_update = TRUE; @@ -2485,6 +2490,9 @@ rsn_dvdsrc_src_query (GstBaseSrc * basesrc, GstQuery * query) if (format == GST_FORMAT_TIME) { if (src->pgc_duration != GST_CLOCK_TIME_NONE) { val = src->pgc_duration; + + GST_DEBUG_OBJECT (src, "duration : %" GST_TIME_FORMAT, + GST_TIME_ARGS (val)); gst_query_set_duration (query, format, val); res = TRUE; } From d68c6bfa9f5d9121eed115a1e73d293fab6b5ed2 Mon Sep 17 00:00:00 2001 From: Sreerenj Balachandran Date: Wed, 2 Nov 2011 11:02:11 +0200 Subject: [PATCH 044/138] Initial Commit: Adding Wayland Video Sink --- configure.ac | 27 ++ ext/Makefile.am | 8 + ext/wayland/Makefile.am | 13 + ext/wayland/gstwaylandsink.c | 586 +++++++++++++++++++++++++++++++++++ ext/wayland/gstwaylandsink.h | 102 ++++++ 5 files changed, 736 insertions(+) create mode 100644 ext/wayland/Makefile.am create mode 100755 ext/wayland/gstwaylandsink.c create mode 100755 ext/wayland/gstwaylandsink.h diff --git a/configure.ac b/configure.ac index 72f327293e..96c8849188 100644 --- a/configure.ac +++ b/configure.ac @@ -828,6 +828,31 @@ AG_GST_CHECK_FEATURE(DIRECTFB, [directfb], dfbvideosink , [ ]) ]) +dnl **** Wayland **** +translit(dnm, m, l) AM_CONDITIONAL(USE_WAYLAND, true) +AG_GST_CHECK_FEATURE(WAYLAND, [wayland sink], wayland , [ + PKG_CHECK_MODULES(WAYLAND, wayland-client >= 0.1, [ + AC_CHECK_HEADER(wayland-client.h, HAVE_WAYLAND_CLIENT="yes", HAVE_WAYLAND_CLIENT="no") + AC_CHECK_HEADER(wayland-client-protocol.h, HAVE_WAYLAND_CLIENT_PROTOCOL="yes", HAVE_WAYLAND_CLIENT_PROTOCOL="no") + if test "x$HAVE_WAYLAND_CLIENT" = "xno"; then + AC_MSG_RESULT(wayland-client.h could not be found.) + HAVE_WAYLAND="no" + elif test "x$HAVE_WAYLAND_CLIENT_PROTOCOL" = "xno"; then + AC_MSG_RESULT(wayland-client-protocol.h could not be found.) + HAVE_WAYLAND="no" + else + HAVE_WAYLAND="yes" + WAYLAND_LIBS="-lwayland-client" + fi + ], [ + AC_MSG_RESULT(no wayland.) + HAVE_WAYLAND="no" + ]) +WAYLAND_CFLAGS="" +AC_SUBST(WAYLAND_CFLAGS) +AC_SUBST(WAYLAND_LIBS) +]) + dnl **** Dirac **** translit(dnm, m, l) AM_CONDITIONAL(USE_DIRAC, true) AG_GST_CHECK_FEATURE(DIRAC, [dirac], dirac, [ @@ -1804,6 +1829,7 @@ AM_CONDITIONAL(USE_CURL, false) AM_CONDITIONAL(USE_DC1394, false) AM_CONDITIONAL(USE_DECKLINK, false) AM_CONDITIONAL(USE_DIRECTFB, false) +AM_CONDITIONAL(USE_WAYLAND, false) AM_CONDITIONAL(USE_DIRAC, false) AM_CONDITIONAL(USE_DTS, false) AM_CONDITIONAL(USE_DIVX, false) @@ -2062,6 +2088,7 @@ ext/curl/Makefile ext/dc1394/Makefile ext/dirac/Makefile ext/directfb/Makefile +ext/wayland/Makefile ext/divx/Makefile ext/dts/Makefile ext/faac/Makefile diff --git a/ext/Makefile.am b/ext/Makefile.am index a1636f6904..0d57dc3bba 100644 --- a/ext/Makefile.am +++ b/ext/Makefile.am @@ -94,6 +94,12 @@ else DIRECTFB_DIR= endif +if USE_WAYLAND +WAYLAND_DIR=wayland +else +WAYLAND_DIR= +endif + if USE_DIVX DIVX_DIR=divx else @@ -409,6 +415,7 @@ SUBDIRS=\ $(DC1394_DIR) \ $(DIRAC_DIR) \ $(DIRECTFB_DIR) \ + $(WAYLAND_DIR) \ $(DIVX_DIR) \ $(DTS_DIR) \ $(RESINDVD_DIR) \ @@ -469,6 +476,7 @@ DIST_SUBDIRS = \ dc1394 \ dirac \ directfb \ + wayland \ faac \ faad \ flite \ diff --git a/ext/wayland/Makefile.am b/ext/wayland/Makefile.am new file mode 100644 index 0000000000..122e8f09e4 --- /dev/null +++ b/ext/wayland/Makefile.am @@ -0,0 +1,13 @@ +plugin_LTLIBRARIES = libgstwaylandsink.la + +libgstwaylandsink_la_SOURCES = gstwaylandsink.c +libgstwaylandsink_la_CFLAGS = $(GST_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) \ + $(WAYLAND_CFLAGS) +libgstwaylandsink_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) \ + -lgstvideo-$(GST_MAJORMINOR) \ + -lgstinterfaces-$(GST_MAJORMINOR) \ + $(WAYLAND_LIBS) $(LIBOIL_LIBS) +libgstwaylandsink_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstwaylandsink_la_LIBTOOLFLAGS = --tag=disable-static + +noinst_HEADERS = gstwaylandsink.h diff --git a/ext/wayland/gstwaylandsink.c b/ext/wayland/gstwaylandsink.c new file mode 100755 index 0000000000..43c9d46f26 --- /dev/null +++ b/ext/wayland/gstwaylandsink.c @@ -0,0 +1,586 @@ +/* + * GStreamer Wayland video sink + * + * Copyright: Intel Corporation + * Copyright: Sreerenj Balachandran + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should 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. + */ + + +/* The waylandsink is currently just a prototype . It creates its own window and render the decoded video frames to that.*/ + +/* FixMe: Needs to add more synchronization stuffs */ +/* FixMe: Remove the extra memcopy by giving buffer to decoder with buffer_alloc*/ +/* FixMe: Add signals so that the application/compositor is responsible for rendering */ +/* FixMe: Add h/w decoding support: buffers/libva surface */ +/* FixMe: Add the interfaces */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "gstwaylandsink.h" + +#include +#include + +/* signals */ +enum +{ + SIGNAL_0, + SIGNAL_FRAME_READY, + LAST_SIGNAL +}; + +/* Properties */ +/*Fixme: Not yet implemented */ +enum +{ + PROP_0, + PROP_WAYLAND_DISPLAY +}; + +GST_DEBUG_CATEGORY (gstwayland_debug); +#define GST_CAT_DEFAULT gstwayland_debug + +static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("video/x-raw-rgb, " + "framerate = (fraction) [ 0, MAX ], " + "endianness = (int) 4321," + "red_mask = (int) 65280, " + "green_mask = (int) 16711680, " + "blue_mask = (int) -16777216," + "width = (int) [ 1, MAX ], " "height = (int) [ 1, MAX ] ")); + +GType gst_wayland_sink_get_type (void); + +/*Fixme: Add more interfaces */ +GST_BOILERPLATE (GstWayLandSink, gst_wayland_sink, GstVideoSink, + GST_TYPE_VIDEO_SINK); + +static void gst_wayland_sink_get_property (GObject * object, + guint prop_id, GValue * value, GParamSpec * pspec); +static void gst_wayland_sink_set_property (GObject * object, + guint prop_id, const GValue * value, GParamSpec * pspec); +static void gst_wayland_sink_dispose (GObject * object); +static void gst_wayland_sink_finalize (GObject * object); + +static GstCaps *gst_wayland_sink_get_caps (GstBaseSink * bsink); +static gboolean gst_wayland_sink_set_caps (GstBaseSink * bsink, GstCaps * caps); +static gboolean gst_wayland_sink_start (GstBaseSink * bsink); +static gboolean gst_wayland_sink_stop (GstBaseSink * bsink); +static gboolean gst_wayland_sink_unlock (GstBaseSink * bsink); +static gboolean gst_wayland_sink_unlock_stop (GstBaseSink * bsink); +static gboolean gst_wayland_sink_preroll (GstBaseSink * bsink, + GstBuffer * buffer); +static gboolean gst_wayland_sink_render (GstBaseSink * bsink, + GstBuffer * buffer); + +static gboolean create_shm_buffer (GstWayLandSink * sink); +static int event_mask_update (uint32_t mask, void *data); +static void sync_callback (void *data); +static struct display *create_display (void); +static void display_handle_global (struct wl_display *display, uint32_t id, + const char *interface, uint32_t version, void *data); +static void compositor_handle_visual (void *data, + struct wl_compositor *compositor, uint32_t id, uint32_t token); +static void redraw (struct wl_surface *surface, void *data, uint32_t time); +static struct window *create_window (GstWayLandSink * sink, + struct display *display, int width, int height); + +static guint gst_wayland_sink_signals[LAST_SIGNAL] = { 0 }; + +static void +gst_wayland_sink_base_init (gpointer gclass) +{ + + GstElementClass *element_class = GST_ELEMENT_CLASS (gclass); + + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_template)); + + gst_element_class_set_details_simple (element_class, + "wayland video sink", "Sink/Video", + "Output to wayland surface", + "Sreerenj Balachandran ,"); +} + +static void +gst_wayland_sink_class_init (GstWayLandSinkClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + GstBaseSinkClass *gstbasesink_class; + + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + gstbasesink_class = (GstBaseSinkClass *) klass; + + gobject_class->set_property = gst_wayland_sink_set_property; + gobject_class->get_property = gst_wayland_sink_get_property; + gobject_class->dispose = GST_DEBUG_FUNCPTR (gst_wayland_sink_dispose); + gobject_class->finalize = GST_DEBUG_FUNCPTR (gst_wayland_sink_finalize); + + gstbasesink_class->get_caps = GST_DEBUG_FUNCPTR (gst_wayland_sink_get_caps); + gstbasesink_class->set_caps = GST_DEBUG_FUNCPTR (gst_wayland_sink_set_caps); + gstbasesink_class->start = GST_DEBUG_FUNCPTR (gst_wayland_sink_start); + gstbasesink_class->unlock = GST_DEBUG_FUNCPTR (gst_wayland_sink_unlock); + gstbasesink_class->unlock_stop = + GST_DEBUG_FUNCPTR (gst_wayland_sink_unlock_stop); + gstbasesink_class->stop = GST_DEBUG_FUNCPTR (gst_wayland_sink_stop); + gstbasesink_class->preroll = GST_DEBUG_FUNCPTR (gst_wayland_sink_preroll); + gstbasesink_class->render = GST_DEBUG_FUNCPTR (gst_wayland_sink_render); + + g_object_class_install_property (gobject_class, PROP_WAYLAND_DISPLAY, + g_param_spec_pointer ("wayland-display", "WayLand Display", + "WayLand Display id created by the application ", + G_PARAM_READWRITE)); + + /*Fixme: not using now */ + gst_wayland_sink_signals[SIGNAL_FRAME_READY] = + g_signal_new ("frame-ready", + G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, + 0, NULL, NULL, + g_cclosure_marshal_VOID__POINTER, G_TYPE_NONE, 1, G_TYPE_POINTER); + + parent_class = g_type_class_peek_parent (klass); +} + +static void +gst_wayland_sink_init (GstWayLandSink * sink, + GstWayLandSinkClass * wayland_sink_class) +{ + + sink->caps = NULL; + + sink->buffer_cond = g_cond_new (); + sink->buffer_lock = g_mutex_new (); + + sink->wayland_cond = g_cond_new (); + sink->wayland_lock = g_mutex_new (); + + sink->render_finish = TRUE; +} + +static void +gst_wayland_sink_get_property (GObject * object, + guint prop_id, GValue * value, GParamSpec * pspec) +{ + GstWayLandSink *sink = GST_WAYLAND_SINK (object); + + switch (prop_id) { + case PROP_WAYLAND_DISPLAY: + g_value_set_pointer (value, sink->display); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_wayland_sink_set_property (GObject * object, + guint prop_id, const GValue * value, GParamSpec * pspec) +{ + GstWayLandSink *sink = GST_WAYLAND_SINK (object); + + switch (prop_id) { + case PROP_WAYLAND_DISPLAY: + sink->display = g_value_get_pointer (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_wayland_sink_dispose (GObject * object) +{ + GstWayLandSink *sink = GST_WAYLAND_SINK (object); + + G_OBJECT_CLASS (parent_class)->dispose (object); +} + +static void +gst_wayland_sink_finalize (GObject * object) +{ + GstWayLandSink *sink = GST_WAYLAND_SINK (object); + + gst_caps_replace (&sink->caps, NULL); + + free (sink->display); + free (sink->window); + + g_cond_free (sink->buffer_cond); + g_cond_free (sink->wayland_cond); + g_mutex_free (sink->buffer_lock); + g_mutex_free (sink->wayland_lock); + + G_OBJECT_CLASS (parent_class)->finalize (object); +} + + +static GstCaps * +gst_wayland_sink_get_caps (GstBaseSink * bsink) +{ + return gst_caps_copy (gst_static_pad_template_get_caps (&sink_template)); +} + +static int +event_mask_update (uint32_t mask, void *data) +{ + struct display *d = data; + + d->mask = mask; + + return 0; +} + +static void +sync_callback (void *data) +{ + int *done = data; + + *done = 1; +} + +static const struct wl_compositor_listener compositor_listener = { + compositor_handle_visual, +}; + +static void +display_handle_global (struct wl_display *display, uint32_t id, + const char *interface, uint32_t version, void *data) +{ + struct display *d = data; + + if (strcmp (interface, "wl_compositor") == 0) { + d->compositor = wl_compositor_create (display, id, 1); + wl_compositor_add_listener (d->compositor, &compositor_listener, d); + } else if (strcmp (interface, "wl_shell") == 0) { + d->shell = wl_shell_create (display, id, 1); + } else if (strcmp (interface, "wl_shm") == 0) { + d->shm = wl_shm_create (display, id, 1); + } + +} + +static struct display * +create_display (void) +{ + struct display *display; + int done; + + display = malloc (sizeof *display); + display->display = wl_display_connect (NULL); + + wl_display_add_global_listener (display->display, + display_handle_global, display); + wl_display_iterate (display->display, WL_DISPLAY_READABLE); + + wl_display_get_fd (display->display, event_mask_update, display); + + wl_display_sync_callback (display->display, sync_callback, &done); + + while (!display->xrgb_visual) { + wl_display_iterate (display->display, display->mask); + } + + return display; +} + +static gboolean +create_shm_buffer (GstWayLandSink * sink) +{ + char filename[] = "/tmp/wayland-shm-XXXXXX"; + struct wl_buffer *wbuffer; + int i, fd, size, stride; + static void *data; + + GST_DEBUG_OBJECT (sink, "Creating wayland-shm buffers"); + + wl_display_iterate (sink->display->display, sink->display->mask); + + fd = mkstemp (filename); + if (fd < 0) { + fprintf (stderr, "open %s failed: %m\n", filename); + exit (0); + } + + stride = sink->width * 4; + size = stride * sink->height; + + if (ftruncate (fd, size) < 0) { + fprintf (stderr, "ftruncate failed: %m\n"); + close (fd); + exit (0); + } + + data = mmap (NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); + unlink (filename); + if (data == MAP_FAILED) { + fprintf (stderr, "mmap failed: %m\n"); + close (fd); + exit (0); + } + + wbuffer = wl_shm_create_buffer (sink->display->shm, fd, + sink->width, sink->height, stride, sink->display->xrgb_visual); + + close (fd); + + sink->window->buffer = wbuffer; + wl_surface_attach (sink->window->surface, sink->window->buffer, 0, 0); + sink->MapAddr = data; + + return TRUE; +} + +static gboolean +gst_wayland_sink_set_caps (GstBaseSink * bsink, GstCaps * caps) +{ + GstWayLandSink *sink = GST_WAYLAND_SINK (bsink); + const GstStructure *structure; + GstFlowReturn result = GST_FLOW_OK; + GstCaps *allowed_caps; + gboolean ret = TRUE; + GstCaps *intersection; + const GValue *fps; + + GST_LOG_OBJECT (sink, "set caps %" GST_PTR_FORMAT, caps); + + structure = gst_caps_get_structure (caps, 0); + + allowed_caps = gst_pad_get_caps (GST_BASE_SINK_PAD (bsink)); + + /* We intersect those caps with our template to make sure they are correct */ + intersection = gst_caps_intersect (allowed_caps, caps); + gst_caps_unref (allowed_caps); + + if (gst_caps_is_empty (intersection)) { + gst_caps_unref (intersection); + return FALSE; + } + + structure = gst_caps_get_structure (caps, 0); + + ret &= gst_structure_get_int (structure, "width", &sink->width); + ret &= gst_structure_get_int (structure, "height", &sink->height); + + if (!ret) + return FALSE; + + gst_caps_replace (&sink->caps, caps); + + gst_caps_unref (intersection); + + if (!create_shm_buffer (sink)) { + GST_ERROR_OBJECT (sink, "Failed to create the wayland buffers.."); + return FALSE; + } + + return TRUE; +} + +static void +compositor_handle_visual (void *data, + struct wl_compositor *compositor, uint32_t id, uint32_t token) +{ + struct display *d = data; + + switch (token) { + case WL_COMPOSITOR_VISUAL_XRGB32: + d->xrgb_visual = wl_visual_create (d->display, id, 1); + break; + } +} + +static void +redraw (struct wl_surface *surface, void *data, uint32_t time) +{ + + GstWayLandSink *sink = (GstWayLandSink *) data; + g_mutex_lock (sink->wayland_lock); + + sink->render_finish = TRUE; + + g_mutex_unlock (sink->wayland_lock); +} + +static struct window * +create_window (GstWayLandSink * sink, struct display *display, int width, + int height) +{ + struct window *window; + struct wl_visual *visual; + void *data; + + g_mutex_lock (sink->wayland_lock); + + window = malloc (sizeof *window); + window->display = display; + window->width = width; + window->height = height; + window->surface = wl_compositor_create_surface (display->compositor); + + wl_shell_set_toplevel (display->shell, window->surface); + + g_mutex_unlock (sink->wayland_lock); + return window; +} + + +static gboolean +gst_wayland_sink_start (GstBaseSink * bsink) +{ + GstWayLandSink *sink = (GstWayLandSink *) bsink; + gboolean result = TRUE; + + GST_DEBUG_OBJECT (sink, "start"); + + if (!sink->display) + sink->display = create_display (); + if (!sink->window) + sink->window = create_window (sink, sink->display, 1280, 720); + + return result; +} + +static gboolean +gst_wayland_sink_unlock (GstBaseSink * bsink) +{ + GstWayLandSink *sink = (GstWayLandSink *) bsink; + + GST_DEBUG_OBJECT (sink, "unlock"); + + g_mutex_lock (sink->buffer_lock); + + sink->unlock = TRUE; + + g_mutex_unlock (sink->buffer_lock); + + return TRUE; +} + +static gboolean +gst_wayland_sink_unlock_stop (GstBaseSink * bsink) +{ + GstWayLandSink *sink = (GstWayLandSink *) bsink; + + GST_DEBUG_OBJECT (sink, "unlock_stop"); + + g_mutex_lock (sink->buffer_lock); + + sink->unlock = FALSE; + + g_mutex_unlock (sink->buffer_lock); + + return TRUE; +} + + +static gboolean +gst_wayland_sink_stop (GstBaseSink * bsink) +{ + GstWayLandSink *sink = (GstWayLandSink *) bsink; + + GST_DEBUG_OBJECT (sink, "stop"); + + return TRUE; +} + +static GstFlowReturn +gst_wayland_sink_preroll (GstBaseSink * bsink, GstBuffer * buffer) +{ + GST_DEBUG_OBJECT (bsink, "preroll buffer %p, data = %p", buffer, + GST_BUFFER_DATA (buffer)); + return gst_wayland_sink_render (bsink, buffer); +} + +static GstFlowReturn +gst_wayland_sink_render (GstBaseSink * bsink, GstBuffer * buffer) +{ + GstWayLandSink *sink = GST_WAYLAND_SINK (bsink); + + if (sink->render_finish) { + GST_LOG_OBJECT (sink, + "render buffer %p, data = %p, timestamp = %" GST_TIME_FORMAT, buffer, + GST_BUFFER_DATA (buffer), + GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buffer))); + + /*Fixme: remove the memcpy and add memory allocation stuffs to buff_alloc */ + guint8 *src = GST_BUFFER_DATA (buffer); + guint len = GST_BUFFER_SIZE (buffer) / sink->height; + + /*for (i = 0; i < sink->height; i++) { + memcpy (data, src, len); + src += len; + data += len; + } */ + + memcpy (sink->MapAddr, src, GST_BUFFER_SIZE (buffer)); + + sink->render_finish = FALSE; + + wl_buffer_damage (sink->window->buffer, 0, 0, sink->width, sink->height); + + wl_surface_damage (sink->window->surface, 0, 0, sink->width, sink->height); + + wl_display_frame_callback (sink->display->display, + sink->window->surface, redraw, sink); + + wl_display_iterate (sink->display->display, sink->display->mask); + + } else { + GST_LOG_OBJECT (sink, + "Waiting to get the signal from compositor to render the next frame.."); + g_usleep (50000); + sink->render_finish = TRUE; + } + return GST_FLOW_OK; +} + +static gboolean +plugin_init (GstPlugin * plugin) +{ + GST_DEBUG_CATEGORY_INIT (gstwayland_debug, "waylandsink", 0, + " wayland video sink"); + + return gst_element_register (plugin, "waylandsink", GST_RANK_MARGINAL, + GST_TYPE_WAYLAND_SINK); +} + +GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "waylandsink", + "WayLand Video Sink", plugin_init, VERSION, "LGPL", "gst-wayland", "") diff --git a/ext/wayland/gstwaylandsink.h b/ext/wayland/gstwaylandsink.h new file mode 100755 index 0000000000..71d6cfc75f --- /dev/null +++ b/ext/wayland/gstwaylandsink.h @@ -0,0 +1,102 @@ +/* + * GStreamer Wayland video sink + * Copyright (C) 2011 Intel Corporation + * Copyright (C) 2011 Sreerenj Balachandran + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should 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_WAYLAND_VIDEO_SINK_H__ +#define __GST_WAYLAND_VIDEO_SINK_H__ + +#include +#include +#include + +#include +#include + +#define GST_TYPE_WAYLAND_SINK \ + (gst_wayland_sink_get_type()) +#define GST_WAYLAND_SINK(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_WAYLAND_SINK,GstWayLandSink)) +#define GST_WAYLAND_SINK_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_WAYLAND_SINK,GstWayLandSinkClass)) +#define GST_IS_WAYLAND_SINK(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_WAYLAND_SINK)) +#define GST_IS_WAYLAND_SINK_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_WAYLAND_SINK)) +#define GST_WAYLAND_SINK_GET_CLASS(inst) \ + (G_TYPE_INSTANCE_GET_CLASS ((inst), GST_TYPE_WAYLAND_SINK, GstWayLandSinkClass)) + +struct display +{ + struct wl_display *display; + struct wl_visual *xrgb_visual; + struct wl_compositor *compositor; + struct wl_shell *shell; + struct wl_shm *shm; + uint32_t mask; +}; + +struct window +{ + struct display *display; + int width, height; + struct wl_surface *surface; + struct wl_buffer *buffer; + void *data; +}; + +typedef struct _GstWayLandSink GstWayLandSink; +typedef struct _GstWayLandSinkClass GstWayLandSinkClass; + +struct _GstWayLandSink +{ + + GstVideoSink parent; + + GstCaps *caps; + + struct display *display; + struct window *window; + + GCond *buffer_cond; + GMutex *buffer_lock; + + GCond *wayland_cond; + GMutex *wayland_lock; + + gboolean unlock; + + guint width, height, depth, size; + + void *MapAddr; + gboolean render_finish; + +}; + +struct _GstWayLandSinkClass +{ + GstVideoSinkClass parent; + +}; + +GType +gst_wayland_sink_get_type (void) + G_GNUC_CONST; + +G_END_DECLS +#endif /* __GST_WAYLAND_VIDEO_SINK_H__ */ From b5a778012267fe28d84133bb0daaa4c51e72f36d Mon Sep 17 00:00:00 2001 From: Sreerenj Balachandran Date: Wed, 2 Nov 2011 13:51:13 +0200 Subject: [PATCH 045/138] More Fixes: * Adding buffer_alloc * perform buffer_damage before surface_attach * Fix typo, Remove Dead code etc. --- ext/wayland/gstwaylandsink.c | 396 +++++++++++++++++++++++------------ ext/wayland/gstwaylandsink.h | 49 +++-- 2 files changed, 295 insertions(+), 150 deletions(-) diff --git a/ext/wayland/gstwaylandsink.c b/ext/wayland/gstwaylandsink.c index 43c9d46f26..a78f8fbb3b 100755 --- a/ext/wayland/gstwaylandsink.c +++ b/ext/wayland/gstwaylandsink.c @@ -20,13 +20,7 @@ */ -/* The waylandsink is currently just a prototype . It creates its own window and render the decoded video frames to that.*/ - -/* FixMe: Needs to add more synchronization stuffs */ -/* FixMe: Remove the extra memcopy by giving buffer to decoder with buffer_alloc*/ -/* FixMe: Add signals so that the application/compositor is responsible for rendering */ -/* FixMe: Add h/w decoding support: buffers/libva surface */ -/* FixMe: Add the interfaces */ +/* The waylandsink is creating its own window and render the decoded video frames to that.*/ #ifdef HAVE_CONFIG_H #include @@ -48,7 +42,6 @@ #include "gstwaylandsink.h" #include -#include /* signals */ enum @@ -79,32 +72,36 @@ static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", "green_mask = (int) 16711680, " "blue_mask = (int) -16777216," "width = (int) [ 1, MAX ], " "height = (int) [ 1, MAX ] ")); - -GType gst_wayland_sink_get_type (void); +GType gst_wlbuffer_get_type (void); /*Fixme: Add more interfaces */ -GST_BOILERPLATE (GstWayLandSink, gst_wayland_sink, GstVideoSink, +GST_BOILERPLATE (GstWaylandSink, gst_wayland_sink, GstVideoSink, GST_TYPE_VIDEO_SINK); +static void gst_wlbuffer_finalize (GstWlBuffer * wbuffer); +static GstBufferClass *wlbuffer_parent_class = NULL; + static void gst_wayland_sink_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static void gst_wayland_sink_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); static void gst_wayland_sink_dispose (GObject * object); static void gst_wayland_sink_finalize (GObject * object); - static GstCaps *gst_wayland_sink_get_caps (GstBaseSink * bsink); static gboolean gst_wayland_sink_set_caps (GstBaseSink * bsink, GstCaps * caps); static gboolean gst_wayland_sink_start (GstBaseSink * bsink); static gboolean gst_wayland_sink_stop (GstBaseSink * bsink); -static gboolean gst_wayland_sink_unlock (GstBaseSink * bsink); -static gboolean gst_wayland_sink_unlock_stop (GstBaseSink * bsink); +static GstFlowReturn +gst_wayland_sink_buffer_alloc (GstBaseSink * bsink, guint64 offset, guint size, + GstCaps * caps, GstBuffer ** buf); static gboolean gst_wayland_sink_preroll (GstBaseSink * bsink, GstBuffer * buffer); static gboolean gst_wayland_sink_render (GstBaseSink * bsink, GstBuffer * buffer); +static void gst_wayland_bufferpool_clear (GstWaylandSink * sink); +static void +gst_wayland_buffer_destroy (GstWaylandSink * sink, GstWlBuffer * buffer); -static gboolean create_shm_buffer (GstWayLandSink * sink); static int event_mask_update (uint32_t mask, void *data); static void sync_callback (void *data); static struct display *create_display (void); @@ -113,10 +110,75 @@ static void display_handle_global (struct wl_display *display, uint32_t id, static void compositor_handle_visual (void *data, struct wl_compositor *compositor, uint32_t id, uint32_t token); static void redraw (struct wl_surface *surface, void *data, uint32_t time); -static struct window *create_window (GstWayLandSink * sink, +static struct window *create_window (GstWaylandSink * sink, struct display *display, int width, int height); -static guint gst_wayland_sink_signals[LAST_SIGNAL] = { 0 }; +static void +gst_wlbuffer_init (GstWlBuffer * buffer, gpointer g_class) +{ + buffer->wbuffer = NULL; + buffer->wlsink = NULL; +} + +static void +gst_wlbuffer_class_init (gpointer g_class, gpointer class_data) +{ + GstMiniObjectClass *mini_object_class = GST_MINI_OBJECT_CLASS (g_class); + + wlbuffer_parent_class = g_type_class_peek_parent (g_class); + + mini_object_class->finalize = (GstMiniObjectFinalizeFunction) + gst_wlbuffer_finalize; +} + +GType +gst_wlbuffer_get_type (void) +{ + static GType _gst_wlbuffer_type; + + if (G_UNLIKELY (_gst_wlbuffer_type == 0)) { + static const GTypeInfo wlbuffer_info = { + sizeof (GstBufferClass), + NULL, + NULL, + gst_wlbuffer_class_init, + NULL, + NULL, + sizeof (GstWlBuffer), + 0, + (GInstanceInitFunc) gst_wlbuffer_init, + NULL + }; + _gst_wlbuffer_type = g_type_register_static (GST_TYPE_BUFFER, + "GstWlBuffer", &wlbuffer_info, 0); + } + return _gst_wlbuffer_type; +} + +static void +gst_wlbuffer_finalize (GstWlBuffer * wbuffer) +{ + GstWaylandSink *sink = NULL; + + g_return_if_fail (wbuffer != NULL); + + GST_DEBUG_OBJECT (sink, "Finalizing the WlBuffer"); + sink = wbuffer->wlsink; + if (!sink) { + GST_WARNING_OBJECT (wbuffer, "No sink.."); + goto beach; + } + + GST_DEBUG_OBJECT (sink, "recycling buffer %p in pool", wbuffer); + /* need to increment the refcount again to recycle */ + gst_buffer_ref (GST_BUFFER (wbuffer)); + g_mutex_lock (sink->pool_lock); + sink->buffer_pool = g_slist_prepend (sink->buffer_pool, wbuffer); + g_mutex_unlock (sink->pool_lock); + +beach: + return; +} static void gst_wayland_sink_base_init (gpointer gclass) @@ -134,7 +196,7 @@ gst_wayland_sink_base_init (gpointer gclass) } static void -gst_wayland_sink_class_init (GstWayLandSinkClass * klass) +gst_wayland_sink_class_init (GstWaylandSinkClass * klass) { GObjectClass *gobject_class; GstElementClass *gstelement_class; @@ -152,50 +214,39 @@ gst_wayland_sink_class_init (GstWayLandSinkClass * klass) gstbasesink_class->get_caps = GST_DEBUG_FUNCPTR (gst_wayland_sink_get_caps); gstbasesink_class->set_caps = GST_DEBUG_FUNCPTR (gst_wayland_sink_set_caps); gstbasesink_class->start = GST_DEBUG_FUNCPTR (gst_wayland_sink_start); - gstbasesink_class->unlock = GST_DEBUG_FUNCPTR (gst_wayland_sink_unlock); - gstbasesink_class->unlock_stop = - GST_DEBUG_FUNCPTR (gst_wayland_sink_unlock_stop); + gstbasesink_class->buffer_alloc = + GST_DEBUG_FUNCPTR (gst_wayland_sink_buffer_alloc); gstbasesink_class->stop = GST_DEBUG_FUNCPTR (gst_wayland_sink_stop); gstbasesink_class->preroll = GST_DEBUG_FUNCPTR (gst_wayland_sink_preroll); gstbasesink_class->render = GST_DEBUG_FUNCPTR (gst_wayland_sink_render); g_object_class_install_property (gobject_class, PROP_WAYLAND_DISPLAY, - g_param_spec_pointer ("wayland-display", "WayLand Display", - "WayLand Display id created by the application ", + g_param_spec_pointer ("wayland-display", "Wayland Display", + "Wayland Display id created by the application ", G_PARAM_READWRITE)); - /*Fixme: not using now */ - gst_wayland_sink_signals[SIGNAL_FRAME_READY] = - g_signal_new ("frame-ready", - G_TYPE_FROM_CLASS (klass), - G_SIGNAL_RUN_LAST, - 0, NULL, NULL, - g_cclosure_marshal_VOID__POINTER, G_TYPE_NONE, 1, G_TYPE_POINTER); - parent_class = g_type_class_peek_parent (klass); } static void -gst_wayland_sink_init (GstWayLandSink * sink, - GstWayLandSinkClass * wayland_sink_class) +gst_wayland_sink_init (GstWaylandSink * sink, + GstWaylandSinkClass * wayland_sink_class) { sink->caps = NULL; - sink->buffer_cond = g_cond_new (); - sink->buffer_lock = g_mutex_new (); + sink->pool_lock = g_mutex_new (); + sink->buffer_pool = NULL; - sink->wayland_cond = g_cond_new (); sink->wayland_lock = g_mutex_new (); - sink->render_finish = TRUE; } static void gst_wayland_sink_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec) { - GstWayLandSink *sink = GST_WAYLAND_SINK (object); + GstWaylandSink *sink = GST_WAYLAND_SINK (object); switch (prop_id) { case PROP_WAYLAND_DISPLAY: @@ -211,7 +262,7 @@ static void gst_wayland_sink_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { - GstWayLandSink *sink = GST_WAYLAND_SINK (object); + GstWaylandSink *sink = GST_WAYLAND_SINK (object); switch (prop_id) { case PROP_WAYLAND_DISPLAY: @@ -226,24 +277,29 @@ gst_wayland_sink_set_property (GObject * object, static void gst_wayland_sink_dispose (GObject * object) { - GstWayLandSink *sink = GST_WAYLAND_SINK (object); - G_OBJECT_CLASS (parent_class)->dispose (object); } static void gst_wayland_sink_finalize (GObject * object) { - GstWayLandSink *sink = GST_WAYLAND_SINK (object); + GstWaylandSink *sink = GST_WAYLAND_SINK (object); + GST_DEBUG_OBJECT (sink, "Finalizing the sink.."); gst_caps_replace (&sink->caps, NULL); - + free (sink->display); free (sink->window); - - g_cond_free (sink->buffer_cond); - g_cond_free (sink->wayland_cond); - g_mutex_free (sink->buffer_lock); + + if (sink->pool_lock) { + g_mutex_free (sink->pool_lock); + sink->pool_lock = NULL; + } + + if (sink->buffer_pool) { + gst_wayland_bufferpool_clear (sink); + } + g_mutex_free (sink->wayland_lock); G_OBJECT_CLASS (parent_class)->finalize (object); @@ -306,6 +362,7 @@ create_display (void) wl_display_add_global_listener (display->display, display_handle_global, display); + wl_display_iterate (display->display, WL_DISPLAY_READABLE); wl_display_get_fd (display->display, event_mask_update, display); @@ -319,29 +376,38 @@ create_display (void) return display; } -static gboolean -create_shm_buffer (GstWayLandSink * sink) +static GstWlBuffer * +wayland_buffer_create (GstWaylandSink * sink) { - char filename[] = "/tmp/wayland-shm-XXXXXX"; - struct wl_buffer *wbuffer; - int i, fd, size, stride; + char filename[1024]; + int fd, size, stride; static void *data; + static int init = 0; + GstWlBuffer *wbuffer; GST_DEBUG_OBJECT (sink, "Creating wayland-shm buffers"); - wl_display_iterate (sink->display->display, sink->display->mask); + wbuffer = (GstWlBuffer *) gst_mini_object_new (GST_TYPE_WLBUFFER); + wbuffer->wlsink = gst_object_ref (sink); + + if (!init) { + wl_display_iterate (sink->display->display, sink->display->mask); + init++; + } + + snprintf (filename, 256, "%s-%d-%s", "/tmp/wayland-shm", init, "XXXXXX"); fd = mkstemp (filename); if (fd < 0) { - fprintf (stderr, "open %s failed: %m\n", filename); + GST_ERROR_OBJECT (sink, "open %s failed:", filename); exit (0); } - stride = sink->width * 4; - size = stride * sink->height; + stride = sink->video_width * 4; + size = stride * sink->video_height; if (ftruncate (fd, size) < 0) { - fprintf (stderr, "ftruncate failed: %m\n"); + GST_ERROR_OBJECT (sink, "ftruncate failed:"); close (fd); exit (0); } @@ -354,28 +420,102 @@ create_shm_buffer (GstWayLandSink * sink) exit (0); } - wbuffer = wl_shm_create_buffer (sink->display->shm, fd, - sink->width, sink->height, stride, sink->display->xrgb_visual); + wbuffer->wbuffer = wl_shm_create_buffer (sink->display->shm, fd, + sink->video_width, sink->video_height, stride, + sink->display->xrgb_visual); close (fd); - sink->window->buffer = wbuffer; - wl_surface_attach (sink->window->surface, sink->window->buffer, 0, 0); - sink->MapAddr = data; + GST_BUFFER_DATA (wbuffer) = data; + GST_BUFFER_SIZE (wbuffer) = size; + + return wbuffer; + +} + +static void +gst_wayland_buffer_destroy (GstWaylandSink * sink, GstWlBuffer * buffer) +{ + if (buffer->wlsink) { + buffer->wlsink = NULL; + gst_object_unref (sink); + } + + GST_MINI_OBJECT_CLASS (wlbuffer_parent_class)->finalize (GST_MINI_OBJECT + (buffer)); +} + +static void +gst_wayland_bufferpool_clear (GstWaylandSink * sink) +{ + g_mutex_lock (sink->pool_lock); + while (sink->buffer_pool) { + GstWlBuffer *buffer = sink->buffer_pool->data; + + sink->buffer_pool = g_slist_delete_link (sink->buffer_pool, + sink->buffer_pool); + gst_wayland_buffer_destroy (sink, buffer); + } + g_mutex_unlock (sink->pool_lock); +} + +static GstFlowReturn +gst_wayland_sink_buffer_alloc (GstBaseSink * bsink, guint64 offset, guint size, + GstCaps * caps, GstBuffer ** buf) +{ + GstWaylandSink *sink = GST_WAYLAND_SINK (bsink); + GstWlBuffer *buffer = NULL; + GstFlowReturn ret = GST_FLOW_OK; + GstStructure *structure = NULL; + GstCaps *desired_caps = NULL; + + GST_LOG_OBJECT (sink, "a buffer of %u bytes was requested with caps " + "%" GST_PTR_FORMAT " and offset %" G_GUINT64_FORMAT, size, caps, offset); + + desired_caps = gst_caps_copy (caps); + structure = gst_caps_get_structure (desired_caps, 0); + + if (gst_structure_get_int (structure, "width", &sink->video_width) && + gst_structure_get_int (structure, "height", &sink->video_height)) { + sink->bpp = size / sink->video_width / sink->video_height; + } + + g_mutex_lock (sink->pool_lock); + while (sink->buffer_pool) { + buffer = (GstWlBuffer *) sink->buffer_pool->data; + + if (buffer) { + sink->buffer_pool = + g_slist_delete_link (sink->buffer_pool, sink->buffer_pool); + } else { + break; + } + } + + g_mutex_unlock (sink->pool_lock); + + if (!buffer) + buffer = wayland_buffer_create (sink); + + if (buffer) + gst_buffer_set_caps (GST_BUFFER (buffer), caps); + + *buf = GST_BUFFER (buffer); + + gst_caps_unref (desired_caps); + + return ret; - return TRUE; } static gboolean gst_wayland_sink_set_caps (GstBaseSink * bsink, GstCaps * caps) { - GstWayLandSink *sink = GST_WAYLAND_SINK (bsink); + GstWaylandSink *sink = GST_WAYLAND_SINK (bsink); const GstStructure *structure; - GstFlowReturn result = GST_FLOW_OK; GstCaps *allowed_caps; gboolean ret = TRUE; GstCaps *intersection; - const GValue *fps; GST_LOG_OBJECT (sink, "set caps %" GST_PTR_FORMAT, caps); @@ -394,8 +534,8 @@ gst_wayland_sink_set_caps (GstBaseSink * bsink, GstCaps * caps) structure = gst_caps_get_structure (caps, 0); - ret &= gst_structure_get_int (structure, "width", &sink->width); - ret &= gst_structure_get_int (structure, "height", &sink->height); + ret &= gst_structure_get_int (structure, "width", &sink->video_width); + ret &= gst_structure_get_int (structure, "height", &sink->video_height); if (!ret) return FALSE; @@ -404,11 +544,6 @@ gst_wayland_sink_set_caps (GstBaseSink * bsink, GstCaps * caps) gst_caps_unref (intersection); - if (!create_shm_buffer (sink)) { - GST_ERROR_OBJECT (sink, "Failed to create the wayland buffers.."); - return FALSE; - } - return TRUE; } @@ -429,7 +564,7 @@ static void redraw (struct wl_surface *surface, void *data, uint32_t time) { - GstWayLandSink *sink = (GstWayLandSink *) data; + GstWaylandSink *sink = (GstWaylandSink *) data; g_mutex_lock (sink->wayland_lock); sink->render_finish = TRUE; @@ -438,12 +573,10 @@ redraw (struct wl_surface *surface, void *data, uint32_t time) } static struct window * -create_window (GstWayLandSink * sink, struct display *display, int width, +create_window (GstWaylandSink * sink, struct display *display, int width, int height) { struct window *window; - struct wl_visual *visual; - void *data; g_mutex_lock (sink->wayland_lock); @@ -453,7 +586,7 @@ create_window (GstWayLandSink * sink, struct display *display, int width, window->height = height; window->surface = wl_compositor_create_surface (display->compositor); - wl_shell_set_toplevel (display->shell, window->surface); + //wl_shell_set_toplevel (display->shell, window->surface); g_mutex_unlock (sink->wayland_lock); return window; @@ -463,7 +596,7 @@ create_window (GstWayLandSink * sink, struct display *display, int width, static gboolean gst_wayland_sink_start (GstBaseSink * bsink) { - GstWayLandSink *sink = (GstWayLandSink *) bsink; + GstWaylandSink *sink = (GstWaylandSink *) bsink; gboolean result = TRUE; GST_DEBUG_OBJECT (sink, "start"); @@ -476,43 +609,10 @@ gst_wayland_sink_start (GstBaseSink * bsink) return result; } -static gboolean -gst_wayland_sink_unlock (GstBaseSink * bsink) -{ - GstWayLandSink *sink = (GstWayLandSink *) bsink; - - GST_DEBUG_OBJECT (sink, "unlock"); - - g_mutex_lock (sink->buffer_lock); - - sink->unlock = TRUE; - - g_mutex_unlock (sink->buffer_lock); - - return TRUE; -} - -static gboolean -gst_wayland_sink_unlock_stop (GstBaseSink * bsink) -{ - GstWayLandSink *sink = (GstWayLandSink *) bsink; - - GST_DEBUG_OBJECT (sink, "unlock_stop"); - - g_mutex_lock (sink->buffer_lock); - - sink->unlock = FALSE; - - g_mutex_unlock (sink->buffer_lock); - - return TRUE; -} - - static gboolean gst_wayland_sink_stop (GstBaseSink * bsink) { - GstWayLandSink *sink = (GstWayLandSink *) bsink; + GstWaylandSink *sink = (GstWaylandSink *) bsink; GST_DEBUG_OBJECT (sink, "stop"); @@ -530,31 +630,67 @@ gst_wayland_sink_preroll (GstBaseSink * bsink, GstBuffer * buffer) static GstFlowReturn gst_wayland_sink_render (GstBaseSink * bsink, GstBuffer * buffer) { - GstWayLandSink *sink = GST_WAYLAND_SINK (bsink); + GstWaylandSink *sink = GST_WAYLAND_SINK (bsink); + gboolean mem_cpy = TRUE; + GstVideoRectangle src, dst, res; + + GST_LOG_OBJECT (sink, + "render buffer %p, data = %p, timestamp = %" GST_TIME_FORMAT, buffer, + GST_BUFFER_DATA (buffer), GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buffer))); if (sink->render_finish) { - GST_LOG_OBJECT (sink, - "render buffer %p, data = %p, timestamp = %" GST_TIME_FORMAT, buffer, - GST_BUFFER_DATA (buffer), - GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buffer))); + if (GST_IS_WLBUFFER (buffer)) { + GstWlBuffer *tmp_buffer = (GstWlBuffer *) buffer; - /*Fixme: remove the memcpy and add memory allocation stuffs to buff_alloc */ - guint8 *src = GST_BUFFER_DATA (buffer); - guint len = GST_BUFFER_SIZE (buffer) / sink->height; + /* Does it have a waylandbuffer ? */ + if (tmp_buffer->wbuffer) { + mem_cpy = FALSE; + GST_DEBUG_OBJECT (sink, "we have a buffer (%p) we allocated " + "ourselves and it has a wayland buffer, no memcpy then", buffer); + sink->window->buffer = tmp_buffer->wbuffer; + } else { + /* No wayland buffer, that's a malloc */ + GST_DEBUG_OBJECT (sink, "we have a buffer (%p) we allocated " + "ourselves but it does not hold a wayland buffer", buffer); + } + } else { + /* Not our baby! */ + GST_DEBUG_OBJECT (sink, "we have a buffer (%p) we did not allocate", + buffer); + } - /*for (i = 0; i < sink->height; i++) { - memcpy (data, src, len); - src += len; - data += len; - } */ + if (mem_cpy) { - memcpy (sink->MapAddr, src, GST_BUFFER_SIZE (buffer)); + GstWlBuffer *wlbuf = wayland_buffer_create (sink); + /*Fixme: remove the memcpy and add memory allocation stuffs to buff_alloc */ + /*guint8 *src = GST_BUFFER_DATA (buffer); + guint len = GST_BUFFER_SIZE (buffer) / sink->height; + + for (i = 0; i < sink->height; i++) { + memcpy (data, src, len); + src += len; + data += len; + } */ + + memcpy (GST_BUFFER_DATA (wlbuf), GST_BUFFER_DATA (buffer), + GST_BUFFER_SIZE (buffer)); + sink->window->buffer = wlbuf->wbuffer; + } + + src.w = sink->video_width; + src.h = sink->video_height; + dst.w = sink->window->width; + dst.h = sink->window->height; + + gst_video_sink_center_rect (src, dst, &res, FALSE); sink->render_finish = FALSE; - wl_buffer_damage (sink->window->buffer, 0, 0, sink->width, sink->height); + wl_buffer_damage (sink->window->buffer, 0, 0, res.w, res.h); - wl_surface_damage (sink->window->surface, 0, 0, sink->width, sink->height); + wl_surface_attach (sink->window->surface, sink->window->buffer, 0, 0); + + wl_surface_damage (sink->window->surface, 0, 0, res.w, res.h); wl_display_frame_callback (sink->display->display, sink->window->surface, redraw, sink); @@ -583,4 +719,4 @@ plugin_init (GstPlugin * plugin) GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "waylandsink", - "WayLand Video Sink", plugin_init, VERSION, "LGPL", "gst-wayland", "") + "Wayland Video Sink", plugin_init, VERSION, "LGPL", "gst-wayland", "") diff --git a/ext/wayland/gstwaylandsink.h b/ext/wayland/gstwaylandsink.h index 71d6cfc75f..75c5a9ac8a 100755 --- a/ext/wayland/gstwaylandsink.h +++ b/ext/wayland/gstwaylandsink.h @@ -26,20 +26,19 @@ #include #include -#include #define GST_TYPE_WAYLAND_SINK \ (gst_wayland_sink_get_type()) #define GST_WAYLAND_SINK(obj) \ - (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_WAYLAND_SINK,GstWayLandSink)) + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_WAYLAND_SINK,GstWaylandSink)) #define GST_WAYLAND_SINK_CLASS(klass) \ - (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_WAYLAND_SINK,GstWayLandSinkClass)) + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_WAYLAND_SINK,GstWaylandSinkClass)) #define GST_IS_WAYLAND_SINK(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_WAYLAND_SINK)) #define GST_IS_WAYLAND_SINK_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_WAYLAND_SINK)) #define GST_WAYLAND_SINK_GET_CLASS(inst) \ - (G_TYPE_INSTANCE_GET_CLASS ((inst), GST_TYPE_WAYLAND_SINK, GstWayLandSinkClass)) + (G_TYPE_INSTANCE_GET_CLASS ((inst), GST_TYPE_WAYLAND_SINK, GstWaylandSinkClass)) struct display { @@ -57,13 +56,26 @@ struct window int width, height; struct wl_surface *surface; struct wl_buffer *buffer; - void *data; }; -typedef struct _GstWayLandSink GstWayLandSink; -typedef struct _GstWayLandSinkClass GstWayLandSinkClass; +typedef struct _GstWaylandSink GstWaylandSink; +typedef struct _GstWaylandSinkClass GstWaylandSinkClass; -struct _GstWayLandSink +#define GST_TYPE_WLBUFFER (gst_wlbuffer_get_type()) +#define GST_IS_WLBUFFER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_WLBUFFER)) +#define GST_WLBUFFER (obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_WLBUFFER, GstWlBuffer)) + +typedef struct _GstWlBuffer GstWlBuffer; + +struct _GstWlBuffer { + GstBuffer buffer; /* Extending GstBuffer */ + + struct wl_buffer *wbuffer; + + GstWaylandSink *wlsink; +}; + +struct _GstWaylandSink { GstVideoSink parent; @@ -73,30 +85,27 @@ struct _GstWayLandSink struct display *display; struct window *window; - GCond *buffer_cond; - GMutex *buffer_lock; + GMutex *pool_lock; + GSList *buffer_pool; - GCond *wayland_cond; GMutex *wayland_lock; - gboolean unlock; + gint video_width; + gint video_height; + guint bpp; - guint width, height, depth, size; - - void *MapAddr; gboolean render_finish; - + }; -struct _GstWayLandSinkClass +struct _GstWaylandSinkClass { GstVideoSinkClass parent; }; -GType -gst_wayland_sink_get_type (void) - G_GNUC_CONST; +GType gst_wayland_sink_get_type (void) G_GNUC_CONST; +GType gst_dfbsurface_get_type (void); G_END_DECLS #endif /* __GST_WAYLAND_VIDEO_SINK_H__ */ From 775643d60ea67c43895ca778bd1dbb8506d30722 Mon Sep 17 00:00:00 2001 From: Sreerenj Balachandran Date: Wed, 2 Nov 2011 16:23:02 +0200 Subject: [PATCH 046/138] Update with new APIs in wayland-client. --- ext/wayland/gstwaylandsink.c | 64 ++++++++++-------------------------- ext/wayland/gstwaylandsink.h | 2 +- 2 files changed, 18 insertions(+), 48 deletions(-) diff --git a/ext/wayland/gstwaylandsink.c b/ext/wayland/gstwaylandsink.c index a78f8fbb3b..6a7218ae47 100755 --- a/ext/wayland/gstwaylandsink.c +++ b/ext/wayland/gstwaylandsink.c @@ -103,13 +103,10 @@ static void gst_wayland_buffer_destroy (GstWaylandSink * sink, GstWlBuffer * buffer); static int event_mask_update (uint32_t mask, void *data); -static void sync_callback (void *data); static struct display *create_display (void); static void display_handle_global (struct wl_display *display, uint32_t id, const char *interface, uint32_t version, void *data); -static void compositor_handle_visual (void *data, - struct wl_compositor *compositor, uint32_t id, uint32_t token); -static void redraw (struct wl_surface *surface, void *data, uint32_t time); +static void redraw (void *data, struct wl_callback *callback, uint32_t time); static struct window *create_window (GstWaylandSink * sink, struct display *display, int width, int height); @@ -199,11 +196,9 @@ static void gst_wayland_sink_class_init (GstWaylandSinkClass * klass) { GObjectClass *gobject_class; - GstElementClass *gstelement_class; GstBaseSinkClass *gstbasesink_class; gobject_class = (GObjectClass *) klass; - gstelement_class = (GstElementClass *) klass; gstbasesink_class = (GstBaseSinkClass *) klass; gobject_class->set_property = gst_wayland_sink_set_property; @@ -322,18 +317,6 @@ event_mask_update (uint32_t mask, void *data) return 0; } -static void -sync_callback (void *data) -{ - int *done = data; - - *done = 1; -} - -static const struct wl_compositor_listener compositor_listener = { - compositor_handle_visual, -}; - static void display_handle_global (struct wl_display *display, uint32_t id, const char *interface, uint32_t version, void *data) @@ -341,12 +324,11 @@ display_handle_global (struct wl_display *display, uint32_t id, struct display *d = data; if (strcmp (interface, "wl_compositor") == 0) { - d->compositor = wl_compositor_create (display, id, 1); - wl_compositor_add_listener (d->compositor, &compositor_listener, d); + d->compositor = wl_display_bind (display, id, &wl_compositor_interface); } else if (strcmp (interface, "wl_shell") == 0) { - d->shell = wl_shell_create (display, id, 1); + d->shell = wl_display_bind (display, id, &wl_shell_interface); } else if (strcmp (interface, "wl_shm") == 0) { - d->shm = wl_shm_create (display, id, 1); + d->shm = wl_display_bind (display, id, &wl_shm_interface); } } @@ -355,10 +337,10 @@ static struct display * create_display (void) { struct display *display; - int done; display = malloc (sizeof *display); display->display = wl_display_connect (NULL); + assert (display->display); wl_display_add_global_listener (display->display, display_handle_global, display); @@ -367,12 +349,6 @@ create_display (void) wl_display_get_fd (display->display, event_mask_update, display); - wl_display_sync_callback (display->display, sync_callback, &done); - - while (!display->xrgb_visual) { - wl_display_iterate (display->display, display->mask); - } - return display; } @@ -421,8 +397,7 @@ wayland_buffer_create (GstWaylandSink * sink) } wbuffer->wbuffer = wl_shm_create_buffer (sink->display->shm, fd, - sink->video_width, sink->video_height, stride, - sink->display->xrgb_visual); + sink->video_width, sink->video_height, stride, WL_SHM_FORMAT_XRGB32); close (fd); @@ -547,21 +522,10 @@ gst_wayland_sink_set_caps (GstBaseSink * bsink, GstCaps * caps) return TRUE; } -static void -compositor_handle_visual (void *data, - struct wl_compositor *compositor, uint32_t id, uint32_t token) -{ - struct display *d = data; - - switch (token) { - case WL_COMPOSITOR_VISUAL_XRGB32: - d->xrgb_visual = wl_visual_create (d->display, id, 1); - break; - } -} +static const struct wl_callback_listener frame_listener; static void -redraw (struct wl_surface *surface, void *data, uint32_t time) +redraw (void *data, struct wl_callback *callback, uint32_t time) { GstWaylandSink *sink = (GstWaylandSink *) data; @@ -627,6 +591,7 @@ gst_wayland_sink_preroll (GstBaseSink * bsink, GstBuffer * buffer) return gst_wayland_sink_render (bsink, buffer); } + static GstFlowReturn gst_wayland_sink_render (GstBaseSink * bsink, GstBuffer * buffer) { @@ -692,20 +657,25 @@ gst_wayland_sink_render (GstBaseSink * bsink, GstBuffer * buffer) wl_surface_damage (sink->window->surface, 0, 0, res.w, res.h); - wl_display_frame_callback (sink->display->display, - sink->window->surface, redraw, sink); + if (sink->callback) + wl_callback_destroy (sink->callback); + sink->callback = wl_surface_frame (sink->window->surface); + wl_callback_add_listener (sink->callback, &frame_listener, sink); wl_display_iterate (sink->display->display, sink->display->mask); } else { GST_LOG_OBJECT (sink, "Waiting to get the signal from compositor to render the next frame.."); - g_usleep (50000); sink->render_finish = TRUE; } return GST_FLOW_OK; } +static const struct wl_callback_listener frame_listener = { + redraw +}; + static gboolean plugin_init (GstPlugin * plugin) { diff --git a/ext/wayland/gstwaylandsink.h b/ext/wayland/gstwaylandsink.h index 75c5a9ac8a..678b8cfa22 100755 --- a/ext/wayland/gstwaylandsink.h +++ b/ext/wayland/gstwaylandsink.h @@ -43,7 +43,6 @@ struct display { struct wl_display *display; - struct wl_visual *xrgb_visual; struct wl_compositor *compositor; struct wl_shell *shell; struct wl_shm *shm; @@ -84,6 +83,7 @@ struct _GstWaylandSink struct display *display; struct window *window; + struct wl_callback *callback; GMutex *pool_lock; GSList *buffer_pool; From 2747aefaf7607fe2dbac0c858077405b533ca7c8 Mon Sep 17 00:00:00 2001 From: Sreerenj Balachandran Date: Thu, 16 Feb 2012 22:27:23 +0200 Subject: [PATCH 047/138] waylandsink: More fixes -- update to Wayland 0.85 protocol -- Added shell surface -- Added format query for shm format -- Create the window based on width and height of video extracted from upstream caps. --- ext/wayland/gstwaylandsink.c | 85 +++++++++++++++++++++++++++--------- ext/wayland/gstwaylandsink.h | 2 + 2 files changed, 67 insertions(+), 20 deletions(-) mode change 100755 => 100644 ext/wayland/gstwaylandsink.c mode change 100755 => 100644 ext/wayland/gstwaylandsink.h diff --git a/ext/wayland/gstwaylandsink.c b/ext/wayland/gstwaylandsink.c old mode 100755 new mode 100644 index 6a7218ae47..a073bf0350 --- a/ext/wayland/gstwaylandsink.c +++ b/ext/wayland/gstwaylandsink.c @@ -107,7 +107,7 @@ static struct display *create_display (void); static void display_handle_global (struct wl_display *display, uint32_t id, const char *interface, uint32_t version, void *data); static void redraw (void *data, struct wl_callback *callback, uint32_t time); -static struct window *create_window (GstWaylandSink * sink, +static void create_window (GstWaylandSink * sink, struct display *display, int width, int height); static void @@ -229,12 +229,14 @@ gst_wayland_sink_init (GstWaylandSink * sink, { sink->caps = NULL; + sink->render_finish = TRUE; + sink->display = NULL; + sink->window = NULL; sink->pool_lock = g_mutex_new (); sink->buffer_pool = NULL; sink->wayland_lock = g_mutex_new (); - } static void @@ -269,6 +271,31 @@ gst_wayland_sink_set_property (GObject * object, } } +static void +destroy_display (struct display *display) +{ + if (display->shm) + wl_shm_destroy (display->shm); + + if (display->shell) + wl_shell_destroy (display->shell); + + if (display->compositor) + wl_compositor_destroy (display->compositor); + + wl_display_flush (display->display); + wl_display_destroy (display->display); + free (display); +} + +static void +destroy_window (struct window *window) +{ + wl_shell_surface_destroy (window->shell_surface); + wl_surface_destroy (window->surface); + free (window); +} + static void gst_wayland_sink_dispose (GObject * object) { @@ -317,6 +344,18 @@ event_mask_update (uint32_t mask, void *data) return 0; } +static void +shm_format (void *data, struct wl_shm *wl_shm, uint32_t format) +{ + struct display *d = data; + + d->formats |= (1 << format); +} + +struct wl_shm_listener shm_listenter = { + shm_format +}; + static void display_handle_global (struct wl_display *display, uint32_t id, const char *interface, uint32_t version, void *data) @@ -329,6 +368,7 @@ display_handle_global (struct wl_display *display, uint32_t id, d->shell = wl_display_bind (display, id, &wl_shell_interface); } else if (strcmp (interface, "wl_shm") == 0) { d->shm = wl_display_bind (display, id, &wl_shm_interface); + wl_shm_add_listener (d->shm, &shm_listenter, d); } } @@ -346,6 +386,12 @@ create_display (void) display_handle_global, display); wl_display_iterate (display->display, WL_DISPLAY_READABLE); + wl_display_roundtrip (display->display); + + if (!(display->formats & (1 << WL_SHM_FORMAT_XRGB8888))) { + GST_ERROR ("WL_SHM_FORMAT_XRGB32 not available"); + return NULL; + } wl_display_get_fd (display->display, event_mask_update, display); @@ -366,12 +412,7 @@ wayland_buffer_create (GstWaylandSink * sink) wbuffer = (GstWlBuffer *) gst_mini_object_new (GST_TYPE_WLBUFFER); wbuffer->wlsink = gst_object_ref (sink); - if (!init) { - wl_display_iterate (sink->display->display, sink->display->mask); - init++; - } - - snprintf (filename, 256, "%s-%d-%s", "/tmp/wayland-shm", init, "XXXXXX"); + snprintf (filename, 256, "%s-%d-%s", "/tmp/wayland-shm", init++, "XXXXXX"); fd = mkstemp (filename); if (fd < 0) { @@ -397,7 +438,7 @@ wayland_buffer_create (GstWaylandSink * sink) } wbuffer->wbuffer = wl_shm_create_buffer (sink->display->shm, fd, - sink->video_width, sink->video_height, stride, WL_SHM_FORMAT_XRGB32); + sink->video_width, sink->video_height, stride, WL_SHM_FORMAT_XRGB8888); close (fd); @@ -529,19 +570,19 @@ redraw (void *data, struct wl_callback *callback, uint32_t time) { GstWaylandSink *sink = (GstWaylandSink *) data; - g_mutex_lock (sink->wayland_lock); sink->render_finish = TRUE; - - g_mutex_unlock (sink->wayland_lock); } -static struct window * +static void create_window (GstWaylandSink * sink, struct display *display, int width, int height) { struct window *window; + if (sink->window) + return; + g_mutex_lock (sink->wayland_lock); window = malloc (sizeof *window); @@ -550,10 +591,14 @@ create_window (GstWaylandSink * sink, struct display *display, int width, window->height = height; window->surface = wl_compositor_create_surface (display->compositor); - //wl_shell_set_toplevel (display->shell, window->surface); + window->shell_surface = wl_shell_get_shell_surface (display->shell, + window->surface); +// wl_shell_surface_set_toplevel (window->shell_surface); + wl_shell_surface_set_fullscreen (window->shell_surface); + + sink->window = window; g_mutex_unlock (sink->wayland_lock); - return window; } @@ -567,8 +612,6 @@ gst_wayland_sink_start (GstBaseSink * bsink) if (!sink->display) sink->display = create_display (); - if (!sink->window) - sink->window = create_window (sink, sink->display, 1280, 720); return result; } @@ -603,6 +646,9 @@ gst_wayland_sink_render (GstBaseSink * bsink, GstBuffer * buffer) "render buffer %p, data = %p, timestamp = %" GST_TIME_FORMAT, buffer, GST_BUFFER_DATA (buffer), GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buffer))); + if (!sink->window) + create_window (sink, sink->display, sink->video_width, sink->video_height); + if (sink->render_finish) { if (GST_IS_WLBUFFER (buffer)) { GstWlBuffer *tmp_buffer = (GstWlBuffer *) buffer; @@ -664,11 +710,10 @@ gst_wayland_sink_render (GstBaseSink * bsink, GstBuffer * buffer) wl_callback_add_listener (sink->callback, &frame_listener, sink); wl_display_iterate (sink->display->display, sink->display->mask); - } else { + } else GST_LOG_OBJECT (sink, "Waiting to get the signal from compositor to render the next frame.."); - sink->render_finish = TRUE; - } + return GST_FLOW_OK; } diff --git a/ext/wayland/gstwaylandsink.h b/ext/wayland/gstwaylandsink.h old mode 100755 new mode 100644 index 678b8cfa22..56fffd8234 --- a/ext/wayland/gstwaylandsink.h +++ b/ext/wayland/gstwaylandsink.h @@ -46,6 +46,7 @@ struct display struct wl_compositor *compositor; struct wl_shell *shell; struct wl_shm *shm; + uint32_t formats; uint32_t mask; }; @@ -54,6 +55,7 @@ struct window struct display *display; int width, height; struct wl_surface *surface; + struct wl_shell_surface *shell_surface; struct wl_buffer *buffer; }; From e012ea80ffae23ec0781625fe57662c66bd9ac86 Mon Sep 17 00:00:00 2001 From: Sreerenj Balachandran Date: Tue, 28 Feb 2012 21:00:24 +0200 Subject: [PATCH 048/138] waylandsink: Fix in shell_surface_set_fullscreen --- ext/wayland/gstwaylandsink.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ext/wayland/gstwaylandsink.c b/ext/wayland/gstwaylandsink.c index a073bf0350..614e5dbce1 100644 --- a/ext/wayland/gstwaylandsink.c +++ b/ext/wayland/gstwaylandsink.c @@ -594,7 +594,8 @@ create_window (GstWaylandSink * sink, struct display *display, int width, window->shell_surface = wl_shell_get_shell_surface (display->shell, window->surface); // wl_shell_surface_set_toplevel (window->shell_surface); - wl_shell_surface_set_fullscreen (window->shell_surface); + wl_shell_surface_set_fullscreen (window->shell_surface, + WL_SHELL_SURFACE_FULLSCREEN_METHOD_DEFAULT, 0, NULL); sink->window = window; From 4565bb1c01da2e378314a1d8e9e22c237191ca9f Mon Sep 17 00:00:00 2001 From: Stefan Sauer Date: Sun, 4 Mar 2012 21:54:08 +0100 Subject: [PATCH 049/138] shm: add minimal doc blobs --- sys/shm/gstshmsink.c | 14 ++++++++++++-- sys/shm/gstshmsrc.c | 16 +++++++++++++++- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/sys/shm/gstshmsink.c b/sys/shm/gstshmsink.c index fd7ffb4edf..ec2a4c3e5f 100644 --- a/sys/shm/gstshmsink.c +++ b/sys/shm/gstshmsink.c @@ -18,8 +18,18 @@ * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ - - +/** + * SECTION:element-shmsink + * + * Send data over shared memory to the matching source. + * + * + * Example launch lines + * |[ + * gst-launch -v videotestsrc ! shmsink socket-path=/tmp/blah shm-size=1000000 + * ]| Send video to shm buffers. + * + */ #ifdef HAVE_CONFIG_H #include "config.h" #endif diff --git a/sys/shm/gstshmsrc.c b/sys/shm/gstshmsrc.c index cff5d46da5..fe086b7ee5 100644 --- a/sys/shm/gstshmsrc.c +++ b/sys/shm/gstshmsrc.c @@ -18,6 +18,20 @@ * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ +/** + * SECTION:element-shmsrc + * + * Receive data from the shared memory sink. + * + * + * Example launch lines + * |[ + * gst-launch shmsrc socket-path=/tmp/blah ! \ + * "video/x-raw-yuv, format=(fourcc)YUY2, color-matrix=(string)sdtv, \ + * chroma-site=(string)mpeg2, width=(int)320, height=(int)240, framerate=(fraction)30/1" ! autovideosink + * ]| Render video from shm buffers. + * + */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -90,7 +104,7 @@ gst_shm_src_base_init (gpointer g_class) gst_element_class_set_details_simple (element_class, "Shared Memory Source", "Source", - "Receive data from the sharem memory sink", + "Receive data from the shared memory sink", "Olivier Crete "); } From c557f71756ce7d58c75636b434b1a0faabdf8a81 Mon Sep 17 00:00:00 2001 From: Edward Hervey Date: Mon, 5 Mar 2012 09:38:57 +0100 Subject: [PATCH 050/138] tsdemux: Push packets as early as possible When the PES header tells us how big the outgoing packet is, push the packet downstream as soon as we have the specified size instead of waiting for the beginning of the next packet. Reduces latency and removes issues with very sparse streams (like subtitles and subpictures). --- gst/mpegtsdemux/tsdemux.c | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/gst/mpegtsdemux/tsdemux.c b/gst/mpegtsdemux/tsdemux.c index 9bb05cd5b9..255809edab 100644 --- a/gst/mpegtsdemux/tsdemux.c +++ b/gst/mpegtsdemux/tsdemux.c @@ -128,6 +128,11 @@ struct _TSDemuxStream GstBuffer *pendingbuffers[TS_MAX_PENDING_BUFFERS]; guint8 nbpending; + /* Size of data to push (if known) */ + guint expected_size; + /* Size of currently queued data */ + guint current_size; + /* Current data to be pushed out */ GstBufferList *current; GstBufferListIterator *currentit; @@ -1025,6 +1030,8 @@ gst_ts_demux_stream_flush (TSDemuxStream * stream) memset (stream->pendingbuffers, 0, TS_MAX_PENDING_BUFFERS); stream->nbpending = 0; + stream->expected_size = 0; + stream->current_size = 0; stream->current = NULL; stream->need_newsegment = TRUE; stream->pts = GST_CLOCK_TIME_NONE; @@ -1270,7 +1277,10 @@ gst_ts_demux_parse_pes_header (GstTSDemux * demux, TSDemuxStream * stream) } /* Remove PES headers */ - GST_DEBUG ("Moving data forward by %d bytes", header.header_size); + GST_DEBUG ("Moving data forward by %d bytes (packet_size:%d, have:%d)", + header.header_size, header.packet_length, + GST_BUFFER_SIZE (stream->pendingbuffers[0])); + stream->expected_size = header.packet_length; GST_BUFFER_DATA (stream->pendingbuffers[0]) += header.header_size; GST_BUFFER_SIZE (stream->pendingbuffers[0]) -= header.header_size; @@ -1340,12 +1350,14 @@ gst_ts_demux_queue_data (GstTSDemux * demux, TSDemuxStream * stream, GST_LOG ("HEADER: appending data to array"); /* Append to the array */ stream->pendingbuffers[stream->nbpending++] = buf; + stream->current_size += GST_BUFFER_SIZE (buf); /* parse the header */ gst_ts_demux_parse_pes_header (demux, stream); } else if (stream->state == PENDING_PACKET_BUFFER) { GST_LOG ("BUFFER: appending data to bufferlist"); stream->currentlist = g_list_prepend (stream->currentlist, buf); + stream->current_size += GST_BUFFER_SIZE (buf); } @@ -1500,6 +1512,8 @@ beach: memset (stream->pendingbuffers, 0, TS_MAX_PENDING_BUFFERS); stream->nbpending = 0; stream->current = NULL; + stream->expected_size = 0; + stream->current_size = 0; return res; } @@ -1538,9 +1552,14 @@ gst_ts_demux_handle_packet (GstTSDemux * demux, TSDemuxStream * stream, GST_BUFFER_OFFSET (packet->buffer)); } - if (packet->payload && (res == GST_FLOW_OK || res == GST_FLOW_NOT_LINKED)) + if (packet->payload && (res == GST_FLOW_OK || res == GST_FLOW_NOT_LINKED)) { gst_ts_demux_queue_data (demux, stream, packet); - else + GST_DEBUG ("current_size:%d, expected_size:%d", + stream->current_size, stream->expected_size); + /* Finally check if the data we queued completes a packet */ + if (stream->expected_size && stream->current_size == stream->expected_size) + res = gst_ts_demux_push_pending_data (demux, stream); + } else gst_buffer_unref (packet->buffer); return res; From 85878c142ee95dbeefe7f989a9c1ce4d250df3bb Mon Sep 17 00:00:00 2001 From: Edward Hervey Date: Mon, 5 Mar 2012 09:46:17 +0100 Subject: [PATCH 051/138] mpegts: Switch rank of mpegtsdemux and tsdemux More effort has been put lately in tsdemux and works in more use cases --- gst/mpegdemux/gstmpegtsdemux.c | 2 +- gst/mpegtsdemux/tsdemux.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gst/mpegdemux/gstmpegtsdemux.c b/gst/mpegdemux/gstmpegtsdemux.c index cdfe081d66..78bf6568d4 100644 --- a/gst/mpegdemux/gstmpegtsdemux.c +++ b/gst/mpegdemux/gstmpegtsdemux.c @@ -3551,7 +3551,7 @@ gboolean gst_mpegts_demux_plugin_init (GstPlugin * plugin) { if (!gst_element_register (plugin, "mpegtsdemux", - GST_RANK_PRIMARY, GST_TYPE_MPEGTS_DEMUX)) + GST_RANK_SECONDARY, GST_TYPE_MPEGTS_DEMUX)) return FALSE; return TRUE; diff --git a/gst/mpegtsdemux/tsdemux.c b/gst/mpegtsdemux/tsdemux.c index 255809edab..e88a576e25 100644 --- a/gst/mpegtsdemux/tsdemux.c +++ b/gst/mpegtsdemux/tsdemux.c @@ -1603,5 +1603,5 @@ gst_ts_demux_plugin_init (GstPlugin * plugin) init_pes_parser (); return gst_element_register (plugin, "tsdemux", - GST_RANK_SECONDARY, GST_TYPE_TS_DEMUX); + GST_RANK_PRIMARY, GST_TYPE_TS_DEMUX); } From bb479b04c179ca59a7a79e018a3ad082ab795ccd Mon Sep 17 00:00:00 2001 From: Edward Hervey Date: Mon, 5 Mar 2012 10:14:46 +0100 Subject: [PATCH 052/138] tsdemux: Update TODO --- gst/mpegtsdemux/TODO | 112 +++++++++++++++++++------------------------ 1 file changed, 48 insertions(+), 64 deletions(-) diff --git a/gst/mpegtsdemux/TODO b/gst/mpegtsdemux/TODO index 66e1d5f1f1..d4d2563a7e 100644 --- a/gst/mpegtsdemux/TODO +++ b/gst/mpegtsdemux/TODO @@ -1,35 +1,30 @@ tsdemux/tsparse TODO -------------------- -* clock for live streams - In order for playback to happen at the same rate as on the producer, - we need to estimate the remote clock based on capture time and PCR - values. - For this estimation to be as accurate as possible, the capture time - needs to happen on the sources. - => Ensure live sources actually timestamp their buffers - Once we have accurate timestamps, we can use an algorithm to - calculate the PCR/local-clock skew. - => Use the EPTLA algorithm as used in -good/rtp/rtpmanager/ - gstrtpjitterbuffer +* Perfomance + * Bufferlist : Creating/Destroying very small buffers is too + costly. Switch to pre-/re-allocating outgoing buffers in which we + copy the data. + * Adapter : Use gst_adapter_peek()/_flush() instead of constantly + creating buffers. -* Seeking - => Split out in a separate file/object. It is polluting tsdemux for - code readability/clarity. - -* Perfomance : Creation/Destruction of buffers is slow - * => This is due to g_type_instance_create using a dogslow rwlock - which take up to 50% of gst_adapter_take_buffer() - => Bugzilla #585375 (performance and contention problems) - -* mpegtspacketizer - * offset/timestamp of incoming buffers need to be carried on to the - sub-buffers in order for several demuxer features to work correctly. +* Latency + * Calculate the actual latency instead of returning a fixed + value. The latency (for live streams) is the difference between the + currently inputted buffer timestamp (can be stored in the + packetizer) and the buffer we're pushing out. + This value should be reported/updated (leave a bit of extra margin + in addition to the calculated value). * mpegtsparser - * SERIOUS room for improvement performance-wise (see callgrind) - + * SERIOUS room for improvement performance-wise (see callgrind), + mostly related to performance issues mentionned above. +* Random-access seeking + * Do minimal parsing of video headers to detect keyframes and use + that to compute the keyframe intervals. Use that interval to offset + the seek position in order to maximize the chance of pushing out the + requested frames. Synchronization, Scheduling and Timestamping @@ -50,6 +45,9 @@ pay extra attention to the outgoing NEWSEGMENT event and buffer timestamps in order to guarantee proper playback and synchronization of the stream. + In the following, 'timestamps' correspond to GStreamer + buffer/segment values. The mpeg-ts PCR/DTS/PTS values are indicated + with their actual name. 1) Live push-based scheduling @@ -60,26 +58,25 @@ of the stream. the outgoing buffer timestamps need to correspond to the incoming buffer timestamp values. - => A delta, DTS_delta between incoming buffer timestamp and - DTS/PTS needs to be computed. + => mpegtspacketizer keeps track of PCR and input timestamp and + extrapolates a clock skew using the EPTLA algorithm. => The outgoing buffers will be timestamped with their PTS values - (overflow corrected) offseted by that initial DTS_delta. + (overflow corrected) corrected by that calculated clock skew. A latency is introduced between the time the buffer containing the first bit of a Access Unit is received in the demuxer and the moment the demuxer pushed out the buffer corresponding to that Access Unit. - => That latency needs to be reported. It corresponds to the - biggest Access Unit spacing, in this case 1/video-framerate. + => That latency needs to be reported. According to the ISO/IEC 13818-1:2007 specifications, D.0.1 Timing mode, the "coded audio and video that represent sound and pictures that are to be presented simultaneously may be separated in time within the coded bit stream by ==>as much as one second<==" - => The demuxer will therefore report an added latency of 1s to - handle this interleave. + => The algorithm to calculate the latency should take that into + account. 2) Non-live push-based scheduling @@ -97,11 +94,22 @@ of the stream. do not have capture timestamps, we need to ensure the first buffer we push out corresponds to the base segment start runing time. - => A delta between the first DTS to output and the segment start - position needs to be computed. + => The packetizer keeps track of PCR locations and offsets in + addition to the clock skew (in the case of upstream buffers + being timestamped, which is the case for HLS). + + => The demuxer indicates to the packetizer when he sees the + 'beginning' of the program (i.e. the first valid PAT/PMT + combination). The packetizer will then use that location as + "timestamp 0", or "reference position/PCR". + + => The lowest DTS is passed to the packetizer to be converted to + timestamp. That value is computed in the same way as live + streams if upstream buffers have timestamps, or will be + subtracted from the reference PCR. => The outgoing buffers will be timestamped with their PTS values - (overflow corrected) offseted by that initial delta. + (overflow corrected) adjusted by the packetizer. Latency is reported just as with the live use-case. @@ -111,37 +119,13 @@ of the stream. We do not get a NEWSEGMENT event from upstream, we therefore need to compute the outgoing values. - The base stream/running time corresponds to the DTS of the first - buffer we will output. The DTS_delta becomes that earliest DTS. + => The outgoing values for the newsegment are calculated like for + the non-live push-based mode when upstream doesn't provide + timestamp'ed buffers. - => FILLME + => The outgoing buffer timestamps are timestamped with their PTS + values (overflow corrected) adjusted by the packetizer. - X) General notes - - It is assumed that PTS/DTS rollovers are detected and corrected such - as the outgoing timestamps never rollover. This can be easily - handled by correcting the DTS_delta when such rollovers are - detected. The maximum value of a GstClockTimeDiff is almost 3 - centuries, we therefore have enough margin to handle a decent number - of rollovers. - - The generic equation for calculating outgoing buffer timestamps - therefore becomes: - - D = DTS_delta, with rollover corrections - PTS = PTS of the buffer we are going to push out - TS = Timestamp of the outgoing buffer - - ==> TS = PTS + D - - If seeking is handled upstream for push-based cases, whether live or - not, no extra modification is required. - - If seeking is handled by the demuxer in the non-live push-based - cases (converting from TIME to BYTES), the demuxer will need to - set the segment start/time values to the requested seek position. - The DTS_delta will also have to be recomputed to take into account - the seek position. [0] When talking about live sources, we mean this in the GStreamer From d798cb7be354e43169f56519ecf71104668eeb7e Mon Sep 17 00:00:00 2001 From: Edward Hervey Date: Mon, 5 Mar 2012 11:27:51 +0100 Subject: [PATCH 053/138] tsdemux: printf fix --- gst/mpegtsdemux/mpegtsbase.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gst/mpegtsdemux/mpegtsbase.c b/gst/mpegtsdemux/mpegtsbase.c index dee31fb22f..c3741bc8df 100644 --- a/gst/mpegtsdemux/mpegtsbase.c +++ b/gst/mpegtsdemux/mpegtsbase.c @@ -1474,7 +1474,7 @@ mpegts_base_scan (MpegTSBase * base) /* Find last PCR value */ for (seek_pos = MAX (0, upstream_size - 655360); seek_pos < upstream_size && !done; seek_pos += 65536) { - GST_DEBUG ("Grabbing %d => %d", seek_pos, 65536); + GST_DEBUG ("Grabbing %" G_GUINT64_FORMAT " => %d", seek_pos, 65536); ret = gst_pad_pull_range (base->sinkpad, seek_pos, 65536, &buf); if (G_UNLIKELY (ret != GST_FLOW_OK)) From 416b10b991727286bcecf6c6831a5c531fd9f396 Mon Sep 17 00:00:00 2001 From: Edward Hervey Date: Mon, 5 Mar 2012 12:46:13 +0100 Subject: [PATCH 054/138] mpegtspacketizer: Handle rollover in offset calculations --- gst/mpegtsdemux/mpegtspacketizer.c | 35 ++++++++++++++++++++++++------ gst/mpegtsdemux/mpegtspacketizer.h | 2 +- 2 files changed, 29 insertions(+), 8 deletions(-) diff --git a/gst/mpegtsdemux/mpegtspacketizer.c b/gst/mpegtsdemux/mpegtspacketizer.c index 84f5161b62..6e0335a280 100644 --- a/gst/mpegtsdemux/mpegtspacketizer.c +++ b/gst/mpegtsdemux/mpegtspacketizer.c @@ -31,6 +31,10 @@ /* Skew calculation pameters */ #define MAX_TIME (2 * GST_SECOND) +/* maximal PCR time */ +#define PCR_MAX_VALUE (((((guint64)1)<<33) * 300) + 298) +#define PTS_DTS_MAX_VALUE (((guint64)1) << 33) + #include "mpegtspacketizer.h" #include "gstmpegdesc.h" @@ -89,8 +93,10 @@ struct _MpegTSPacketizerPrivate /* FIXME : Replace this later on with a balanced tree or sequence */ guint64 first_offset; guint64 first_pcr; + GstClockTime first_pcr_ts; guint64 last_offset; guint64 last_pcr; + GstClockTime last_pcr_ts; /* Reference offset */ guint64 refoffset; @@ -206,8 +212,10 @@ mpegts_packetizer_init (MpegTSPacketizer2 * packetizer) packetizer->priv->first_offset = -1; packetizer->priv->first_pcr = -1; + packetizer->priv->first_pcr_ts = GST_CLOCK_TIME_NONE; packetizer->priv->last_offset = -1; packetizer->priv->last_pcr = -1; + packetizer->priv->last_pcr_ts = GST_CLOCK_TIME_NONE; packetizer->priv->nb_seen_offsets = 0; packetizer->priv->refoffset = -1; } @@ -3140,6 +3148,7 @@ record_pcr (MpegTSPacketizer2 * packetizer, guint64 pcr, guint64 offset) GST_DEBUG ("Recording first value. PCR:%" G_GUINT64_FORMAT " offset:%" G_GUINT64_FORMAT, pcr, offset); priv->first_pcr = pcr; + priv->first_pcr_ts = PCRTIME_TO_GSTTIME (pcr); priv->first_offset = offset; priv->nb_seen_offsets++; } else @@ -3147,7 +3156,12 @@ record_pcr (MpegTSPacketizer2 * packetizer, guint64 pcr, guint64 offset) if (priv->last_pcr == -1 || priv->last_offset < offset) { GST_DEBUG ("Recording last value. PCR:%" G_GUINT64_FORMAT " offset:%" G_GUINT64_FORMAT, pcr, offset); + if (G_UNLIKELY (priv->first_pcr != -1 && pcr < priv->first_pcr)) { + GST_DEBUG ("rollover detected"); + pcr += PCR_MAX_VALUE; + } priv->last_pcr = pcr; + priv->last_pcr_ts = PCRTIME_TO_GSTTIME (pcr); priv->last_offset = offset; priv->nb_seen_offsets++; } @@ -3185,23 +3199,30 @@ mpegts_packetizer_offset_to_ts (MpegTSPacketizer2 * packetizer, guint64 offset) } GstClockTime -mpegts_packetizer_pts_to_ts (MpegTSPacketizer2 * packetizer, guint64 pts) +mpegts_packetizer_pts_to_ts (MpegTSPacketizer2 * packetizer, GstClockTime pts) { + GstClockTime res = GST_CLOCK_TIME_NONE; + /* Use clock skew if present */ if (packetizer->calculate_skew && GST_CLOCK_TIME_IS_VALID (packetizer->base_time)) { GST_DEBUG ("pts %" G_GUINT64_FORMAT " base_pcrtime:%" G_GUINT64_FORMAT " base_time:%" GST_TIME_FORMAT, pts, packetizer->base_pcrtime, GST_TIME_ARGS (packetizer->base_time)); - return pts - packetizer->base_pcrtime + packetizer->base_time + + res = pts - packetizer->base_pcrtime + packetizer->base_time + packetizer->skew; + } else + /* If not, use pcr observations */ + if (packetizer->calculate_offset && packetizer->priv->first_pcr != -1) { + /* Rollover */ + if (G_UNLIKELY (pts < packetizer->priv->first_pcr_ts)) + pts += MPEGTIME_TO_GSTTIME (PTS_DTS_MAX_VALUE); + res = pts - packetizer->priv->first_pcr_ts; } - /* If not, use pcr observations */ - if (packetizer->calculate_offset && packetizer->priv->first_pcr != -1) - return pts - PCRTIME_TO_GSTTIME (packetizer->priv->first_pcr); - - return GST_CLOCK_TIME_NONE; + GST_DEBUG ("Returning timestamp %" GST_TIME_FORMAT " for pts %" + GST_TIME_FORMAT, GST_TIME_ARGS (res), GST_TIME_ARGS (pts)); + return res; } guint64 diff --git a/gst/mpegtsdemux/mpegtspacketizer.h b/gst/mpegtsdemux/mpegtspacketizer.h index 4f1f337ba7..418da0847c 100644 --- a/gst/mpegtsdemux/mpegtspacketizer.h +++ b/gst/mpegtsdemux/mpegtspacketizer.h @@ -206,7 +206,7 @@ mpegts_packetizer_ts_to_offset (MpegTSPacketizer2 * packetizer, GstClockTime ts); GstClockTime mpegts_packetizer_pts_to_ts (MpegTSPacketizer2 * packetizer, - guint64 pcr); + GstClockTime pts); void mpegts_packetizer_set_reference_offset (MpegTSPacketizer2 * packetizer, guint64 refoffset); From e214b31f5cd28ed0220da62949fdb10b5fb91d12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Tue, 6 Mar 2012 14:38:47 +0100 Subject: [PATCH 055/138] baseaudiovisualizer: Fix 'comparison of unsigned expression >= 0 is always true' compiler warning --- gst/audiovisualizers/gstbaseaudiovisualizer.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gst/audiovisualizers/gstbaseaudiovisualizer.c b/gst/audiovisualizers/gstbaseaudiovisualizer.c index 6613e3ae12..d7bd4d7a65 100644 --- a/gst/audiovisualizers/gstbaseaudiovisualizer.c +++ b/gst/audiovisualizers/gstbaseaudiovisualizer.c @@ -828,7 +828,7 @@ gst_base_audio_visualizer_chain (GstPad * pad, GstBuffer * buffer) /* we want to take less or more, depending on spf : req_spf */ if (avail - sbpf >= sbpf) { gst_adapter_flush (scope->adapter, sbpf); - } else if (avail - sbpf >= 0) { + } else if (avail >= sbpf) { /* just flush a bit and stop */ gst_adapter_flush (scope->adapter, (avail - sbpf)); break; From 21ddc28760f9ba29a137183eb49dcaad50c285b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Tue, 6 Mar 2012 14:41:00 +0100 Subject: [PATCH 056/138] dccp: Fix 'comparison of unsigned expression < 0 is always false' compiler warning --- gst/dccp/gstdccp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gst/dccp/gstdccp.c b/gst/dccp/gstdccp.c index af652f2de6..8a80db4167 100644 --- a/gst/dccp/gstdccp.c +++ b/gst/dccp/gstdccp.c @@ -366,7 +366,7 @@ gst_dccp_socket_write (GstElement * element, int socket, const void *buf, bytes_written += wrote; } - if (bytes_written < 0) + if (wrote < 0) GST_WARNING ("Error while writing."); else GST_LOG_OBJECT (element, "Wrote %" G_GSIZE_FORMAT " bytes succesfully.", From 5f2081e8284b7a5bccc8f7d548b8887217b9751e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Tue, 6 Mar 2012 14:43:29 +0100 Subject: [PATCH 057/138] mpegdemux: Fix 'expression result unused' compiler warning --- gst/mpegdemux/gstmpegdemux.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gst/mpegdemux/gstmpegdemux.c b/gst/mpegdemux/gstmpegdemux.c index 7e9fb14c65..c742a95988 100644 --- a/gst/mpegdemux/gstmpegdemux.c +++ b/gst/mpegdemux/gstmpegdemux.c @@ -652,7 +652,7 @@ gst_flups_demux_handle_dvd_event (GstFluPSDemux * demux, GstEvent * event) /* Store the language codes event on the element, then iterate over the * streams it specifies and retrieve them. The stream creation code then * creates the pad appropriately and sends tag events as needed */ - p_ev = &demux->lang_codes, event; + p_ev = &demux->lang_codes; gst_event_replace (p_ev, event); GST_DEBUG_OBJECT (demux, "Handling language codes event"); From 0bd9ae0deaad4f88407b9af75eebe17f9ad3ee36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Tue, 6 Mar 2012 14:44:25 +0100 Subject: [PATCH 058/138] mpegtsparse: Fix 'variable 'pid' is uninitialized when used here' compiler warning --- gst/mpegdemux/mpegtsparse.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/gst/mpegdemux/mpegtsparse.c b/gst/mpegdemux/mpegtsparse.c index 273b3edd40..af50984fa7 100644 --- a/gst/mpegdemux/mpegtsparse.c +++ b/gst/mpegdemux/mpegtsparse.c @@ -222,11 +222,9 @@ mpegts_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, &sink_template); gst_element_class_add_static_pad_template (element_class, &src_template); - gst_element_class_add_static_pad_template (element_class, - &program_template); + gst_element_class_add_static_pad_template (element_class, &program_template); gst_element_class_set_details_simple (element_class, "MPEG transport stream parser", "Codec/Parser", @@ -1041,7 +1039,7 @@ mpegts_parse_apply_pmt (MpegTSParse * parse, MpegTSParseProgram *program; guint program_number; guint pcr_pid; - guint pid; + guint pid = 0; guint stream_type; GstStructure *stream; gint i; From b292b19c594230cdab8d4cd6881365514532a3e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Tue, 6 Mar 2012 14:46:03 +0100 Subject: [PATCH 059/138] mxfdemux: Fix 'comparison of unsigned expression >= 0 is always true' compiler warning --- gst/mxf/mxfdemux.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/gst/mxf/mxfdemux.c b/gst/mxf/mxfdemux.c index d5ce5f23b8..de3bb36142 100644 --- a/gst/mxf/mxfdemux.c +++ b/gst/mxf/mxfdemux.c @@ -2383,7 +2383,7 @@ gst_mxf_demux_find_essence_element (GstMXFDemux * demux, GstFlowReturn ret = GST_FLOW_OK; guint64 old_offset = demux->offset; GstMXFDemuxPartition *old_partition = demux->current_partition; - guint i; + gint i; GST_DEBUG_OBJECT (demux, "Trying to find essence element %" G_GINT64_FORMAT " of track %u with body_sid %u (keyframe %d)", *position, @@ -3966,10 +3966,8 @@ gst_mxf_demux_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_static_pad_template (element_class, - &mxf_sink_template); - gst_element_class_add_static_pad_template (element_class, - &mxf_src_template); + gst_element_class_add_static_pad_template (element_class, &mxf_sink_template); + gst_element_class_add_static_pad_template (element_class, &mxf_src_template); gst_element_class_set_details_simple (element_class, "MXF Demuxer", "Codec/Demuxer", "Demux MXF files", "Sebastian Dröge "); From e34a70902c9e129bbe485974c4b82fde5107f5d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Tue, 6 Mar 2012 14:47:17 +0100 Subject: [PATCH 060/138] removesilence: Fix 'argument to 'sizeof' in 'memset' call is the same expression as the destination' compiler warning --- gst/removesilence/vad_private.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gst/removesilence/vad_private.c b/gst/removesilence/vad_private.c index f187a06149..0b86531037 100644 --- a/gst/removesilence/vad_private.c +++ b/gst/removesilence/vad_private.c @@ -74,7 +74,7 @@ vad_new (guint64 hysteresis) void vad_reset (VADFilter * vad) { - memset (vad, 0, sizeof (vad)); + memset (vad, 0, sizeof (*vad)); vad->cqueue.base.s = vad->vad_buffer; vad->cqueue.tail.a = vad->cqueue.head.a = 0; vad->cqueue.size = VAD_BUFFER_SIZE; From be82ae207a30dd16a932adb508ba616170b5be49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Tue, 6 Mar 2012 14:50:06 +0100 Subject: [PATCH 061/138] vdpau: Fix loop to not read before the valid memory area --- sys/vdpau/h264/gstvdph264dec.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/sys/vdpau/h264/gstvdph264dec.c b/sys/vdpau/h264/gstvdph264dec.c index 6b6c3360a5..d7af47b6f4 100644 --- a/sys/vdpau/h264/gstvdph264dec.c +++ b/sys/vdpau/h264/gstvdph264dec.c @@ -716,7 +716,7 @@ gst_vdp_h264_dec_parse_data (GstBaseVideoDecoder * base_video_decoder, size = gst_bit_reader_get_remaining (&reader) / 8; i = size - 1; - while (size >= 0 && data[i] == 0x00) { + while (size > 0 && data[i] == 0x00) { size--; i--; } @@ -870,8 +870,7 @@ gst_vdp_h264_dec_base_init (gpointer g_class) "Decode h264 stream with vdpau", "Carl-Anton Ingmarsson "); - gst_element_class_add_static_pad_template (element_class, - &sink_template); + gst_element_class_add_static_pad_template (element_class, &sink_template); } static void From 83ffd07e4416c00ac00e95d08449746a8227a6be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Tue, 6 Mar 2012 14:51:26 +0100 Subject: [PATCH 062/138] cogcolorspace: Use correct enum type for return value --- ext/cog/gstcogcolorspace.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/cog/gstcogcolorspace.c b/ext/cog/gstcogcolorspace.c index 3c84c32a5c..d849f36a01 100644 --- a/ext/cog/gstcogcolorspace.c +++ b/ext/cog/gstcogcolorspace.c @@ -372,7 +372,7 @@ gst_cogcolorspace_caps_get_chroma_site (GstCaps * caps) s = gst_video_parse_caps_chroma_site (caps); if (s == NULL) - return COG_COLOR_MATRIX_SDTV; + return COG_CHROMA_SITE_MPEG2; if (strcmp (s, "jpeg") == 0) { return COG_CHROMA_SITE_JPEG; From 4b42d5c5c686262427b0492f4b52e2bbbbb70c12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Tue, 6 Mar 2012 14:51:57 +0100 Subject: [PATCH 063/138] curl: Fix 'equality comparison with extraneous parentheses' compiler warning --- ext/curl/gstcurlsink.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/curl/gstcurlsink.c b/ext/curl/gstcurlsink.c index 4306de43b8..7bf9b43b2d 100644 --- a/ext/curl/gstcurlsink.c +++ b/ext/curl/gstcurlsink.c @@ -849,7 +849,7 @@ gst_curl_sink_handle_transfer (GstCurlSink * sink) if (!proxy_conn_established && (resp_proxy != RESPONSE_CONNECT_PROXY) && proxy_auth) { curl_easy_getinfo (sink->curl, CURLINFO_HTTP_CONNECTCODE, &resp_proxy); - if ((resp_proxy == RESPONSE_CONNECT_PROXY)) { + if (resp_proxy == RESPONSE_CONNECT_PROXY) { GST_LOG ("received HTTP/1.0 200 Connection Established"); /* Workaround: redefine HTTP headers before connecting to HTTP server. * When talking to proxy, the Content-Length: 0 is send with the request. From 3482b7b219b588cc4fd52a72a8ee98f149fd277e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Tue, 6 Mar 2012 14:56:20 +0100 Subject: [PATCH 064/138] dfbvideosink: Fix 'implicit conversion from enumeration type 'DirectResult' to different enumeration type 'DFBResult'' compiler warning We're not checking the return value of that function anyway. --- ext/directfb/dfbvideosink.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/directfb/dfbvideosink.c b/ext/directfb/dfbvideosink.c index c3417a5e15..737096b98a 100644 --- a/ext/directfb/dfbvideosink.c +++ b/ext/directfb/dfbvideosink.c @@ -1613,7 +1613,7 @@ gst_dfbvideosink_show_frame (GstBaseSink * bsink, GstBuffer * buf) res = dest->Unlock (dest); - res = dest->Release (dest); + dest->Release (dest); if (dfbvideosink->backbuffer) { if (dfbvideosink->vsync) { From 5a6b7fba4db92687d763e807a5c7f71b999d093e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Tue, 6 Mar 2012 14:57:45 +0100 Subject: [PATCH 065/138] gsettings: Fix 'if statement has empty body' compiler warning --- ext/gsettings/gstgsettingsaudiosink.c | 5 +++-- ext/gsettings/gstgsettingsaudiosrc.c | 4 ++-- ext/gsettings/gstgsettingsvideosink.c | 4 ++-- ext/gsettings/gstgsettingsvideosrc.c | 4 ++-- 4 files changed, 9 insertions(+), 8 deletions(-) diff --git a/ext/gsettings/gstgsettingsaudiosink.c b/ext/gsettings/gstgsettingsaudiosink.c index f4155b3bcf..12d848938a 100644 --- a/ext/gsettings/gstgsettingsaudiosink.c +++ b/ext/gsettings/gstgsettingsaudiosink.c @@ -160,8 +160,9 @@ static void on_changed (GSettings * settings, gchar * key, GstGSettingsAudioSink * sink) { gboolean changed = FALSE; - if (!g_str_has_suffix (key, "audiosink")); - return; + + if (!g_str_has_suffix (key, "audiosink")) + return; GST_OBJECT_LOCK (sink); if ((sink->profile == GST_GSETTINGS_AUDIOSINK_PROFILE_SOUNDS && diff --git a/ext/gsettings/gstgsettingsaudiosrc.c b/ext/gsettings/gstgsettingsaudiosrc.c index 7b9bd1f18b..c30f12271b 100644 --- a/ext/gsettings/gstgsettingsaudiosrc.c +++ b/ext/gsettings/gstgsettingsaudiosrc.c @@ -104,8 +104,8 @@ fail: static void on_changed (GSettings * settings, gchar * key, GstGSettingsAudioSrc * src) { - if (!g_str_equal (key, "audiosrc")); - return; + if (!g_str_equal (key, "audiosrc")) + return; gst_gsettings_audio_src_change_child (src); } diff --git a/ext/gsettings/gstgsettingsvideosink.c b/ext/gsettings/gstgsettingsvideosink.c index f04e8054ce..e225ec14ed 100644 --- a/ext/gsettings/gstgsettingsvideosink.c +++ b/ext/gsettings/gstgsettingsvideosink.c @@ -104,8 +104,8 @@ fail: static void on_changed (GSettings * settings, gchar * key, GstGSettingsVideoSink * sink) { - if (!g_str_has_suffix (key, "videosink")); - return; + if (!g_str_has_suffix (key, "videosink")) + return; gst_gsettings_video_sink_change_child (sink); } diff --git a/ext/gsettings/gstgsettingsvideosrc.c b/ext/gsettings/gstgsettingsvideosrc.c index 877656814f..6c2a5b03e2 100644 --- a/ext/gsettings/gstgsettingsvideosrc.c +++ b/ext/gsettings/gstgsettingsvideosrc.c @@ -104,8 +104,8 @@ fail: static void on_changed (GSettings * settings, gchar * key, GstGSettingsVideoSrc * src) { - if (!g_str_equal (key, "videosrc")); - return; + if (!g_str_equal (key, "videosrc")) + return; gst_gsettings_video_src_change_child (src); } From 837763fee8b13d4f964e89b1de8bf4b7f3571836 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Tue, 6 Mar 2012 15:21:17 +0100 Subject: [PATCH 066/138] vp8enc: Fix 'argument to 'sizeof' in 'memset' call is the same expression as the destination' compiler warning --- ext/vp8/gstvp8enc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/vp8/gstvp8enc.c b/ext/vp8/gstvp8enc.c index b1f06e056a..9dadd51bdf 100644 --- a/ext/vp8/gstvp8enc.c +++ b/ext/vp8/gstvp8enc.c @@ -843,7 +843,7 @@ gst_vp8_enc_set_format (GstBaseVideoEncoder * base_video_encoder, /* prepare cached image buffer setup */ image = &encoder->image; - memset (image, 0, sizeof (image)); + memset (image, 0, sizeof (*image)); image->fmt = VPX_IMG_FMT_I420; image->bps = 12; From df86df9ddf75aa97de126cd1833608284bafee18 Mon Sep 17 00:00:00 2001 From: Mark Nauwelaerts Date: Tue, 6 Mar 2012 18:32:09 +0100 Subject: [PATCH 067/138] dccp: avoid indefinite looping upon error ... and fix 'uninitialized' compilation warning as well. --- gst/dccp/gstdccp.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/gst/dccp/gstdccp.c b/gst/dccp/gstdccp.c index 8a80db4167..cbe7c4689d 100644 --- a/gst/dccp/gstdccp.c +++ b/gst/dccp/gstdccp.c @@ -333,7 +333,7 @@ gst_dccp_socket_write (GstElement * element, int socket, const void *buf, size_t size, int packet_size) { size_t bytes_written = 0; - ssize_t wrote; + ssize_t wrote = 0; #ifndef G_OS_WIN32 struct iovec iov; @@ -362,8 +362,11 @@ gst_dccp_socket_write (GstElement * element, int socket, const void *buf, } while (wrote == SOCKET_ERROR && errorCode == EAGAIN); #endif - /* TODO print the send error */ - bytes_written += wrote; + /* give up on error */ + if (wrote >= 0) + bytes_written += wrote; + else + break; } if (wrote < 0) From 8aa50a29de6af081129926cfab15293bd560c538 Mon Sep 17 00:00:00 2001 From: Mark Nauwelaerts Date: Tue, 6 Mar 2012 16:11:30 +0100 Subject: [PATCH 068/138] dtsdec: use base class tag handling helper ... so as to ensure these to be handled and sent at proper time. --- ext/dts/gstdtsdec.c | 30 ++---------------------------- ext/dts/gstdtsdec.h | 2 -- 2 files changed, 2 insertions(+), 30 deletions(-) diff --git a/ext/dts/gstdtsdec.c b/ext/dts/gstdtsdec.c index 4a304f8e81..d589901c2c 100644 --- a/ext/dts/gstdtsdec.c +++ b/ext/dts/gstdtsdec.c @@ -137,8 +137,6 @@ static gboolean gst_dtsdec_parse (GstAudioDecoder * dec, GstAdapter * adapter, gint * offset, gint * length); static GstFlowReturn gst_dtsdec_handle_frame (GstAudioDecoder * dec, GstBuffer * buffer); -static GstFlowReturn gst_dtsdec_pre_push (GstAudioDecoder * bdec, - GstBuffer ** buffer); static GstFlowReturn gst_dtsdec_chain (GstPad * pad, GstBuffer * buf); @@ -182,7 +180,6 @@ gst_dtsdec_class_init (GstDtsDecClass * klass) gstbase_class->set_format = GST_DEBUG_FUNCPTR (gst_dtsdec_set_format); gstbase_class->parse = GST_DEBUG_FUNCPTR (gst_dtsdec_parse); gstbase_class->handle_frame = GST_DEBUG_FUNCPTR (gst_dtsdec_handle_frame); - gstbase_class->pre_push = GST_DEBUG_FUNCPTR (gst_dtsdec_pre_push); /** * GstDtsDec::drc @@ -266,10 +263,6 @@ gst_dtsdec_stop (GstAudioDecoder * dec) dca_free (dts->state); dts->state = NULL; } - if (dts->pending_tags) { - gst_tag_list_free (dts->pending_tags); - dts->pending_tags = NULL; - } return TRUE; } @@ -459,30 +452,11 @@ gst_dtsdec_update_streaminfo (GstDtsDec * dts) /* 1 => open bitrate, 2 => variable bitrate, 3 => lossless */ gst_tag_list_add (taglist, GST_TAG_MERGE_APPEND, GST_TAG_BITRATE, (guint) dts->bit_rate, NULL); - - if (dts->pending_tags) { - gst_tag_list_free (dts->pending_tags); - dts->pending_tags = NULL; - } - - dts->pending_tags = taglist; + gst_audio_decoder_merge_tags (GST_AUDIO_DECODER (dts), taglist, + GST_TAG_MERGE_REPLACE); } } -static GstFlowReturn -gst_dtsdec_pre_push (GstAudioDecoder * bdec, GstBuffer ** buffer) -{ - GstDtsDec *dts = GST_DTSDEC (bdec); - - if (G_UNLIKELY (dts->pending_tags)) { - gst_element_found_tags_for_pad (GST_ELEMENT (dts), - GST_AUDIO_DECODER_SRC_PAD (dts), dts->pending_tags); - dts->pending_tags = NULL; - } - - return GST_FLOW_OK; -} - static GstFlowReturn gst_dtsdec_handle_frame (GstAudioDecoder * bdec, GstBuffer * buffer) { diff --git a/ext/dts/gstdtsdec.h b/ext/dts/gstdtsdec.h index be6005a0a6..172473aca3 100644 --- a/ext/dts/gstdtsdec.h +++ b/ext/dts/gstdtsdec.h @@ -66,8 +66,6 @@ struct _GstDtsDec { #else dts_state_t *state; #endif - - GstTagList *pending_tags; }; struct _GstDtsDecClass { From bc7442faa350e496b2a0cc225fe4ead3c883cf54 Mon Sep 17 00:00:00 2001 From: Mark Nauwelaerts Date: Tue, 6 Mar 2012 16:11:52 +0100 Subject: [PATCH 069/138] celtdec: use base class tag handling helper ... so as to ensure these to be handled and sent at proper time. --- ext/celt/gstceltdec.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ext/celt/gstceltdec.c b/ext/celt/gstceltdec.c index 84b2d203f0..e8899c4886 100644 --- a/ext/celt/gstceltdec.c +++ b/ext/celt/gstceltdec.c @@ -298,8 +298,8 @@ gst_celt_dec_parse_comments (GstCeltDec * dec, GstBuffer * buf) 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); + gst_audio_decoder_merge_tags (GST_AUDIO_DECODER (dec), list, + GST_TAG_MERGE_REPLACE); g_free (encoder); g_free (ver); From 6f8e60e24f2586876b5ac46431997d5c31e6a377 Mon Sep 17 00:00:00 2001 From: Mark Nauwelaerts Date: Tue, 6 Mar 2012 18:33:17 +0100 Subject: [PATCH 070/138] sirenenc: port to audioencoder --- gst/siren/Makefile.am | 2 +- gst/siren/gstsirenenc.c | 218 +++++++++++----------------------------- gst/siren/gstsirenenc.h | 12 +-- 3 files changed, 62 insertions(+), 170 deletions(-) diff --git a/gst/siren/Makefile.am b/gst/siren/Makefile.am index 2be9ede49a..c6d1d8cba7 100644 --- a/gst/siren/Makefile.am +++ b/gst/siren/Makefile.am @@ -10,7 +10,7 @@ libgstsiren_la_SOURCES = gstsiren.c \ libgstsiren_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) \ $(GST_CFLAGS) -libgstsiren_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) -lgstrtp-@GST_MAJORMINOR@ \ +libgstsiren_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) -lgstaudio-@GST_MAJORMINOR@ \ $(GST_BASE_LIBS) $(GST_LIBS) $(LIBM) libgstsiren_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstsiren_la_LIBTOOLFLAGS = --tag=disable-static diff --git a/gst/siren/gstsirenenc.c b/gst/siren/gstsirenenc.c index dbf0f688d4..b6789a170d 100644 --- a/gst/siren/gstsirenenc.c +++ b/gst/siren/gstsirenenc.c @@ -69,17 +69,12 @@ enum ARG_0, }; - - -static void gst_siren_enc_finalize (GObject * object); - -static gboolean gst_siren_enc_sink_setcaps (GstPad * pad, GstCaps * caps); -static gboolean gst_siren_enc_sink_event (GstPad * pad, GstEvent * event); - -static GstFlowReturn gst_siren_enc_chain (GstPad * pad, GstBuffer * buf); -static GstStateChangeReturn -gst_siren_change_state (GstElement * element, GstStateChange transition); - +static gboolean gst_siren_enc_start (GstAudioEncoder * enc); +static gboolean gst_siren_enc_stop (GstAudioEncoder * enc); +static gboolean gst_siren_enc_set_format (GstAudioEncoder * enc, + GstAudioInfo * info); +static GstFlowReturn gst_siren_enc_handle_frame (GstAudioEncoder * enc, + GstBuffer * in_buf); static void _do_init (GType type) @@ -87,8 +82,8 @@ _do_init (GType type) GST_DEBUG_CATEGORY_INIT (sirenenc_debug, "sirenenc", 0, "sirenenc"); } -GST_BOILERPLATE_FULL (GstSirenEnc, gst_siren_enc, GstElement, - GST_TYPE_ELEMENT, _do_init); +GST_BOILERPLATE_FULL (GstSirenEnc, gst_siren_enc, GstAudioEncoder, + GST_TYPE_AUDIO_ENCODER, _do_init); static void gst_siren_enc_base_init (gpointer klass) @@ -107,17 +102,14 @@ gst_siren_enc_base_init (gpointer klass) static void gst_siren_enc_class_init (GstSirenEncClass * klass) { - GObjectClass *gobject_class; - GstElementClass *gstelement_class; - - gobject_class = (GObjectClass *) klass; - gstelement_class = (GstElementClass *) klass; + GstAudioEncoderClass *base_class = GST_AUDIO_ENCODER_CLASS (klass); GST_DEBUG ("Initializing Class"); - gobject_class->finalize = GST_DEBUG_FUNCPTR (gst_siren_enc_finalize); - - gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_siren_change_state); + base_class->start = GST_DEBUG_FUNCPTR (gst_siren_enc_start); + base_class->stop = GST_DEBUG_FUNCPTR (gst_siren_enc_stop); + base_class->set_format = GST_DEBUG_FUNCPTR (gst_siren_enc_set_format); + base_class->handle_frame = GST_DEBUG_FUNCPTR (gst_siren_enc_handle_frame); GST_DEBUG ("Class Init done"); } @@ -125,120 +117,81 @@ gst_siren_enc_class_init (GstSirenEncClass * klass) static void gst_siren_enc_init (GstSirenEnc * enc, GstSirenEncClass * klass) { - - GST_DEBUG_OBJECT (enc, "Initializing"); - enc->encoder = Siren7_NewEncoder (16000); - enc->adapter = gst_adapter_new (); - - enc->sinkpad = gst_pad_new_from_static_template (&sinktemplate, "sink"); - enc->srcpad = gst_pad_new_from_static_template (&srctemplate, "src"); - - gst_pad_set_setcaps_function (enc->sinkpad, - GST_DEBUG_FUNCPTR (gst_siren_enc_sink_setcaps)); - gst_pad_set_event_function (enc->sinkpad, - GST_DEBUG_FUNCPTR (gst_siren_enc_sink_event)); - gst_pad_set_chain_function (enc->sinkpad, - GST_DEBUG_FUNCPTR (gst_siren_enc_chain)); - - gst_element_add_pad (GST_ELEMENT (enc), enc->sinkpad); - gst_element_add_pad (GST_ELEMENT (enc), enc->srcpad); - - GST_DEBUG_OBJECT (enc, "Init done"); -} - -static void -gst_siren_enc_finalize (GObject * object) -{ - GstSirenEnc *enc = GST_SIREN_ENC (object); - - GST_DEBUG_OBJECT (object, "Disposing"); - - Siren7_CloseEncoder (enc->encoder); - g_object_unref (enc->adapter); - - G_OBJECT_CLASS (parent_class)->finalize (object); } static gboolean -gst_siren_enc_sink_setcaps (GstPad * pad, GstCaps * caps) +gst_siren_enc_start (GstAudioEncoder * enc) +{ + GstSirenEnc *senc = GST_SIREN_ENC (enc); + + GST_DEBUG_OBJECT (enc, "start"); + + senc->encoder = Siren7_NewEncoder (16000); + + return TRUE; +} + +static gboolean +gst_siren_enc_stop (GstAudioEncoder * enc) +{ + GstSirenEnc *senc = GST_SIREN_ENC (enc); + + GST_DEBUG_OBJECT (senc, "stop"); + + Siren7_CloseEncoder (senc->encoder); + + return TRUE; +} + +static gboolean +gst_siren_enc_set_format (GstAudioEncoder * benc, GstAudioInfo * info) { GstSirenEnc *enc; gboolean res; GstCaps *outcaps; - enc = GST_SIREN_ENC (GST_PAD_PARENT (pad)); + enc = GST_SIREN_ENC (benc); outcaps = gst_static_pad_template_get_caps (&srctemplate); - res = gst_pad_set_caps (enc->srcpad, outcaps); + res = gst_pad_set_caps (GST_AUDIO_ENCODER_SRC_PAD (enc), outcaps); gst_caps_unref (outcaps); - return res; -} + /* report needs to base class */ + gst_audio_encoder_set_frame_samples_min (benc, 320); + gst_audio_encoder_set_frame_samples_max (benc, 320); + /* no remainder or flushing please */ + gst_audio_encoder_set_hard_min (benc, TRUE); + gst_audio_encoder_set_drainable (benc, FALSE); -static gboolean -gst_siren_enc_sink_event (GstPad * pad, GstEvent * event) -{ - GstSirenEnc *enc; - gboolean res; - - enc = GST_SIREN_ENC (GST_PAD_PARENT (pad)); - - switch (GST_EVENT_TYPE (event)) { - case GST_EVENT_EOS: - gst_adapter_clear (enc->adapter); - res = gst_pad_push_event (enc->srcpad, event); - break; - case GST_EVENT_FLUSH_STOP: - gst_adapter_clear (enc->adapter); - res = gst_pad_push_event (enc->srcpad, event); - break; - default: - res = gst_pad_push_event (enc->srcpad, event); - break; - } return res; } static GstFlowReturn -gst_siren_enc_chain (GstPad * pad, GstBuffer * buf) +gst_siren_enc_handle_frame (GstAudioEncoder * benc, GstBuffer * buf) { GstSirenEnc *enc; GstFlowReturn ret = GST_FLOW_OK; GstBuffer *out_buf; guint8 *in_data, *out_data; - guint8 *to_free = NULL; guint i, size, num_frames; gint out_size, in_size; gint encode_ret; - gboolean discont; - GstClockTime timestamp; - guint64 distance; - GstCaps *outcaps; - enc = GST_SIREN_ENC (GST_PAD_PARENT (pad)); + g_return_val_if_fail (buf != NULL, GST_FLOW_ERROR); - discont = GST_BUFFER_IS_DISCONT (buf); - if (discont) { - GST_DEBUG_OBJECT (enc, "received DISCONT, flush adapter"); - gst_adapter_clear (enc->adapter); - enc->discont = TRUE; - } + enc = GST_SIREN_ENC (benc); - gst_adapter_push (enc->adapter, buf); + size = GST_BUFFER_SIZE (buf); - size = gst_adapter_available (enc->adapter); + GST_LOG_OBJECT (enc, "Received buffer of size %d", GST_BUFFER_SIZE (buf)); - GST_LOG_OBJECT (enc, "Received buffer of size %d with adapter of size : %d", - GST_BUFFER_SIZE (buf), size); + g_return_val_if_fail (size > 0, GST_FLOW_ERROR); + g_return_val_if_fail (size % 640 == 0, GST_FLOW_ERROR); /* we need to process 640 input bytes to produce 40 output bytes */ /* calculate the amount of frames we will handle */ num_frames = size / 640; - /* no frames, wait some more */ - if (num_frames == 0) - goto done; - /* this is the input/output size */ in_size = num_frames * 640; out_size = num_frames * 40; @@ -246,32 +199,14 @@ gst_siren_enc_chain (GstPad * pad, GstBuffer * buf) GST_LOG_OBJECT (enc, "we have %u frames, %u in, %u out", num_frames, in_size, out_size); - /* set output caps when needed */ - if ((outcaps = GST_PAD_CAPS (enc->srcpad)) == NULL) { - outcaps = gst_static_pad_template_get_caps (&srctemplate); - gst_pad_set_caps (enc->srcpad, outcaps); - gst_caps_unref (outcaps); - } - /* get a buffer */ - ret = gst_pad_alloc_buffer_and_set_caps (enc->srcpad, -1, - out_size, outcaps, &out_buf); + ret = gst_pad_alloc_buffer_and_set_caps (GST_AUDIO_ENCODER_SRC_PAD (benc), + -1, out_size, GST_PAD_CAPS (GST_AUDIO_ENCODER_SRC_PAD (benc)), &out_buf); if (ret != GST_FLOW_OK) goto alloc_failed; - /* get the timestamp for the output buffer */ - timestamp = gst_adapter_prev_timestamp (enc->adapter, &distance); - - /* add the amount of time taken by the distance */ - if (timestamp != -1) - timestamp += gst_util_uint64_scale_int (distance / 2, GST_SECOND, 16000); - - GST_LOG_OBJECT (enc, - "timestamp %" GST_TIME_FORMAT ", distance %" G_GUINT64_FORMAT, - GST_TIME_ARGS (timestamp), distance); - /* get the input data for all the frames */ - to_free = in_data = gst_adapter_take (enc->adapter, in_size); + in_data = GST_BUFFER_DATA (buf); out_data = GST_BUFFER_DATA (out_buf); for (i = 0; i < num_frames; i++) { @@ -289,20 +224,10 @@ gst_siren_enc_chain (GstPad * pad, GstBuffer * buf) GST_LOG_OBJECT (enc, "Finished encoding"); - /* mark discont */ - if (enc->discont) { - GST_BUFFER_FLAG_SET (out_buf, GST_BUFFER_FLAG_DISCONT); - enc->discont = FALSE; - } - GST_BUFFER_TIMESTAMP (out_buf) = timestamp; - GST_BUFFER_DURATION (out_buf) = num_frames * FRAME_DURATION; - - ret = gst_pad_push (enc->srcpad, out_buf); + /* we encode all we get, pass it along */ + ret = gst_audio_encoder_finish_frame (benc, out_buf, -1); done: - if (to_free) - g_free (to_free); - return ret; /* ERRORS */ @@ -322,33 +247,6 @@ encode_error: } } -static GstStateChangeReturn -gst_siren_change_state (GstElement * element, GstStateChange transition) -{ - GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; - GstSirenEnc *enc = GST_SIREN_ENC (element); - - switch (transition) { - case GST_STATE_CHANGE_READY_TO_PAUSED: - enc->discont = 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 (enc->adapter); - break; - default: - break; - } - - return ret; -} - gboolean gst_siren_enc_plugin_init (GstPlugin * plugin) { diff --git a/gst/siren/gstsirenenc.h b/gst/siren/gstsirenenc.h index 1d63628dc4..3477db1a73 100644 --- a/gst/siren/gstsirenenc.h +++ b/gst/siren/gstsirenenc.h @@ -24,7 +24,7 @@ #define __GST_SIREN_ENC_H__ #include -#include +#include #include "siren7.h" @@ -48,21 +48,15 @@ typedef struct _GstSirenEncPrivate GstSirenEncPrivate; struct _GstSirenEnc { - GstElement parent; + GstAudioEncoder parent; /* protected by the stream lock */ SirenEncoder encoder; - GstAdapter *adapter; - - gboolean discont; - - GstPad *srcpad; - GstPad *sinkpad; }; struct _GstSirenEncClass { - GstElementClass parent_class; + GstAudioEncoderClass parent_class; }; GType gst_siren_enc_get_type (void); From 22b9b13166147b74a63fcce57b2615d0a9fc4f47 Mon Sep 17 00:00:00 2001 From: Mark Nauwelaerts Date: Tue, 6 Mar 2012 18:33:25 +0100 Subject: [PATCH 071/138] sirendec: port to audiodecoder --- gst/siren/gstsirendec.c | 245 +++++++++++++++------------------------- gst/siren/gstsirendec.h | 12 +- 2 files changed, 92 insertions(+), 165 deletions(-) diff --git a/gst/siren/gstsirendec.c b/gst/siren/gstsirendec.c index 6325c96706..ca0e81785f 100644 --- a/gst/siren/gstsirendec.c +++ b/gst/siren/gstsirendec.c @@ -69,14 +69,14 @@ enum ARG_0, }; -static void gst_siren_dec_finalize (GObject * object); - -static GstStateChangeReturn -gst_siren_change_state (GstElement * element, GstStateChange transition); - -static gboolean gst_siren_dec_sink_setcaps (GstPad * pad, GstCaps * caps); -static gboolean gst_siren_dec_sink_event (GstPad * pad, GstEvent * event); -static GstFlowReturn gst_siren_dec_chain (GstPad * pad, GstBuffer * buf); +static gboolean gst_siren_dec_start (GstAudioDecoder * dec); +static gboolean gst_siren_dec_stop (GstAudioDecoder * dec); +static gboolean gst_siren_dec_set_format (GstAudioDecoder * dec, + GstCaps * caps); +static gboolean gst_siren_dec_parse (GstAudioDecoder * dec, + GstAdapter * adapter, gint * offset, gint * length); +static GstFlowReturn gst_siren_dec_handle_frame (GstAudioDecoder * dec, + GstBuffer * buffer); static void _do_init (GType type) @@ -84,8 +84,8 @@ _do_init (GType type) GST_DEBUG_CATEGORY_INIT (sirendec_debug, "sirendec", 0, "sirendec"); } -GST_BOILERPLATE_FULL (GstSirenDec, gst_siren_dec, GstElement, - GST_TYPE_ELEMENT, _do_init); +GST_BOILERPLATE_FULL (GstSirenDec, gst_siren_dec, GstAudioDecoder, + GST_TYPE_AUDIO_DECODER, _do_init); static void gst_siren_dec_base_init (gpointer klass) @@ -104,17 +104,15 @@ gst_siren_dec_base_init (gpointer klass) static void gst_siren_dec_class_init (GstSirenDecClass * klass) { - GObjectClass *gobject_class; - GstElementClass *gstelement_class; - - gobject_class = (GObjectClass *) klass; - gstelement_class = (GstElementClass *) klass; + GstAudioDecoderClass *base_class = GST_AUDIO_DECODER_CLASS (klass); GST_DEBUG ("Initializing Class"); - gobject_class->finalize = GST_DEBUG_FUNCPTR (gst_siren_dec_finalize); - - gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_siren_change_state); + base_class->start = GST_DEBUG_FUNCPTR (gst_siren_dec_start); + base_class->stop = GST_DEBUG_FUNCPTR (gst_siren_dec_stop); + base_class->set_format = GST_DEBUG_FUNCPTR (gst_siren_dec_set_format); + base_class->parse = GST_DEBUG_FUNCPTR (gst_siren_dec_parse); + base_class->handle_frame = GST_DEBUG_FUNCPTR (gst_siren_dec_handle_frame); GST_DEBUG ("Class Init done"); } @@ -122,119 +120,103 @@ gst_siren_dec_class_init (GstSirenDecClass * klass) static void gst_siren_dec_init (GstSirenDec * dec, GstSirenDecClass * klass) { - - GST_DEBUG_OBJECT (dec, "Initializing"); - dec->decoder = Siren7_NewDecoder (16000);; - - dec->sinkpad = gst_pad_new_from_static_template (&sinktemplate, "sink"); - dec->srcpad = gst_pad_new_from_static_template (&srctemplate, "src"); - - gst_pad_set_setcaps_function (dec->sinkpad, - GST_DEBUG_FUNCPTR (gst_siren_dec_sink_setcaps)); - gst_pad_set_event_function (dec->sinkpad, - GST_DEBUG_FUNCPTR (gst_siren_dec_sink_event)); - gst_pad_set_chain_function (dec->sinkpad, - GST_DEBUG_FUNCPTR (gst_siren_dec_chain)); - - gst_element_add_pad (GST_ELEMENT (dec), dec->sinkpad); - gst_element_add_pad (GST_ELEMENT (dec), dec->srcpad); - - dec->adapter = gst_adapter_new (); - - GST_DEBUG_OBJECT (dec, "Init done"); -} - -static void -gst_siren_dec_finalize (GObject * object) -{ - GstSirenDec *dec = GST_SIREN_DEC (object); - - GST_DEBUG_OBJECT (dec, "Finalize"); - - Siren7_CloseDecoder (dec->decoder); - g_object_unref (dec->adapter); - - G_OBJECT_CLASS (parent_class)->finalize (object); } static gboolean -gst_siren_dec_sink_setcaps (GstPad * pad, GstCaps * caps) +gst_siren_dec_start (GstAudioDecoder * dec) +{ + GstSirenDec *sdec = GST_SIREN_DEC (dec); + + GST_DEBUG_OBJECT (dec, "start"); + + sdec->decoder = Siren7_NewDecoder (16000);; + + /* no flushing please */ + gst_audio_decoder_set_drainable (dec, FALSE); + + return TRUE; +} + +static gboolean +gst_siren_dec_stop (GstAudioDecoder * dec) +{ + GstSirenDec *sdec = GST_SIREN_DEC (dec); + + GST_DEBUG_OBJECT (dec, "stop"); + + Siren7_CloseDecoder (sdec->decoder); + + return TRUE; +} + +static gboolean +gst_siren_dec_negotiate (GstSirenDec * dec) { - GstSirenDec *dec; gboolean res; GstCaps *outcaps; - dec = GST_SIREN_DEC (GST_PAD_PARENT (pad)); - outcaps = gst_static_pad_template_get_caps (&srctemplate); - res = gst_pad_set_caps (dec->srcpad, outcaps); + res = gst_pad_set_caps (GST_AUDIO_DECODER_SRC_PAD (dec), outcaps); gst_caps_unref (outcaps); return res; } static gboolean -gst_siren_dec_sink_event (GstPad * pad, GstEvent * event) +gst_siren_dec_set_format (GstAudioDecoder * bdec, GstCaps * caps) { GstSirenDec *dec; - gboolean res; - dec = GST_SIREN_DEC (GST_PAD_PARENT (pad)); + dec = GST_SIREN_DEC (bdec); - switch (GST_EVENT_TYPE (event)) { - case GST_EVENT_EOS: - gst_adapter_clear (dec->adapter); - res = gst_pad_push_event (dec->srcpad, event); - break; - case GST_EVENT_FLUSH_STOP: - gst_adapter_clear (dec->adapter); - res = gst_pad_push_event (dec->srcpad, event); - break; - default: - res = gst_pad_push_event (dec->srcpad, event); - break; - } - return res; + return gst_siren_dec_negotiate (dec); } static GstFlowReturn -gst_siren_dec_chain (GstPad * pad, GstBuffer * buf) +gst_siren_dec_parse (GstAudioDecoder * dec, GstAdapter * adapter, + gint * offset, gint * length) +{ + gint size; + GstFlowReturn ret; + + size = gst_adapter_available (adapter); + g_return_val_if_fail (size > 0, GST_FLOW_ERROR); + + /* accept any multiple of frames */ + if (size > 40) { + ret = GST_FLOW_OK; + *offset = 0; + *length = size - (size % 40); + } else { + ret = GST_FLOW_UNEXPECTED; + } + + return ret; +} + +static GstFlowReturn +gst_siren_dec_handle_frame (GstAudioDecoder * bdec, GstBuffer * buf) { GstSirenDec *dec; GstFlowReturn ret = GST_FLOW_OK; GstBuffer *out_buf; guint8 *in_data, *out_data; - guint8 *to_free = NULL; guint i, size, num_frames; gint out_size, in_size; gint decode_ret; - gboolean discont; - GstClockTime timestamp; - guint64 distance; - GstCaps *outcaps; - dec = GST_SIREN_DEC (GST_PAD_PARENT (pad)); + dec = GST_SIREN_DEC (bdec); - discont = GST_BUFFER_IS_DISCONT (buf); - if (discont) { - GST_DEBUG_OBJECT (dec, "received DISCONT, flush adapter"); - gst_adapter_clear (dec->adapter); - dec->discont = TRUE; - } + size = GST_BUFFER_SIZE (buf); - gst_adapter_push (dec->adapter, buf); + GST_LOG_OBJECT (dec, "Received buffer of size %u", size); - size = gst_adapter_available (dec->adapter); - - GST_LOG_OBJECT (dec, "Received buffer of size %u with adapter of size : %u", - GST_BUFFER_SIZE (buf), size); + g_return_val_if_fail (size % 40 == 0, GST_FLOW_ERROR); + g_return_val_if_fail (size > 0, GST_FLOW_ERROR); /* process 40 input bytes into 640 output bytes */ num_frames = size / 40; - if (num_frames == 0) - goto done; - /* this is the input/output size */ in_size = num_frames * 40; out_size = num_frames * 640; @@ -242,32 +224,19 @@ gst_siren_dec_chain (GstPad * pad, GstBuffer * buf) GST_LOG_OBJECT (dec, "we have %u frames, %u in, %u out", num_frames, in_size, out_size); - /* set output caps when needed */ - if ((outcaps = GST_PAD_CAPS (dec->srcpad)) == NULL) { - outcaps = gst_static_pad_template_get_caps (&srctemplate); - gst_pad_set_caps (dec->srcpad, outcaps); - gst_caps_unref (outcaps); + /* allow and handle un-negotiated input */ + if (G_UNLIKELY (GST_PAD_CAPS (GST_AUDIO_DECODER_SRC_PAD (dec)) == NULL)) { + gst_siren_dec_negotiate (dec); } /* get a buffer */ - ret = gst_pad_alloc_buffer_and_set_caps (dec->srcpad, -1, - out_size, outcaps, &out_buf); + ret = gst_pad_alloc_buffer_and_set_caps (GST_AUDIO_DECODER_SRC_PAD (dec), -1, + out_size, GST_PAD_CAPS (GST_AUDIO_DECODER_SRC_PAD (dec)), &out_buf); if (ret != GST_FLOW_OK) goto alloc_failed; - /* get the timestamp for the output buffer */ - timestamp = gst_adapter_prev_timestamp (dec->adapter, &distance); - - /* add the amount of time taken by the distance, each frame is 20ms */ - if (timestamp != -1) - timestamp += (distance / 40) * FRAME_DURATION; - - GST_LOG_OBJECT (dec, - "timestamp %" GST_TIME_FORMAT ", distance %" G_GUINT64_FORMAT, - GST_TIME_ARGS (timestamp), distance); - /* get the input data for all the frames */ - to_free = in_data = gst_adapter_take (dec->adapter, in_size); + in_data = GST_BUFFER_DATA (buf); out_data = GST_BUFFER_DATA (out_buf); for (i = 0; i < num_frames; i++) { @@ -285,21 +254,11 @@ gst_siren_dec_chain (GstPad * pad, GstBuffer * buf) GST_LOG_OBJECT (dec, "Finished decoding"); - /* mark discont */ - if (dec->discont) { - GST_BUFFER_FLAG_SET (out_buf, GST_BUFFER_FLAG_DISCONT); - dec->discont = FALSE; - } - - GST_BUFFER_TIMESTAMP (out_buf) = timestamp; - GST_BUFFER_DURATION (out_buf) = num_frames * FRAME_DURATION; - - ret = gst_pad_push (dec->srcpad, out_buf); + /* might really be multiple frames, + * but was treated as one for all purposes here */ + ret = gst_audio_decoder_finish_frame (bdec, out_buf, 1); done: - if (to_free) - g_free (to_free); - return ret; /* ERRORS */ @@ -311,41 +270,15 @@ alloc_failed: } decode_error: { - GST_ELEMENT_ERROR (dec, STREAM, DECODE, (NULL), - ("Error decoding frame: %d", decode_ret)); - ret = GST_FLOW_ERROR; + GST_AUDIO_DECODER_ERROR (bdec, 1, STREAM, DECODE, (NULL), + ("Error decoding frame: %d", decode_ret), ret); + if (ret == GST_FLOW_OK) + gst_audio_decoder_finish_frame (bdec, NULL, 1); gst_buffer_unref (out_buf); goto done; } } -static GstStateChangeReturn -gst_siren_change_state (GstElement * element, GstStateChange transition) -{ - GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; - GstSirenDec *dec = GST_SIREN_DEC (element); - - switch (transition) { - case GST_STATE_CHANGE_READY_TO_PAUSED: - dec->discont = 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 (dec->adapter); - break; - default: - break; - } - - return ret; -} - gboolean gst_siren_dec_plugin_init (GstPlugin * plugin) { diff --git a/gst/siren/gstsirendec.h b/gst/siren/gstsirendec.h index 7c020896f8..4c42c4de72 100644 --- a/gst/siren/gstsirendec.h +++ b/gst/siren/gstsirendec.h @@ -24,7 +24,7 @@ #define __GST_SIREN_DEC_H__ #include -#include +#include #include "siren7.h" @@ -48,21 +48,15 @@ typedef struct _GstSirenDecPrivate GstSirenDecPrivate; struct _GstSirenDec { - GstElement parent; + GstAudioDecoder parent; /* Protected by stream lock */ SirenDecoder decoder; - - GstAdapter *adapter; - gboolean discont; - - GstPad *sinkpad; - GstPad *srcpad; }; struct _GstSirenDecClass { - GstElementClass parent_class; + GstAudioDecoderClass parent_class; }; GType gst_siren_dec_get_type (void); From a1b7f84794da2219b604b8410472b4a6d29227cb Mon Sep 17 00:00:00 2001 From: Edward Hervey Date: Tue, 6 Mar 2012 18:11:35 +0100 Subject: [PATCH 072/138] Add missing GLIB_DISABLE_DEPRECATION_WARNINGS Suppress warnings about deprecated threading and GValueArray API, so git compiles with -Werror. --- ext/assrender/gstassrender.c | 3 +++ ext/gme/gstgme.c | 4 ++++ ext/musepack/gstmusepackdec.c | 4 ++++ ext/openal/gstopenalsink.c | 4 ++++ ext/timidity/gstwildmidi.c | 4 ++++ sys/vdpau/gstvdp/gstvdpbufferpool.c | 3 +++ sys/vdpau/gstvdp/gstvdpdevice.c | 4 ++++ sys/vdpau/gstvdpsink.c | 4 ++++ 8 files changed, 30 insertions(+) diff --git a/ext/assrender/gstassrender.c b/ext/assrender/gstassrender.c index b71e8e4d1d..a184a33f58 100644 --- a/ext/assrender/gstassrender.c +++ b/ext/assrender/gstassrender.c @@ -31,6 +31,9 @@ * */ +/* 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_CONFIG_H # include diff --git a/ext/gme/gstgme.c b/ext/gme/gstgme.c index f8a387d43c..00ad589b1a 100644 --- a/ext/gme/gstgme.c +++ b/ext/gme/gstgme.c @@ -18,6 +18,10 @@ * Boston, MA 02111-1307, USA. */ +/* 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_CONFIG_H #include "config.h" #endif diff --git a/ext/musepack/gstmusepackdec.c b/ext/musepack/gstmusepackdec.c index 1d6380c75b..899a4c25a4 100644 --- a/ext/musepack/gstmusepackdec.c +++ b/ext/musepack/gstmusepackdec.c @@ -19,6 +19,10 @@ * Boston, MA 02111-1307, USA. */ +/* 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_CONFIG_H #include "config.h" #endif diff --git a/ext/openal/gstopenalsink.c b/ext/openal/gstopenalsink.c index a169d9e573..9e6bf9a709 100644 --- a/ext/openal/gstopenalsink.c +++ b/ext/openal/gstopenalsink.c @@ -20,6 +20,10 @@ * Boston, MA 02111-1307, USA. */ +/* FIXME 0.11: suppress warnings for deprecated API such as GStaticRecMutex + * with newer GLib versions (>= 2.31.0) */ +#define GLIB_DISABLE_DEPRECATION_WARNINGS + /** * SECTION:element-openalsink * diff --git a/ext/timidity/gstwildmidi.c b/ext/timidity/gstwildmidi.c index e78ecc11c7..287ff54701 100644 --- a/ext/timidity/gstwildmidi.c +++ b/ext/timidity/gstwildmidi.c @@ -38,6 +38,10 @@ * */ +/* 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_CONFIG_H # include #endif diff --git a/sys/vdpau/gstvdp/gstvdpbufferpool.c b/sys/vdpau/gstvdp/gstvdpbufferpool.c index fea8aea4f7..61c706b23b 100644 --- a/sys/vdpau/gstvdp/gstvdpbufferpool.c +++ b/sys/vdpau/gstvdp/gstvdpbufferpool.c @@ -18,6 +18,9 @@ * Boston, MA 02111-1307, USA. */ +/* FIXME 0.11: suppress warnings for deprecated API such as GStaticRecMutex + * with newer GLib versions (>= 2.31.0) */ +#define GLIB_DISABLE_DEPRECATION_WARNINGS #include "gstvdpbufferpool.h" diff --git a/sys/vdpau/gstvdp/gstvdpdevice.c b/sys/vdpau/gstvdp/gstvdpdevice.c index 359874b167..eb5451800a 100644 --- a/sys/vdpau/gstvdp/gstvdpdevice.c +++ b/sys/vdpau/gstvdp/gstvdpdevice.c @@ -18,6 +18,10 @@ * Boston, MA 02111-1307, USA. */ +/* FIXME 0.11: suppress warnings for deprecated API such as GStaticRecMutex + * with newer GLib versions (>= 2.31.0) */ +#define GLIB_DISABLE_DEPRECATION_WARNINGS + #include "gstvdpdevice.h" GST_DEBUG_CATEGORY_STATIC (gst_vdp_device_debug); diff --git a/sys/vdpau/gstvdpsink.c b/sys/vdpau/gstvdpsink.c index 7b9fa2e6ca..27847bd18f 100644 --- a/sys/vdpau/gstvdpsink.c +++ b/sys/vdpau/gstvdpsink.c @@ -18,6 +18,10 @@ * Boston, MA 02111-1307, USA. */ +/* 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_CONFIG_H #include "config.h" #endif From 33e8e137a6c3adf155362c5ea2eaecbc3fd9692b Mon Sep 17 00:00:00 2001 From: Edward Hervey Date: Tue, 6 Mar 2012 18:49:11 +0100 Subject: [PATCH 073/138] video: Update/add docs --- docs/libs/gst-plugins-bad-libs-sections.txt | 20 ++++--- gst-libs/gst/video/gstbasevideocodec.c | 29 ++++++++++ gst-libs/gst/video/gstbasevideocodec.h | 62 ++++++++++++++++----- gst-libs/gst/video/gstbasevideodecoder.c | 24 ++++++-- gst-libs/gst/video/gstbasevideodecoder.h | 13 +++-- gst-libs/gst/video/gstbasevideoencoder.c | 17 +++++- gst-libs/gst/video/gstbasevideoencoder.h | 11 ++-- 7 files changed, 139 insertions(+), 37 deletions(-) diff --git a/docs/libs/gst-plugins-bad-libs-sections.txt b/docs/libs/gst-plugins-bad-libs-sections.txt index b949137dfe..3cdf1a465c 100644 --- a/docs/libs/gst-plugins-bad-libs-sections.txt +++ b/docs/libs/gst-plugins-bad-libs-sections.txt @@ -294,6 +294,7 @@ gst_base_video_encoder_get_oldest_frame gst_base_video_encoder_finish_frame gst_base_video_encoder_set_latency gst_base_video_encoder_set_latency_fields +gst_base_video_encoder_set_headers GST_BASE_VIDEO_ENCODER GST_IS_BASE_VIDEO_ENCODER @@ -326,6 +327,7 @@ gst_base_video_decoder_alloc_src_buffer gst_base_video_decoder_alloc_src_frame gst_base_video_decoder_get_state gst_base_video_decoder_get_max_decode_time +gst_base_video_decoder_drop_frame gst_base_video_decoder_finish_frame GST_BASE_VIDEO_DECODER @@ -336,10 +338,17 @@ GST_BASE_VIDEO_DECODER_CLASS GST_IS_BASE_VIDEO_DECODER_CLASS GST_BASE_VIDEO_DECODER_GET_CLASS - +yes
gstbasevideocodec GstBaseVideoCodec +GstBaseVideoCodec +GstVideoFrame +gst_video_frame_ref +gst_video_frame_unref +gst_base_video_codec_new_frame +GstVideoState +gst_video_state_get_timestamp GST_BASE_VIDEO_CODEC_SINK_NAME GST_BASE_VIDEO_CODEC_SRC_NAME GST_BASE_VIDEO_CODEC_SRC_PAD @@ -347,13 +356,8 @@ GST_BASE_VIDEO_CODEC_SINK_PAD GST_BASE_VIDEO_CODEC_FLOW_NEED_DATA GST_BASE_VIDEO_CODEC_STREAM_LOCK GST_BASE_VIDEO_CODEC_STREAM_UNLOCK -GstVideoState -GstVideoFrame -GstBaseVideoCodec -GstBaseVideoCodecClass -gst_base_video_codec_new_frame -gst_base_video_codec_free_frame +GstBaseVideoCodecClass GST_BASE_VIDEO_CODEC GST_IS_BASE_VIDEO_CODEC GST_TYPE_BASE_VIDEO_CODEC @@ -361,6 +365,7 @@ gst_base_video_codec_get_type GST_BASE_VIDEO_CODEC_CLASS GST_IS_BASE_VIDEO_CODEC_CLASS GST_BASE_VIDEO_CODEC_GET_CLASS +gst_video_frame_get_type
@@ -437,7 +442,6 @@ gst_camerabin_preview_set_caps gstbasevideoutils gst_base_video_rawvideo_convert gst_base_video_encoded_video_convert -gst_video_state_get_timestamp
diff --git a/gst-libs/gst/video/gstbasevideocodec.c b/gst-libs/gst/video/gstbasevideocodec.c index 9bdee5936f..cae94ab11e 100644 --- a/gst-libs/gst/video/gstbasevideocodec.c +++ b/gst-libs/gst/video/gstbasevideocodec.c @@ -21,6 +21,12 @@ #include "config.h" #endif +/** + * SECTION:gstbasevideocodec + * @short_description: Base class for video codecs + * @see_also: #GstBaseVideoDecoder , #GstBaseVideoEncoder + */ + /* FIXME 0.11: suppress warnings for deprecated API such as GStaticRecMutex * with newer GLib versions (>= 2.31.0) */ #define GLIB_DISABLE_DEPRECATION_WARNINGS @@ -189,6 +195,14 @@ gst_base_video_codec_change_state (GstElement * element, return ret; } +/** + * gst_base_video_codec_new_frame: + * @base_video_codec: a #GstBaseVideoCodec + * + * Create a new blank #GstVideoFrame. + * + * Returns: (transfer full): a new #GstVideoFrame + */ GstVideoFrame * gst_base_video_codec_new_frame (GstBaseVideoCodec * base_video_codec) { @@ -231,6 +245,14 @@ _gst_video_frame_free (GstVideoFrame * frame) g_slice_free (GstVideoFrame, frame); } +/** + * gst_video_frame_ref: + * @frame: a #GstVideoFrame + * + * Increases the refcount of the given frame by one. + * + * Returns: @buf + */ GstVideoFrame * gst_video_frame_ref (GstVideoFrame * frame) { @@ -241,6 +263,13 @@ gst_video_frame_ref (GstVideoFrame * frame) return frame; } +/** + * gst_video_frame_unref: + * @frame: a #GstVideoFrame + * + * Decreases the refcount of the frame. If the refcount reaches 0, the frame + * will be freed. + */ void gst_video_frame_unref (GstVideoFrame * frame) { diff --git a/gst-libs/gst/video/gstbasevideocodec.h b/gst-libs/gst/video/gstbasevideocodec.h index 7a76f9d12a..de5d3fe72b 100644 --- a/gst-libs/gst/video/gstbasevideocodec.h +++ b/gst-libs/gst/video/gstbasevideocodec.h @@ -76,10 +76,27 @@ G_BEGIN_DECLS /** * GST_BASE_VIDEO_CODEC_FLOW_NEED_DATA: * + * Returned while parsing to indicate more data is needed. */ #define GST_BASE_VIDEO_CODEC_FLOW_NEED_DATA GST_FLOW_CUSTOM_SUCCESS +/** + * GST_BASE_VIDEO_CODEC_STREAM_LOCK: + * @codec: video codec instance + * + * Obtain a lock to protect the codec function from concurrent access. + * + * Since: 0.10.22 + */ #define GST_BASE_VIDEO_CODEC_STREAM_LOCK(codec) g_static_rec_mutex_lock (&GST_BASE_VIDEO_CODEC (codec)->stream_lock) +/** + * GST_BASE_VIDEO_CODEC_STREAM_UNLOCK: + * @codec: video codec instance + * + * Release the lock that protects the codec function from concurrent access. + * + * Since: 0.10.22 + */ #define GST_BASE_VIDEO_CODEC_STREAM_UNLOCK(codec) g_static_rec_mutex_unlock (&GST_BASE_VIDEO_CODEC (codec)->stream_lock) typedef struct _GstVideoState GstVideoState; @@ -87,6 +104,10 @@ typedef struct _GstVideoFrame GstVideoFrame; typedef struct _GstBaseVideoCodec GstBaseVideoCodec; typedef struct _GstBaseVideoCodecClass GstBaseVideoCodecClass; +/** + * GstVideoState: + * @caps: The caps + */ struct _GstVideoState { GstCaps *caps; @@ -147,38 +168,51 @@ struct _GstVideoFrame GList *events; }; +/** + * GstBaseVideoCodec: + * + * The opaque #GstBaseVideoCodec data structure. + */ struct _GstBaseVideoCodec { - GstElement element; - /*< private >*/ - GstPad *sinkpad; - GstPad *srcpad; + GstElement element; + + /*< protected >*/ + GstPad *sinkpad; + GstPad *srcpad; /* protects all data processing, i.e. is locked * in the chain function, finish_frame and when * processing serialized events */ GStaticRecMutex stream_lock; - guint64 system_frame_number; + guint64 system_frame_number; - GList *frames; /* Protected with OBJECT_LOCK */ - GstVideoState state; - GstSegment segment; + GList *frames; /* Protected with OBJECT_LOCK */ + GstVideoState state; + GstSegment segment; - gdouble proportion; - GstClockTime earliest_time; - gboolean discont; + /* QoS properties */ + gdouble proportion; + GstClockTime earliest_time; + gboolean discont; - gint64 bytes; - gint64 time; + gint64 bytes; + gint64 time; /* FIXME before moving to base */ - void *padding[GST_PADDING_LARGE]; + void *padding[GST_PADDING_LARGE]; }; +/** + * GstBaseVideoCodecClass: + * + * The opaque #GstBaseVideoCodecClass data structure. + */ struct _GstBaseVideoCodecClass { + /*< private >*/ GstElementClass element_class; /* FIXME before moving to base */ diff --git a/gst-libs/gst/video/gstbasevideodecoder.c b/gst-libs/gst/video/gstbasevideodecoder.c index dab7ae898a..dc4549820f 100644 --- a/gst-libs/gst/video/gstbasevideodecoder.c +++ b/gst-libs/gst/video/gstbasevideodecoder.c @@ -1690,7 +1690,7 @@ done: } /** - * gst_base_video_decoder_finish_frame: + * gst_base_video_decoder_add_to_frame: * @base_video_decoder: a #GstBaseVideoDecoder * @n_bytes: an encoded #GstVideoFrame * @@ -1886,11 +1886,15 @@ exit: * gst_base_video_decoder_get_state: * @base_video_decoder: a #GstBaseVideoDecoder * + * Get the current #GstVideoState + * * Returns: #GstVideoState describing format of video data. */ GstVideoState * gst_base_video_decoder_get_state (GstBaseVideoDecoder * base_video_decoder) { + /* FIXME : Move to base codec class */ + return &GST_BASE_VIDEO_CODEC (base_video_decoder)->state; } @@ -1939,6 +1943,8 @@ gst_base_video_decoder_set_sync_point (GstBaseVideoDecoder * base_video_decoder) * gst_base_video_decoder_get_oldest_frame: * @base_video_decoder: a #GstBaseVideoDecoder * + * Get the oldest pending unfinished #GstVideoFrame + * * Returns: oldest pending unfinished #GstVideoFrame. */ GstVideoFrame * @@ -1947,6 +1953,8 @@ gst_base_video_decoder_get_oldest_frame (GstBaseVideoDecoder * { GList *g; + /* FIXME : Move to base codec class */ + GST_BASE_VIDEO_CODEC_STREAM_LOCK (base_video_decoder); g = g_list_first (GST_BASE_VIDEO_CODEC (base_video_decoder)->frames); GST_BASE_VIDEO_CODEC_STREAM_UNLOCK (base_video_decoder); @@ -1961,6 +1969,8 @@ gst_base_video_decoder_get_oldest_frame (GstBaseVideoDecoder * * @base_video_decoder: a #GstBaseVideoDecoder * @frame_number: system_frame_number of a frame * + * Get a pending unfinished #GstVideoFrame + * * Returns: pending unfinished #GstVideoFrame identified by @frame_number. */ GstVideoFrame * @@ -1991,6 +2001,7 @@ gst_base_video_decoder_get_frame (GstBaseVideoDecoder * base_video_decoder, * * Sets src pad caps according to currently configured #GstVideoState. * + * Returns: #TRUE if the caps were accepted downstream, else #FALSE. */ gboolean gst_base_video_decoder_set_src_caps (GstBaseVideoDecoder * base_video_decoder) @@ -2042,11 +2053,11 @@ gst_base_video_decoder_set_src_caps (GstBaseVideoDecoder * base_video_decoder) * gst_base_video_decoder_alloc_src_buffer: * @base_video_decoder: a #GstBaseVideoDecoder * - * Helper function that uses gst_pad_alloc_buffer_and_set_caps + * Helper function that uses @gst_pad_alloc_buffer_and_set_caps() * to allocate a buffer to hold a video frame for @base_video_decoder's * current #GstVideoState. * - * Returns: allocated buffer + * Returns: (transfer full): allocated buffer */ GstBuffer * gst_base_video_decoder_alloc_src_buffer (GstBaseVideoDecoder * @@ -2075,6 +2086,7 @@ gst_base_video_decoder_alloc_src_buffer (GstBaseVideoDecoder * } GST_BASE_VIDEO_CODEC_STREAM_UNLOCK (base_video_decoder); + return buffer; } @@ -2083,7 +2095,7 @@ gst_base_video_decoder_alloc_src_buffer (GstBaseVideoDecoder * * @base_video_decoder: a #GstBaseVideoDecoder * @frame: a #GstVideoFrame * - * Helper function that uses gst_pad_alloc_buffer_and_set_caps + * Helper function that uses @gst_pad_alloc_buffer_and_set_caps() * to allocate a buffer to hold a video frame for @base_video_decoder's * current #GstVideoState. Subclass should already have configured video state * and set src pad caps. @@ -2158,8 +2170,10 @@ gst_base_video_decoder_get_max_decode_time (GstBaseVideoDecoder * } /** - * gst_base_video_decoder_get_oldest_frame: + * gst_base_video_decoder_class_set_capture_pattern: * @base_video_decoder_class: a #GstBaseVideoDecoderClass + * @mask: The mask used for scanning + * @pattern: The pattern used for matching * * Sets the mask and pattern that will be scanned for to obtain parse sync. * Note that a non-zero @mask implies that @scan_for_sync will be ignored. diff --git a/gst-libs/gst/video/gstbasevideodecoder.h b/gst-libs/gst/video/gstbasevideodecoder.h index a3b81fe44b..21d757a5eb 100644 --- a/gst-libs/gst/video/gstbasevideodecoder.h +++ b/gst-libs/gst/video/gstbasevideodecoder.h @@ -95,7 +95,7 @@ GstFlowReturn _gst_base_video_decoder_error (GstBaseVideoDecoder *dec, gint weig * enclosed in parentheses) * @ret: variable to receive return value * - * Utility function that audio decoder elements can use in case they encountered + * Utility function that video decoder elements can use in case they encountered * a data processing error that may be fatal for the current "data unit" but * need not prevent subsequent decoding. Such errors are counted and if there * are too many, as configured in the context's max_errors, the pipeline will @@ -104,7 +104,7 @@ GstFlowReturn _gst_base_video_decoder_error (GstBaseVideoDecoder *dec, gint weig * is logged. In either case, @ret is set to the proper value to * return to upstream/caller (indicating either GST_FLOW_ERROR or GST_FLOW_OK). */ -#define GST_BASE_AUDIO_DECODER_ERROR(el, w, domain, code, text, debug, ret) \ +#define GST_BASE_VIDEO_DECODER_ERROR(el, w, domain, code, text, debug, ret) \ G_STMT_START { \ gchar *__txt = _gst_element_error_printf text; \ gchar *__dbg = _gst_element_error_printf debug; \ @@ -122,6 +122,7 @@ G_STMT_START { \ */ struct _GstBaseVideoDecoder { + /*< private >*/ GstBaseVideoCodec base_video_codec; /*< protected >*/ @@ -220,8 +221,10 @@ struct _GstBaseVideoDecoder */ struct _GstBaseVideoDecoderClass { + /*< private >*/ GstBaseVideoCodecClass base_video_codec_class; + /*< public >*/ gboolean (*start) (GstBaseVideoDecoder *coder); gboolean (*stop) (GstBaseVideoDecoder *coder); @@ -248,12 +251,12 @@ struct _GstBaseVideoDecoderClass void *padding[GST_PADDING_LARGE]; }; -void gst_base_video_decoder_class_set_capture_pattern (GstBaseVideoDecoderClass *klass, +void gst_base_video_decoder_class_set_capture_pattern (GstBaseVideoDecoderClass *base_video_decoder_class, guint32 mask, guint32 pattern); -GstVideoFrame *gst_base_video_decoder_get_frame (GstBaseVideoDecoder *coder, +GstVideoFrame *gst_base_video_decoder_get_frame (GstBaseVideoDecoder *base_video_decoder, int frame_number); -GstVideoFrame *gst_base_video_decoder_get_oldest_frame (GstBaseVideoDecoder *coder); +GstVideoFrame *gst_base_video_decoder_get_oldest_frame (GstBaseVideoDecoder *base_video_decoder); void gst_base_video_decoder_add_to_frame (GstBaseVideoDecoder *base_video_decoder, int n_bytes); diff --git a/gst-libs/gst/video/gstbasevideoencoder.c b/gst-libs/gst/video/gstbasevideoencoder.c index d643e72790..50ed82ad98 100644 --- a/gst-libs/gst/video/gstbasevideoencoder.c +++ b/gst-libs/gst/video/gstbasevideoencoder.c @@ -264,6 +264,13 @@ gst_base_video_encoder_init (GstBaseVideoEncoder * base_video_encoder, base_video_encoder->sink_clipping = TRUE; } +/** + * gst_base_video_encoder_set_headers: + * @base_video_encoder: a #GstBaseVideoEncoder + * @headers: (transfer full): the #GstBuffer containing the codec header + * + * Set the codec headers to be sent downstream whenever requested. + */ void gst_base_video_encoder_set_headers (GstBaseVideoEncoder * base_video_encoder, GstBuffer * headers) @@ -1131,11 +1138,15 @@ done: * gst_base_video_encoder_get_state: * @base_video_encoder: a #GstBaseVideoEncoder * + * Get the current #GstVideoState + * * Returns: #GstVideoState describing format of video data. */ const GstVideoState * gst_base_video_encoder_get_state (GstBaseVideoEncoder * base_video_encoder) { + /* FIXME : Move to base codec class */ + return &GST_BASE_VIDEO_CODEC (base_video_encoder)->state; } @@ -1166,7 +1177,7 @@ gst_base_video_encoder_set_latency (GstBaseVideoEncoder * base_video_encoder, /** * gst_base_video_encoder_set_latency_fields: * @base_video_encoder: a #GstBaseVideoEncoder - * @fields: latency in fields + * @n_fields: latency in fields * * Informs baseclass of encoding latency in terms of fields (both min * and max latency). @@ -1193,6 +1204,8 @@ gst_base_video_encoder_set_latency_fields (GstBaseVideoEncoder * * gst_base_video_encoder_get_oldest_frame: * @base_video_encoder: a #GstBaseVideoEncoder * + * Get the oldest unfinished pending #GstVideoFrame + * * Returns: oldest unfinished pending #GstVideoFrame */ GstVideoFrame * @@ -1201,6 +1214,8 @@ gst_base_video_encoder_get_oldest_frame (GstBaseVideoEncoder * { GList *g; + /* FIXME : Move to base codec class */ + GST_BASE_VIDEO_CODEC_STREAM_LOCK (base_video_encoder); g = g_list_first (GST_BASE_VIDEO_CODEC (base_video_encoder)->frames); GST_BASE_VIDEO_CODEC_STREAM_UNLOCK (base_video_encoder); diff --git a/gst-libs/gst/video/gstbasevideoencoder.h b/gst-libs/gst/video/gstbasevideoencoder.h index 6e2aa7095c..4fad71b6cb 100644 --- a/gst-libs/gst/video/gstbasevideoencoder.h +++ b/gst-libs/gst/video/gstbasevideoencoder.h @@ -70,12 +70,12 @@ typedef struct _GstBaseVideoEncoderClass GstBaseVideoEncoderClass; /** * GstBaseVideoEncoder: - * @element: the parent element. * * The opaque #GstBaseVideoEncoder data structure. */ struct _GstBaseVideoEncoder { + /*< private >*/ GstBaseVideoCodec base_video_codec; /*< protected >*/ @@ -115,6 +115,8 @@ struct _GstBaseVideoEncoder * GstVideoState fields have already been * set according to provided caps. * @handle_frame: Provides input frame to subclass. + * @reset: Optional. + * Allows subclass (codec) to perform post-seek semantics reset. * @finish: Optional. * Called to request subclass to dispatch any pending remaining * data (e.g. at EOS). @@ -133,6 +135,7 @@ struct _GstBaseVideoEncoder */ struct _GstBaseVideoEncoderClass { + /*< private >*/ GstBaseVideoCodecClass base_video_codec_class; /*< public >*/ @@ -164,9 +167,9 @@ struct _GstBaseVideoEncoderClass GType gst_base_video_encoder_get_type (void); -const GstVideoState* gst_base_video_encoder_get_state (GstBaseVideoEncoder *coder); +const GstVideoState* gst_base_video_encoder_get_state (GstBaseVideoEncoder *base_video_encoder); -GstVideoFrame* gst_base_video_encoder_get_oldest_frame (GstBaseVideoEncoder *coder); +GstVideoFrame* gst_base_video_encoder_get_oldest_frame (GstBaseVideoEncoder *base_video_encoder); GstFlowReturn gst_base_video_encoder_finish_frame (GstBaseVideoEncoder *base_video_encoder, GstVideoFrame *frame); @@ -175,7 +178,7 @@ void gst_base_video_encoder_set_latency (GstBaseVideoEncoder * void gst_base_video_encoder_set_latency_fields (GstBaseVideoEncoder *base_video_encoder, int n_fields); void gst_base_video_encoder_set_headers (GstBaseVideoEncoder *base_video_encoder, - GstBuffer *headers); + GstBuffer *headers); G_END_DECLS #endif From db0aa7f0567435b14011750c02b0dcfd12cceb65 Mon Sep 17 00:00:00 2001 From: Mark Nauwelaerts Date: Wed, 7 Mar 2012 12:55:43 +0100 Subject: [PATCH 074/138] opusenc: configure baseclass requested samples really in samples ... as opposed to bytes. --- ext/opus/gstopusenc.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/ext/opus/gstopusenc.c b/ext/opus/gstopusenc.c index 29b254ee23..a87e08b3f7 100644 --- a/ext/opus/gstopusenc.c +++ b/ext/opus/gstopusenc.c @@ -382,10 +382,8 @@ gst_opus_enc_setup_base_class (GstOpusEnc * enc, GstAudioEncoder * benc) { gst_audio_encoder_set_latency (benc, gst_opus_enc_get_latency (enc), gst_opus_enc_get_latency (enc)); - gst_audio_encoder_set_frame_samples_min (benc, - enc->frame_samples * enc->n_channels * 2); - gst_audio_encoder_set_frame_samples_max (benc, - enc->frame_samples * enc->n_channels * 2); + gst_audio_encoder_set_frame_samples_min (benc, enc->frame_samples); + gst_audio_encoder_set_frame_samples_max (benc, enc->frame_samples); gst_audio_encoder_set_frame_max (benc, 0); } From 228d8808fe6f8aa7390b73d2b248b3a8f092eb9e Mon Sep 17 00:00:00 2001 From: Mark Nauwelaerts Date: Wed, 7 Mar 2012 12:59:28 +0100 Subject: [PATCH 075/138] opusenc: only request and process 1 frame at a time ... since it is specified in _finish_frame that input buffer may be invalidated after calling it, and is as such not reliably available for further encoding. Also, requesting or allowing several frames is only useful if subclass intends to process these "in 1 run" (as in, 1 output buffer), not for having another (inner) loop in subclass where the baseclass one will do just fine. --- ext/opus/gstopusenc.c | 72 +++++++++++++++++++------------------------ 1 file changed, 32 insertions(+), 40 deletions(-) diff --git a/ext/opus/gstopusenc.c b/ext/opus/gstopusenc.c index a87e08b3f7..6a19ffd89f 100644 --- a/ext/opus/gstopusenc.c +++ b/ext/opus/gstopusenc.c @@ -384,7 +384,7 @@ gst_opus_enc_setup_base_class (GstOpusEnc * enc, GstAudioEncoder * benc) gst_opus_enc_get_latency (enc), gst_opus_enc_get_latency (enc)); gst_audio_encoder_set_frame_samples_min (benc, enc->frame_samples); gst_audio_encoder_set_frame_samples_max (benc, enc->frame_samples); - gst_audio_encoder_set_frame_max (benc, 0); + gst_audio_encoder_set_frame_max (benc, 1); } static gint @@ -792,6 +792,8 @@ gst_opus_enc_encode (GstOpusEnc * enc, GstBuffer * buf) gsize bsize, size; gsize bytes; gint ret = GST_FLOW_OK; + gint outsize; + GstBuffer *outbuf; g_mutex_lock (enc->property_lock); @@ -816,52 +818,42 @@ gst_opus_enc_encode (GstOpusEnc * enc, GstBuffer * buf) goto done; } + g_assert (size == bytes); - while (size) { - gint outsize; - GstBuffer *outbuf; + ret = gst_pad_alloc_buffer_and_set_caps (GST_AUDIO_ENCODER_SRC_PAD (enc), + GST_BUFFER_OFFSET_NONE, enc->max_payload_size * enc->n_channels, + GST_PAD_CAPS (GST_AUDIO_ENCODER_SRC_PAD (enc)), &outbuf); - ret = gst_pad_alloc_buffer_and_set_caps (GST_AUDIO_ENCODER_SRC_PAD (enc), - GST_BUFFER_OFFSET_NONE, enc->max_payload_size * enc->n_channels, - GST_PAD_CAPS (GST_AUDIO_ENCODER_SRC_PAD (enc)), &outbuf); + if (GST_FLOW_OK != ret) + goto done; - if (GST_FLOW_OK != ret) - goto done; + GST_DEBUG_OBJECT (enc, "encoding %d samples (%d bytes)", + enc->frame_samples, (int) bytes); - GST_DEBUG_OBJECT (enc, "encoding %d samples (%d bytes)", - enc->frame_samples, (int) bytes); + outsize = + opus_multistream_encode (enc->state, (const gint16 *) data, + enc->frame_samples, GST_BUFFER_DATA (outbuf), + enc->max_payload_size * enc->n_channels); - outsize = - opus_multistream_encode (enc->state, (const gint16 *) data, - enc->frame_samples, GST_BUFFER_DATA (outbuf), - enc->max_payload_size * enc->n_channels); - - if (outsize < 0) { - GST_ERROR_OBJECT (enc, "Encoding failed: %d", outsize); - ret = GST_FLOW_ERROR; - goto done; - } else if (outsize > enc->max_payload_size) { - GST_WARNING_OBJECT (enc, - "Encoded size %d is higher than max payload size (%d bytes)", - outsize, enc->max_payload_size); - ret = GST_FLOW_ERROR; - goto done; - } - - GST_DEBUG_OBJECT (enc, "Output packet is %u bytes", outsize); - GST_BUFFER_SIZE (outbuf) = outsize; - - ret = - gst_audio_encoder_finish_frame (GST_AUDIO_ENCODER (enc), outbuf, - enc->frame_samples); - - if ((GST_FLOW_OK != ret) && (GST_FLOW_NOT_LINKED != ret)) - goto done; - - data += bytes; - size -= bytes; + if (outsize < 0) { + GST_ERROR_OBJECT (enc, "Encoding failed: %d", outsize); + ret = GST_FLOW_ERROR; + goto done; + } else if (outsize > enc->max_payload_size) { + GST_WARNING_OBJECT (enc, + "Encoded size %d is higher than max payload size (%d bytes)", + outsize, enc->max_payload_size); + ret = GST_FLOW_ERROR; + goto done; } + GST_DEBUG_OBJECT (enc, "Output packet is %u bytes", outsize); + GST_BUFFER_SIZE (outbuf) = outsize; + + ret = + gst_audio_encoder_finish_frame (GST_AUDIO_ENCODER (enc), outbuf, + enc->frame_samples); + done: g_mutex_unlock (enc->property_lock); From 35df907f93e004c8cc04e4972011b4ddeb492799 Mon Sep 17 00:00:00 2001 From: Danilo Cesar Lemes de Paula Date: Thu, 1 Mar 2012 14:59:55 -0300 Subject: [PATCH 076/138] Fixing rtpvp8 compatibility with the third draft https://bugzilla.gnome.org/show_bug.cgi?id=671073 --- gst/rtpvp8/gstrtpvp8depay.c | 4 ++-- gst/rtpvp8/gstrtpvp8pay.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/gst/rtpvp8/gstrtpvp8depay.c b/gst/rtpvp8/gstrtpvp8depay.c index 74d13b5aea..6f4a7b029e 100644 --- a/gst/rtpvp8/gstrtpvp8depay.c +++ b/gst/rtpvp8/gstrtpvp8depay.c @@ -154,8 +154,8 @@ gst_rtp_vp8_depay_process (GstBaseRTPDepayload * depay, GstBuffer * buf) /* Check L optional header */ if ((data[1] & 0x40) != 0) offset++; - /* Check T optional header */ - if ((data[1] & 0x20) != 0) + /* Check T or K optional headers */ + if ((data[1] & 0x20) != 0 || (data[1] & 0x10) != 0) offset++; } diff --git a/gst/rtpvp8/gstrtpvp8pay.c b/gst/rtpvp8/gstrtpvp8pay.c index 82dceeb121..7d4c1f5366 100644 --- a/gst/rtpvp8/gstrtpvp8pay.c +++ b/gst/rtpvp8/gstrtpvp8pay.c @@ -317,7 +317,7 @@ gst_rtp_vp8_create_header_buffer (GstRtpVP8Pay * self, guint8 partid, if (self->picture_id_mode != VP8_PAY_NO_PICTURE_ID) { /* Enable X=1 */ p[0] |= 0x80; - /* X: I=1,L=0,T=0,RSVA=0 */ + /* X: I=1,L=0,T=0,K=0,RSV=0 */ p[1] = 0x80; if (self->picture_id_mode == VP8_PAY_PICTURE_ID_7BITS) { /* I: 7 bit picture_id */ From b2deaadd0a3e787aef7efedba7b8ea5bae2c01ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Fri, 9 Mar 2012 17:16:24 +0000 Subject: [PATCH 077/138] configure: fix AC_LANG_SOURCE-related warnings when doing autogen.sh --- common | 2 +- configure.ac | 33 +++++++++------------------------ 2 files changed, 10 insertions(+), 25 deletions(-) diff --git a/common b/common index 7604bab58b..4b51fb8ae1 160000 --- a/common +++ b/common @@ -1 +1 @@ -Subproject commit 7604bab58b5dfc9370d506952f0407fb75c00388 +Subproject commit 4b51fb8ae1a8e2019010305cc96c8397dc68000d diff --git a/configure.ac b/configure.ac index 96c8849188..b4993f95dd 100644 --- a/configure.ac +++ b/configure.ac @@ -437,19 +437,14 @@ AG_GST_CHECK_FEATURE(DIRECTSOUND, [DirectSound], directsoundsrc, [ LDFLAGS="$LDFLAGS $DIRECTX_LDFLAGS" LIBS="$LIBS -ldsound -ldxerr9 -luser32" AC_MSG_CHECKING(for DirectSound LDFLAGS) - AC_LINK_IFELSE([ + AC_LINK_IFELSE([AC_LANG_PROGRAM([[ #include #include #include - -int main () -{ +]], [[ DXGetErrorString9 (0); DirectSoundCreate(NULL, NULL, NULL); - - return 0; -} -], +]])], [HAVE_DIRECTSOUND="yes"], [HAVE_DIRECTSOUND="no"]) AC_MSG_RESULT($HAVE_DIRECTSOUND) @@ -478,17 +473,12 @@ AG_GST_CHECK_FEATURE(DIRECT3D, [Direct3D plug-in], direct3dsink, [ LDFLAGS="$LDFLAGS $DIRECTX_LDFLAGS" LIBS="$LIBS -ld3d9 -lgdi32" AC_MSG_CHECKING(for Direct3D LDFLAGS) - AC_LINK_IFELSE([ + AC_LINK_IFELSE([AC_LANG_PROGRAM([[ #include #include - -int main () -{ +]], [[ Direct3DCreate9(D3D_SDK_VERSION); - - return 0; -} -], +]])], [HAVE_DIRECT3D="yes"], [HAVE_DIRECT3D="no"]) AC_MSG_RESULT($HAVE_DIRECT3D) @@ -514,18 +504,13 @@ AG_GST_CHECK_FEATURE(DIRECTDRAW, [DirectDraw plug-in], directdrawsink, [ LDFLAGS="$LDFLAGS $DIRECTX_LDFLAGS" LIBS="$LIBS -lddraw -lgdi32" AC_MSG_CHECKING(for DirectDraw LDFLAGS) - AC_LINK_IFELSE([ + AC_LINK_IFELSE([AC_LANG_PROGRAM([[ #include #include - -int main () -{ +]], [[ GetStockObject(0); DirectDrawCreate(NULL, NULL, NULL); - - return 0; -} -], +]])], [HAVE_DIRECTDRAW="yes"], [HAVE_DIRECTDRAW="no"]) AC_MSG_RESULT($HAVE_DIRECTDRAW) From a7eda9ed4942e24f0a3971c3591af54cc4cd9a5b Mon Sep 17 00:00:00 2001 From: Mark Nauwelaerts Date: Sat, 10 Mar 2012 11:36:25 +0100 Subject: [PATCH 078/138] dtsdec: avoid runaway loop when resyncing during parse ... by checking for the correct (decremented) size variable. Fixes #671756. --- ext/dts/gstdtsdec.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/dts/gstdtsdec.c b/ext/dts/gstdtsdec.c index d589901c2c..0455ab0cab 100644 --- a/ext/dts/gstdtsdec.c +++ b/ext/dts/gstdtsdec.c @@ -286,7 +286,7 @@ gst_dtsdec_parse (GstAudioDecoder * bdec, GstAdapter * adapter, bit_rate = dts->bit_rate; sample_rate = dts->sample_rate; flags = 0; - while (av >= 7) { + while (size >= 7) { length = dca_syncinfo (dts->state, data, &flags, &sample_rate, &bit_rate, &frame_length); From 20669d461a4953eb5ed01374d5ab628b4dc73b64 Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Sat, 10 Mar 2012 19:10:52 -0300 Subject: [PATCH 079/138] Fix 'ignoring return value of function declared with const attribute' This always happens with GstByteReader/Writer and friends when not taking into account returned boolean of the _read/_write functions (which is actually wrong). Make use of the *_unchecked variant as much as possible, or take the returned value into account. --- gst-libs/gst/codecparsers/gsth264parser.c | 3 +- gst-libs/gst/codecparsers/gstmpeg4parser.c | 4 +-- .../gst/codecparsers/gstmpegvideoparser.c | 18 +++++++--- gst-libs/gst/codecparsers/gstvc1parser.c | 2 +- gst/aiff/aiffmux.c | 33 +++++++++++-------- gst/h264parse/gsth264parse.c | 18 +++++----- gst/jp2kdecimator/jp2kcodestream.c | 14 +++++--- gst/mxf/mxfmpeg.c | 24 +++++++------- gst/videoparsers/gsth263parse.c | 13 ++++---- gst/videoparsers/gsth264parse.c | 16 ++++----- sys/vdpau/h264/gstvdph264dec.c | 20 ++++++----- sys/vdpau/mpeg/gstvdpmpegdec.c | 11 ++++--- 12 files changed, 97 insertions(+), 79 deletions(-) diff --git a/gst-libs/gst/codecparsers/gsth264parser.c b/gst-libs/gst/codecparsers/gsth264parser.c index efb4c739db..00c1517996 100644 --- a/gst-libs/gst/codecparsers/gsth264parser.c +++ b/gst-libs/gst/codecparsers/gsth264parser.c @@ -1309,7 +1309,8 @@ gst_h264_parser_identify_nalu_avc (GstH264NalParser * nalparser, size = size - offset; gst_bit_reader_init (&br, data + offset, size); - gst_bit_reader_get_bits_uint32 (&br, &nalu->size, nal_length_size * 8); + nalu->size = gst_bit_reader_get_bits_uint32_unchecked (&br, + nal_length_size * 8); nalu->sc_offset = offset; nalu->offset = offset + nal_length_size; diff --git a/gst-libs/gst/codecparsers/gstmpeg4parser.c b/gst-libs/gst/codecparsers/gstmpeg4parser.c index 4b0acb6b59..1166b872f4 100644 --- a/gst-libs/gst/codecparsers/gstmpeg4parser.c +++ b/gst-libs/gst/codecparsers/gstmpeg4parser.c @@ -277,7 +277,7 @@ find_psc (GstByteReader * br) psc_pos = gst_byte_reader_get_pos (br); break; } else - gst_byte_reader_skip (br, 1); + gst_byte_reader_skip_unchecked (br, 1); } failed: @@ -543,7 +543,7 @@ gst_h263_parse (GstMpeg4Packet * packet, packet->offset = off1 + offset; packet->data = data; - gst_byte_reader_skip (&br, 3); + gst_byte_reader_skip_unchecked (&br, 3); off2 = find_psc (&br); if (off2 == -1) { diff --git a/gst-libs/gst/codecparsers/gstmpegvideoparser.c b/gst-libs/gst/codecparsers/gstmpegvideoparser.c index b725d9d353..2767517f11 100644 --- a/gst-libs/gst/codecparsers/gstmpegvideoparser.c +++ b/gst-libs/gst/codecparsers/gstmpegvideoparser.c @@ -97,9 +97,8 @@ find_start_code (GstBitReader * b) while (gst_bit_reader_peek_bits_uint32 (b, &bits, 32)) { if (bits >> 8 == 0x1) { return TRUE; - } else { - gst_bit_reader_skip (b, 8); - } + } else if (!gst_bit_reader_skip (b, 8) == FALSE) + break; } return FALSE; @@ -324,10 +323,13 @@ gst_mpeg_video_parse (const guint8 * data, gsize size, guint offset) while (off >= 0 && off + 3 < size) { GstMpegVideoTypeOffsetSize *codoffsize; - gst_byte_reader_skip (&br, off + 3); + + if (gst_byte_reader_skip (&br, off + 3) == FALSE) + goto failed; codoffsize = g_malloc (sizeof (GstMpegVideoTypeOffsetSize)); - gst_byte_reader_get_uint8 (&br, &codoffsize->type); + if (gst_byte_reader_get_uint8 (&br, &codoffsize->type) == FALSE) + goto failed; codoffsize->offset = gst_byte_reader_get_pos (&br) + offset; @@ -346,6 +348,12 @@ gst_mpeg_video_parse (const guint8 * data, gsize size, guint offset) } return g_list_reverse (ret); + +failed: + { + GST_WARNING ("Failed to parse"); + return g_list_reverse (ret); + } } /** diff --git a/gst-libs/gst/codecparsers/gstvc1parser.c b/gst-libs/gst/codecparsers/gstvc1parser.c index 8f2937f01f..a82e46e16a 100644 --- a/gst-libs/gst/codecparsers/gstvc1parser.c +++ b/gst-libs/gst/codecparsers/gstvc1parser.c @@ -692,7 +692,7 @@ get_unary (GstBitReader * br, gint stop, gint len) guint8 current = 0xff; for (i = 0; i < len; i++) { - gst_bit_reader_get_bits_uint8 (br, ¤t, 1); + current = gst_bit_reader_get_bits_uint8_unchecked (br, 1); if (current == stop) return i; } diff --git a/gst/aiff/aiffmux.c b/gst/aiff/aiffmux.c index 0d2772af51..565ea8629a 100644 --- a/gst/aiff/aiffmux.c +++ b/gst/aiff/aiffmux.c @@ -163,11 +163,14 @@ gst_aiff_mux_write_form_header (GstAiffMux * aiffmux, guint32 audio_data_size, GstByteWriter * writer) { /* ckID == 'FORM' */ - gst_byte_writer_put_uint32_le (writer, GST_MAKE_FOURCC ('F', 'O', 'R', 'M')); + gst_byte_writer_put_uint32_le_unchecked (writer, + GST_MAKE_FOURCC ('F', 'O', 'R', 'M')); /* ckSize is currently bogus but we'll know what it is later */ - gst_byte_writer_put_uint32_be (writer, audio_data_size + AIFF_HEADER_LEN - 8); + gst_byte_writer_put_uint32_be_unchecked (writer, + audio_data_size + AIFF_HEADER_LEN - 8); /* formType == 'AIFF' */ - gst_byte_writer_put_uint32_le (writer, GST_MAKE_FOURCC ('A', 'I', 'F', 'F')); + gst_byte_writer_put_uint32_le_unchecked (writer, + GST_MAKE_FOURCC ('A', 'I', 'F', 'F')); } /* @@ -218,8 +221,8 @@ gst_aiff_mux_write_ext (GstByteWriter * writer, double d) if (d < 0) ext.exponent[0] |= 0x80; - gst_byte_writer_put_data (writer, ext.exponent, 2); - gst_byte_writer_put_data (writer, ext.mantissa, 8); + gst_byte_writer_put_data_unchecked (writer, ext.exponent, 2); + gst_byte_writer_put_data_unchecked (writer, ext.mantissa, 8); } /* @@ -230,13 +233,14 @@ static void gst_aiff_mux_write_comm_header (GstAiffMux * aiffmux, guint32 audio_data_size, GstByteWriter * writer) { - gst_byte_writer_put_uint32_le (writer, GST_MAKE_FOURCC ('C', 'O', 'M', 'M')); - gst_byte_writer_put_uint32_be (writer, 18); - gst_byte_writer_put_uint16_be (writer, aiffmux->channels); + gst_byte_writer_put_uint32_le_unchecked (writer, + GST_MAKE_FOURCC ('C', 'O', 'M', 'M')); + gst_byte_writer_put_uint32_be_unchecked (writer, 18); + gst_byte_writer_put_uint16_be_unchecked (writer, aiffmux->channels); /* numSampleFrames value will be overwritten when known */ - gst_byte_writer_put_uint32_be (writer, + gst_byte_writer_put_uint32_be_unchecked (writer, audio_data_size / (aiffmux->width / 8 * aiffmux->channels)); - gst_byte_writer_put_uint16_be (writer, aiffmux->depth); + gst_byte_writer_put_uint16_be_unchecked (writer, aiffmux->depth); gst_aiff_mux_write_ext (writer, aiffmux->rate); } @@ -244,13 +248,14 @@ static void gst_aiff_mux_write_ssnd_header (GstAiffMux * aiffmux, guint32 audio_data_size, GstByteWriter * writer) { - gst_byte_writer_put_uint32_le (writer, GST_MAKE_FOURCC ('S', 'S', 'N', 'D')); + gst_byte_writer_put_uint32_le_unchecked (writer, + GST_MAKE_FOURCC ('S', 'S', 'N', 'D')); /* ckSize will be overwritten when known */ - gst_byte_writer_put_uint32_be (writer, + gst_byte_writer_put_uint32_be_unchecked (writer, audio_data_size + AIFF_SSND_HEADER_LEN - 8); /* offset and blockSize are set to 0 as we don't support block-aligned sample data yet */ - gst_byte_writer_put_uint32_be (writer, 0); - gst_byte_writer_put_uint32_be (writer, 0); + gst_byte_writer_put_uint32_be_unchecked (writer, 0); + gst_byte_writer_put_uint32_be_unchecked (writer, 0); } static GstFlowReturn diff --git a/gst/h264parse/gsth264parse.c b/gst/h264parse/gsth264parse.c index 8ae60755ed..29197371ec 100644 --- a/gst/h264parse/gsth264parse.c +++ b/gst/h264parse/gsth264parse.c @@ -895,10 +895,8 @@ gst_h264_parse_base_init (gpointer g_class) { GstElementClass *gstelement_class = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_static_pad_template (gstelement_class, - &srctemplate); - gst_element_class_add_static_pad_template (gstelement_class, - &sinktemplate); + gst_element_class_add_static_pad_template (gstelement_class, &srctemplate); + gst_element_class_add_static_pad_template (gstelement_class, &sinktemplate); gst_element_class_set_details_simple (gstelement_class, "H264Parse", "Codec/Parser/Video", "Parses raw h264 stream", @@ -1732,7 +1730,7 @@ gst_h264_parse_push_buffer (GstH264Parse * h264parse, GstBuffer * buf) GstBuffer *codec_nal, *new_buf; gst_byte_writer_init_with_size (&bw, GST_BUFFER_SIZE (buf), FALSE); - gst_byte_writer_put_data (&bw, GST_BUFFER_DATA (buf), + gst_byte_writer_put_data_unchecked (&bw, GST_BUFFER_DATA (buf), h264parse->idr_offset); GST_DEBUG_OBJECT (h264parse, "- inserting SPS/PPS"); for (i = 0; i < MAX_SPS_COUNT; i++) { @@ -1741,8 +1739,8 @@ gst_h264_parse_push_buffer (GstH264Parse * h264parse, GstBuffer * buf) codec_nal = gst_buffer_copy (h264parse->sps_nals[i]); codec_nal = gst_h264_parse_write_nal_prefix (h264parse, codec_nal); - gst_byte_writer_put_data (&bw, GST_BUFFER_DATA (codec_nal), - GST_BUFFER_SIZE (codec_nal)); + gst_byte_writer_put_data_unchecked (&bw, + GST_BUFFER_DATA (codec_nal), GST_BUFFER_SIZE (codec_nal)); h264parse->last_report = timestamp; } } @@ -1752,12 +1750,12 @@ gst_h264_parse_push_buffer (GstH264Parse * h264parse, GstBuffer * buf) codec_nal = gst_buffer_copy (h264parse->pps_nals[i]); codec_nal = gst_h264_parse_write_nal_prefix (h264parse, codec_nal); - gst_byte_writer_put_data (&bw, GST_BUFFER_DATA (codec_nal), - GST_BUFFER_SIZE (codec_nal)); + gst_byte_writer_put_data_unchecked (&bw, + GST_BUFFER_DATA (codec_nal), GST_BUFFER_SIZE (codec_nal)); h264parse->last_report = timestamp; } } - gst_byte_writer_put_data (&bw, + gst_byte_writer_put_data_unchecked (&bw, GST_BUFFER_DATA (buf) + h264parse->idr_offset, GST_BUFFER_SIZE (buf) - h264parse->idr_offset); /* collect result and push */ diff --git a/gst/jp2kdecimator/jp2kcodestream.c b/gst/jp2kdecimator/jp2kcodestream.c index 6fb28788e7..a5321685e0 100644 --- a/gst/jp2kdecimator/jp2kcodestream.c +++ b/gst/jp2kdecimator/jp2kcodestream.c @@ -828,7 +828,11 @@ write_plt (GstJP2kDecimator * self, GstByteWriter * writer, plt_end_pos = gst_byte_writer_get_pos (writer); gst_byte_writer_set_pos (writer, plt_start_pos); - gst_byte_writer_put_uint16_be (writer, plt_end_pos - plt_start_pos); + if (!gst_byte_writer_put_uint16_be (writer, plt_end_pos - plt_start_pos)) { + GST_ERROR_OBJECT (self, "Not enough space to write plt size"); + return GST_FLOW_ERROR; + } + gst_byte_writer_set_pos (writer, plt_end_pos); return GST_FLOW_OK; @@ -1328,9 +1332,9 @@ write_packet (GstJP2kDecimator * self, GstByteWriter * writer, } if (packet->sop) { - gst_byte_writer_put_uint16_be (writer, MARKER_SOP); - gst_byte_writer_put_uint16_be (writer, 4); - gst_byte_writer_put_uint16_be (writer, packet->seqno); + gst_byte_writer_put_uint16_be_unchecked (writer, MARKER_SOP); + gst_byte_writer_put_uint16_be_unchecked (writer, 4); + gst_byte_writer_put_uint16_be_unchecked (writer, packet->seqno); } if (packet->data) { @@ -1696,7 +1700,7 @@ write_main_header (GstJP2kDecimator * self, GstByteWriter * writer, return GST_FLOW_ERROR; } - gst_byte_writer_put_uint16_be (writer, MARKER_SOC); + gst_byte_writer_put_uint16_be_unchecked (writer, MARKER_SOC); ret = write_siz (self, writer, &header->siz); if (ret != GST_FLOW_OK) diff --git a/gst/mxf/mxfmpeg.c b/gst/mxf/mxfmpeg.c index 08b1a27b8c..45676d002e 100644 --- a/gst/mxf/mxfmpeg.c +++ b/gst/mxf/mxfmpeg.c @@ -441,7 +441,7 @@ mxf_mpeg_is_mpeg2_keyframe (GstBuffer * buffer) guint8 type = 0; /* Found sync code */ - gst_byte_reader_skip (&reader, 3); + gst_byte_reader_skip_unchecked (&reader, 3); if (!gst_byte_reader_get_uint8 (&reader, &type)) break; @@ -465,9 +465,8 @@ mxf_mpeg_is_mpeg2_keyframe (GstBuffer * buffer) return FALSE; } } - } else { - gst_byte_reader_skip (&reader, 1); - } + } else if (gst_byte_reader_skip (&reader, 1) == FALSE) + break; } return FALSE; @@ -484,7 +483,7 @@ mxf_mpeg_is_mpeg4_keyframe (GstBuffer * buffer) guint8 type = 0; /* Found sync code */ - gst_byte_reader_skip (&reader, 3); + gst_byte_reader_skip_unchecked (&reader, 3); if (!gst_byte_reader_get_uint8 (&reader, &type)) break; @@ -502,9 +501,8 @@ mxf_mpeg_is_mpeg4_keyframe (GstBuffer * buffer) return FALSE; } } - } else { - gst_byte_reader_skip (&reader, 1); - } + } else if (gst_byte_reader_skip (&reader, 1) == FALSE) + break; } return FALSE; @@ -1024,7 +1022,7 @@ mxf_mpeg_is_mpeg2_frame (GstBuffer * buffer) guint8 type = 0; /* Found sync code */ - gst_byte_reader_skip (&reader, 3); + gst_byte_reader_skip_unchecked (&reader, 3); if (!gst_byte_reader_get_uint8 (&reader, &type)) break; @@ -1034,7 +1032,8 @@ mxf_mpeg_is_mpeg2_frame (GstBuffer * buffer) return TRUE; } } else { - gst_byte_reader_skip (&reader, 1); + if (gst_byte_reader_skip (&reader, 1) == FALSE) + break; } } @@ -1052,7 +1051,7 @@ mxf_mpeg_is_mpeg4_frame (GstBuffer * buffer) guint8 type = 0; /* Found sync code */ - gst_byte_reader_skip (&reader, 3); + gst_byte_reader_skip_unchecked (&reader, 3); if (!gst_byte_reader_get_uint8 (&reader, &type)) break; @@ -1062,7 +1061,8 @@ mxf_mpeg_is_mpeg4_frame (GstBuffer * buffer) return TRUE; } } else { - gst_byte_reader_skip (&reader, 1); + if (gst_byte_reader_skip (&reader, 1) == FALSE) + break; } } diff --git a/gst/videoparsers/gsth263parse.c b/gst/videoparsers/gsth263parse.c index 85028c28da..d488d5a68b 100644 --- a/gst/videoparsers/gsth263parse.c +++ b/gst/videoparsers/gsth263parse.c @@ -65,10 +65,8 @@ gst_h263_parse_base_init (gpointer g_class) { GstElementClass *gstelement_class = GST_ELEMENT_CLASS (g_class); - gst_element_class_add_static_pad_template (gstelement_class, - &srctemplate); - gst_element_class_add_static_pad_template (gstelement_class, - &sinktemplate); + gst_element_class_add_static_pad_template (gstelement_class, &srctemplate); + gst_element_class_add_static_pad_template (gstelement_class, &sinktemplate); gst_element_class_set_details_simple (gstelement_class, "H.263 parser", "Codec/Parser/Video", "Parses H.263 streams", @@ -163,7 +161,8 @@ find_psc (GstBuffer * buffer, guint skip) if (!gst_byte_reader_set_pos (&br, skip)) goto out; - gst_byte_reader_peek_uint24_be (&br, &psc); + if (gst_byte_reader_peek_uint24_be (&br, &psc) == FALSE) + goto out; /* Scan for the picture start code (22 bits - 0x0020) */ while ((gst_byte_reader_get_remaining (&br) >= 3)) { @@ -171,8 +170,8 @@ find_psc (GstBuffer * buffer, guint skip) ((psc & 0xffffc0) == 0x000080)) { psc_pos = gst_byte_reader_get_pos (&br); break; - } else - gst_byte_reader_skip (&br, 1); + } else if (gst_byte_reader_skip (&br, 1) == FALSE) + break; } out: diff --git a/gst/videoparsers/gsth264parse.c b/gst/videoparsers/gsth264parse.c index 6528907a4e..0c8455d49d 100644 --- a/gst/videoparsers/gsth264parse.c +++ b/gst/videoparsers/gsth264parse.c @@ -1491,30 +1491,30 @@ gst_h264_parse_pre_push_frame (GstBaseParse * parse, GstBaseParseFrame * frame) const gboolean bs = h264parse->format == GST_H264_PARSE_FORMAT_BYTE; gst_byte_writer_init_with_size (&bw, GST_BUFFER_SIZE (buffer), FALSE); - gst_byte_writer_put_data (&bw, GST_BUFFER_DATA (buffer), + gst_byte_writer_put_data_unchecked (&bw, GST_BUFFER_DATA (buffer), h264parse->idr_pos); GST_DEBUG_OBJECT (h264parse, "- inserting SPS/PPS"); for (i = 0; i < GST_H264_MAX_SPS_COUNT; i++) { if ((codec_nal = h264parse->sps_nals[i])) { GST_DEBUG_OBJECT (h264parse, "inserting SPS nal"); - gst_byte_writer_put_uint32_be (&bw, + gst_byte_writer_put_uint32_be_unchecked (&bw, bs ? 1 : GST_BUFFER_SIZE (codec_nal)); - gst_byte_writer_put_data (&bw, GST_BUFFER_DATA (codec_nal), - GST_BUFFER_SIZE (codec_nal)); + gst_byte_writer_put_data_unchecked (&bw, + GST_BUFFER_DATA (codec_nal), GST_BUFFER_SIZE (codec_nal)); h264parse->last_report = new_ts; } } for (i = 0; i < GST_H264_MAX_PPS_COUNT; i++) { if ((codec_nal = h264parse->pps_nals[i])) { GST_DEBUG_OBJECT (h264parse, "inserting PPS nal"); - gst_byte_writer_put_uint32_be (&bw, + gst_byte_writer_put_uint32_be_unchecked (&bw, bs ? 1 : GST_BUFFER_SIZE (codec_nal)); - gst_byte_writer_put_data (&bw, GST_BUFFER_DATA (codec_nal), - GST_BUFFER_SIZE (codec_nal)); + gst_byte_writer_put_data_unchecked (&bw, + GST_BUFFER_DATA (codec_nal), GST_BUFFER_SIZE (codec_nal)); h264parse->last_report = new_ts; } } - gst_byte_writer_put_data (&bw, + gst_byte_writer_put_data_unchecked (&bw, GST_BUFFER_DATA (buffer) + h264parse->idr_pos, GST_BUFFER_SIZE (buffer) - h264parse->idr_pos); /* collect result and push */ diff --git a/sys/vdpau/h264/gstvdph264dec.c b/sys/vdpau/h264/gstvdph264dec.c index d7af47b6f4..71893ca0bd 100644 --- a/sys/vdpau/h264/gstvdph264dec.c +++ b/sys/vdpau/h264/gstvdph264dec.c @@ -687,23 +687,25 @@ gst_vdp_h264_dec_parse_data (GstBaseVideoDecoder * base_video_decoder, gst_bit_reader_init_from_buffer (&reader, buf); - /* skip nal_length or sync code */ - gst_bit_reader_skip (&reader, h264_dec->nal_length_size * 8); - - if (!gst_bit_reader_get_bits_uint8 (&reader, &forbidden_zero_bit, 1)) + if (gst_bit_reader_get_remaining (&reader) < + h264_dec->nal_length_size * 8 + 7) goto invalid_packet; + + /* skip nal_length or sync code */ + gst_bit_reader_skip_unchecked (&reader, h264_dec->nal_length_size * 8); + + forbidden_zero_bit = gst_bit_reader_get_bits_uint8_unchecked (&reader, 1); + if (forbidden_zero_bit != 0) { GST_WARNING ("forbidden_zero_bit != 0"); return GST_FLOW_ERROR; } - if (!gst_bit_reader_get_bits_uint16 (&reader, &nal_unit.ref_idc, 2)) - goto invalid_packet; + nal_unit.ref_idc = gst_bit_reader_get_bits_uint16_unchecked (&reader, 2); GST_DEBUG ("nal_ref_idc: %u", nal_unit.ref_idc); /* read nal_unit_type */ - if (!gst_bit_reader_get_bits_uint16 (&reader, &nal_unit.type, 5)) - goto invalid_packet; + nal_unit.type = gst_bit_reader_get_bits_uint16_unchecked (&reader, 5); GST_DEBUG ("nal_unit_type: %u", nal_unit.type); if (nal_unit.type == 14 || nal_unit.type == 20) { @@ -716,7 +718,7 @@ gst_vdp_h264_dec_parse_data (GstBaseVideoDecoder * base_video_decoder, size = gst_bit_reader_get_remaining (&reader) / 8; i = size - 1; - while (size > 0 && data[i] == 0x00) { + while ((gint) size > 0 && data[i] == 0x00) { size--; i--; } diff --git a/sys/vdpau/mpeg/gstvdpmpegdec.c b/sys/vdpau/mpeg/gstvdpmpegdec.c index 6a473e48e9..87456eb784 100644 --- a/sys/vdpau/mpeg/gstvdpmpegdec.c +++ b/sys/vdpau/mpeg/gstvdpmpegdec.c @@ -415,12 +415,14 @@ gst_vdp_mpeg_dec_parse_data (GstBaseVideoDecoder * base_video_decoder, GstBitReader b_reader = GST_BIT_READER_INIT_FROM_BUFFER (buf); guint8 start_code; + if (gst_bit_reader_get_remaining (&b_reader) < 8 * 3 + 8) + return GST_FLOW_ERROR; + /* skip sync_code */ - gst_bit_reader_skip (&b_reader, 8 * 3); + gst_bit_reader_skip_unchecked (&b_reader, 8 * 3); /* start_code */ - if (!gst_bit_reader_get_bits_uint8 (&b_reader, &start_code, 8)) - return GST_FLOW_ERROR; + start_code = gst_bit_reader_get_bits_uint8_unchecked (&b_reader, 8); mpeg_frame = GST_VDP_MPEG_FRAME_CAST (frame); @@ -624,8 +626,7 @@ gst_vdp_mpeg_dec_base_init (gpointer gclass) "Decode mpeg stream with vdpau", "Carl-Anton Ingmarsson "); - gst_element_class_add_static_pad_template (element_class, - &sink_template); + gst_element_class_add_static_pad_template (element_class, &sink_template); } /* initialize the vdpaumpegdecoder's class */ From 1188120ebacc52bd8f439eedf806d8d5127fbe05 Mon Sep 17 00:00:00 2001 From: Thibault Saunier Date: Sat, 10 Mar 2012 20:53:54 -0300 Subject: [PATCH 080/138] Fix an unwanted double negation from last commit --- gst-libs/gst/codecparsers/gstmpegvideoparser.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gst-libs/gst/codecparsers/gstmpegvideoparser.c b/gst-libs/gst/codecparsers/gstmpegvideoparser.c index 2767517f11..b45156a8d6 100644 --- a/gst-libs/gst/codecparsers/gstmpegvideoparser.c +++ b/gst-libs/gst/codecparsers/gstmpegvideoparser.c @@ -97,7 +97,7 @@ find_start_code (GstBitReader * b) while (gst_bit_reader_peek_bits_uint32 (b, &bits, 32)) { if (bits >> 8 == 0x1) { return TRUE; - } else if (!gst_bit_reader_skip (b, 8) == FALSE) + } else if (gst_bit_reader_skip (b, 8) == FALSE) break; } From fd92f8d6a29595274abc425f574430ecc891894e Mon Sep 17 00:00:00 2001 From: Gil Pedersen Date: Tue, 28 Feb 2012 16:40:31 +0100 Subject: [PATCH 081/138] hlsdemux: add floating point segment duration support --- gst/hls/gsthlsdemux.c | 10 +++----- gst/hls/m3u8.c | 58 +++++++++++++++++++++++++++++++++---------- gst/hls/m3u8.h | 4 +-- 3 files changed, 51 insertions(+), 21 deletions(-) diff --git a/gst/hls/gsthlsdemux.c b/gst/hls/gsthlsdemux.c index afafacaf04..900f25fc1b 100644 --- a/gst/hls/gsthlsdemux.c +++ b/gst/hls/gsthlsdemux.c @@ -341,9 +341,8 @@ gst_hls_demux_src_event (GstPad * pad, GstEvent * event) GstSeekType start_type, stop_type; gint64 start, stop; GList *walk; - gint current_pos; + GstClockTime current_pos, target_pos; gint current_sequence; - gint target_second; GstM3U8MediaFile *file; GST_INFO_OBJECT (demux, "Received GST_EVENT_SEEK"); @@ -367,14 +366,13 @@ gst_hls_demux_src_event (GstPad * pad, GstEvent * event) file = GST_M3U8_MEDIA_FILE (demux->client->current->files->data); current_sequence = file->sequence; current_pos = 0; - target_second = start / GST_SECOND; - GST_DEBUG_OBJECT (demux, "Target seek to %d", target_second); + target_pos = (GstClockTime) start; for (walk = demux->client->current->files; walk; walk = walk->next) { file = walk->data; current_sequence = file->sequence; - if (current_pos <= target_second - && target_second < current_pos + file->duration) { + if (current_pos <= target_pos + && target_pos < current_pos + file->duration) { break; } current_pos += file->duration; diff --git a/gst/hls/m3u8.c b/gst/hls/m3u8.c index c27f159b59..eecb467e2c 100644 --- a/gst/hls/m3u8.c +++ b/gst/hls/m3u8.c @@ -20,6 +20,7 @@ */ #include +#include #include #include @@ -34,7 +35,7 @@ static void gst_m3u8_free (GstM3U8 * m3u8); static gboolean gst_m3u8_update (GstM3U8 * m3u8, gchar * data, gboolean * updated); static GstM3U8MediaFile *gst_m3u8_media_file_new (gchar * uri, - gchar * title, gint duration, guint sequence); + gchar * title, GstClockTime duration, guint sequence); static void gst_m3u8_media_file_free (GstM3U8MediaFile * self); static GstM3U8 * @@ -77,7 +78,7 @@ gst_m3u8_free (GstM3U8 * self) } static GstM3U8MediaFile * -gst_m3u8_media_file_new (gchar * uri, gchar * title, gint duration, +gst_m3u8_media_file_new (gchar * uri, gchar * title, GstClockTime duration, guint sequence) { GstM3U8MediaFile *file; @@ -131,6 +132,36 @@ int_from_string (gchar * ptr, gchar ** endptr, gint * val) return end != ptr; } +static gboolean +double_from_string (gchar * ptr, gchar ** endptr, gdouble * val) +{ + gchar *end; + gdouble ret; + + g_return_val_if_fail (ptr != NULL, FALSE); + g_return_val_if_fail (val != NULL, FALSE); + + errno = 0; + ret = strtod (ptr, &end); + if ((errno == ERANGE && (ret == HUGE_VAL || ret == -HUGE_VAL)) + || (errno != 0 && ret == 0)) { + GST_WARNING ("%s", g_strerror (errno)); + return FALSE; + } + + if (!isfinite (ret)) { + GST_WARNING ("%s", g_strerror (ERANGE)); + return FALSE; + } + + if (endptr) + *endptr = end; + + *val = (gint) ret; + + return end != ptr; +} + static gboolean parse_attributes (gchar ** ptr, gchar ** a, gchar ** v) { @@ -186,7 +217,8 @@ gst_m3u8_compare_playlist_by_bitrate (gconstpointer a, gconstpointer b) static gboolean gst_m3u8_update (GstM3U8 * self, gchar * data, gboolean * updated) { - gint val, duration; + gint val; + GstClockTime duration; gchar *title, *end; // gboolean discontinuity; GstM3U8 *list; @@ -222,7 +254,7 @@ gst_m3u8_update (GstM3U8 * self, gchar * data, gboolean * updated) } list = NULL; - duration = -1; + duration = 0; title = NULL; data += 7; while (TRUE) { @@ -233,7 +265,7 @@ gst_m3u8_update (GstM3U8 * self, gchar * data, gboolean * updated) if (data[0] != '#') { gchar *r; - if (duration < 0 && list == NULL) { + if (duration <= 0 && list == NULL) { GST_LOG ("%s: got line without EXTINF or EXTSTREAMINF, dropping", data); goto next_line; } @@ -277,7 +309,7 @@ gst_m3u8_update (GstM3U8 * self, gchar * data, gboolean * updated) file = gst_m3u8_media_file_new (data, title, duration, self->mediasequence++); - duration = -1; + duration = 0; title = NULL; self->files = g_list_append (self->files, file); } @@ -321,7 +353,7 @@ gst_m3u8_update (GstM3U8 * self, gchar * data, gboolean * updated) } } else if (g_str_has_prefix (data, "#EXT-X-TARGETDURATION:")) { if (int_from_string (data + 22, &data, &val)) - self->targetduration = val; + self->targetduration = val * GST_SECOND; } else if (g_str_has_prefix (data, "#EXT-X-MEDIA-SEQUENCE:")) { if (int_from_string (data + 22, &data, &val)) self->mediasequence = val; @@ -334,11 +366,12 @@ gst_m3u8_update (GstM3U8 * self, gchar * data, gboolean * updated) g_free (self->allowcache); self->allowcache = g_strdup (data + 19); } else if (g_str_has_prefix (data, "#EXTINF:")) { - if (!int_from_string (data + 8, &data, &val)) { + gdouble fval; + if (!double_from_string (data + 8, &data, &fval)) { GST_WARNING ("Can't read EXTINF duration"); goto next_line; } - duration = val; + duration = fval * (gdouble) GST_SECOND; if (duration > self->targetduration) GST_WARNING ("EXTINF duration > TARGETDURATION"); if (!data || *data != ',') @@ -485,7 +518,6 @@ gst_m3u8_client_get_current_position (GstM3U8Client * client, break; *timestamp += GST_M3U8_MEDIA_FILE (walk->data)->duration; } - *timestamp *= GST_SECOND; } gboolean @@ -517,7 +549,7 @@ gst_m3u8_client_get_next_fragment (GstM3U8Client * client, client->sequence = file->sequence + 1; *uri = file->uri; - *duration = file->duration * GST_SECOND; + *duration = file->duration; GST_M3U8_CLIENT_UNLOCK (client); return TRUE; @@ -545,7 +577,7 @@ gst_m3u8_client_get_duration (GstM3U8Client * client) g_list_foreach (client->current->files, (GFunc) _sum_duration, &duration); GST_M3U8_CLIENT_UNLOCK (client); - return duration * GST_SECOND; + return duration; } GstClockTime @@ -558,7 +590,7 @@ gst_m3u8_client_get_target_duration (GstM3U8Client * client) GST_M3U8_CLIENT_LOCK (client); duration = client->current->targetduration; GST_M3U8_CLIENT_UNLOCK (client); - return duration * GST_SECOND; + return duration; } const gchar * diff --git a/gst/hls/m3u8.h b/gst/hls/m3u8.h index a428a67a48..a03828716a 100644 --- a/gst/hls/m3u8.h +++ b/gst/hls/m3u8.h @@ -41,7 +41,7 @@ struct _GstM3U8 gboolean endlist; /* if ENDLIST has been reached */ gint version; /* last EXT-X-VERSION */ - gint targetduration; /* last EXT-X-TARGETDURATION */ + GstClockTime targetduration; /* last EXT-X-TARGETDURATION */ gchar *allowcache; /* last EXT-X-ALLOWCACHE */ gint bandwidth; @@ -62,7 +62,7 @@ struct _GstM3U8 struct _GstM3U8MediaFile { gchar *title; - gint duration; + GstClockTime duration; gchar *uri; guint sequence; /* the sequence nb of this file */ }; From 4e7edb2778f85a5475ffe9c782c91d86a7b902ca Mon Sep 17 00:00:00 2001 From: "Oleksij Rempel (Alexey Fisher)" Date: Mon, 12 Mar 2012 15:42:04 +0100 Subject: [PATCH 082/138] geometrictransform: make sure gt->map not freed twice current cheese can create situation where gt->map is freed twice. This patch set map to null to avoid it. https://bugzilla.gnome.org/show_bug.cgi?id=671910 --- gst/geometrictransform/gstgeometrictransform.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/gst/geometrictransform/gstgeometrictransform.c b/gst/geometrictransform/gstgeometrictransform.c index 8e78de7ab7..274d483f21 100644 --- a/gst/geometrictransform/gstgeometrictransform.c +++ b/gst/geometrictransform/gstgeometrictransform.c @@ -143,9 +143,10 @@ gst_geometric_transform_generate_map (GstGeometricTransform * gt) } end: - if (!ret) + if (!ret) { g_free (gt->map); - else + gt->map = NULL; + } else gt->needs_remap = FALSE; return ret; } @@ -348,6 +349,7 @@ gst_geometric_transform_stop (GstBaseTransform * trans) GstGeometricTransform *gt = GST_GEOMETRIC_TRANSFORM_CAST (trans); g_free (gt->map); + gt->map = NULL; return TRUE; } From 689bf4d392855fff7544a80313297a2091054851 Mon Sep 17 00:00:00 2001 From: Sreerenj Balachandran Date: Thu, 8 Mar 2012 01:48:56 +0200 Subject: [PATCH 083/138] waylandsink: Fix warnings, proper structuring, dead code removal, adding doc section. --- ext/wayland/gstwaylandsink.c | 145 +++++++++++------------------------ ext/wayland/gstwaylandsink.h | 22 +++++- 2 files changed, 64 insertions(+), 103 deletions(-) diff --git a/ext/wayland/gstwaylandsink.c b/ext/wayland/gstwaylandsink.c index 614e5dbce1..ecc026dc47 100644 --- a/ext/wayland/gstwaylandsink.c +++ b/ext/wayland/gstwaylandsink.c @@ -1,8 +1,8 @@ /* * GStreamer Wayland video sink * - * Copyright: Intel Corporation - * Copyright: Sreerenj Balachandran + * Copyright (C) 2011 Intel Corporation + * Copyright (C) 2011 Sreerenj Balachandran * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -19,30 +19,28 @@ * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ - -/* The waylandsink is creating its own window and render the decoded video frames to that.*/ +/** + * SECTION:element-waylandsink + * + * The waylandsink is creating its own window and render the decoded video frames to that. + * Setup the Wayland environment as described in + * Wayland home page. + * The current implementaion is based on weston compositor. + * + * + * Example pipelines + * |[ + * gst-launch -v videotestsrc ! waylandsink + * ]| test the video rendering in wayland + * + */ #ifdef HAVE_CONFIG_H #include #endif -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - #include "gstwaylandsink.h" -#include - /* signals */ enum { @@ -52,7 +50,6 @@ enum }; /* Properties */ -/*Fixme: Not yet implemented */ enum { PROP_0, @@ -72,28 +69,27 @@ static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink", "green_mask = (int) 16711680, " "blue_mask = (int) -16777216," "width = (int) [ 1, MAX ], " "height = (int) [ 1, MAX ] ")); -GType gst_wlbuffer_get_type (void); + +G_DEFINE_TYPE (GstWlBuffer, gst_wlbuffer, GST_TYPE_BUFFER); /*Fixme: Add more interfaces */ GST_BOILERPLATE (GstWaylandSink, gst_wayland_sink, GstVideoSink, GST_TYPE_VIDEO_SINK); static void gst_wlbuffer_finalize (GstWlBuffer * wbuffer); -static GstBufferClass *wlbuffer_parent_class = NULL; static void gst_wayland_sink_get_property (GObject * object, guint prop_id, GValue * value, GParamSpec * pspec); static void gst_wayland_sink_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec); -static void gst_wayland_sink_dispose (GObject * object); static void gst_wayland_sink_finalize (GObject * object); static GstCaps *gst_wayland_sink_get_caps (GstBaseSink * bsink); static gboolean gst_wayland_sink_set_caps (GstBaseSink * bsink, GstCaps * caps); static gboolean gst_wayland_sink_start (GstBaseSink * bsink); static gboolean gst_wayland_sink_stop (GstBaseSink * bsink); static GstFlowReturn -gst_wayland_sink_buffer_alloc (GstBaseSink * bsink, guint64 offset, guint size, - GstCaps * caps, GstBuffer ** buf); +gst_wayland_sink_buffer_alloc (GstBaseSink * bsink, guint64 offset, + guint size, GstCaps * caps, GstBuffer ** buf); static gboolean gst_wayland_sink_preroll (GstBaseSink * bsink, GstBuffer * buffer); static gboolean gst_wayland_sink_render (GstBaseSink * bsink, @@ -107,51 +103,25 @@ static struct display *create_display (void); static void display_handle_global (struct wl_display *display, uint32_t id, const char *interface, uint32_t version, void *data); static void redraw (void *data, struct wl_callback *callback, uint32_t time); -static void create_window (GstWaylandSink * sink, - struct display *display, int width, int height); +static void create_window (GstWaylandSink * sink, struct display *display, + int width, int height); static void -gst_wlbuffer_init (GstWlBuffer * buffer, gpointer g_class) +gst_wlbuffer_init (GstWlBuffer * buffer) { buffer->wbuffer = NULL; buffer->wlsink = NULL; } static void -gst_wlbuffer_class_init (gpointer g_class, gpointer class_data) +gst_wlbuffer_class_init (GstWlBufferClass * klass) { - GstMiniObjectClass *mini_object_class = GST_MINI_OBJECT_CLASS (g_class); - - wlbuffer_parent_class = g_type_class_peek_parent (g_class); + GstMiniObjectClass *mini_object_class = GST_MINI_OBJECT_CLASS (klass); mini_object_class->finalize = (GstMiniObjectFinalizeFunction) gst_wlbuffer_finalize; } -GType -gst_wlbuffer_get_type (void) -{ - static GType _gst_wlbuffer_type; - - if (G_UNLIKELY (_gst_wlbuffer_type == 0)) { - static const GTypeInfo wlbuffer_info = { - sizeof (GstBufferClass), - NULL, - NULL, - gst_wlbuffer_class_init, - NULL, - NULL, - sizeof (GstWlBuffer), - 0, - (GInstanceInitFunc) gst_wlbuffer_init, - NULL - }; - _gst_wlbuffer_type = g_type_register_static (GST_TYPE_BUFFER, - "GstWlBuffer", &wlbuffer_info, 0); - } - return _gst_wlbuffer_type; -} - static void gst_wlbuffer_finalize (GstWlBuffer * wbuffer) { @@ -189,7 +159,7 @@ gst_wayland_sink_base_init (gpointer gclass) gst_element_class_set_details_simple (element_class, "wayland video sink", "Sink/Video", "Output to wayland surface", - "Sreerenj Balachandran ,"); + "Sreerenj Balachandran "); } static void @@ -203,7 +173,6 @@ gst_wayland_sink_class_init (GstWaylandSinkClass * klass) gobject_class->set_property = gst_wayland_sink_set_property; gobject_class->get_property = gst_wayland_sink_get_property; - gobject_class->dispose = GST_DEBUG_FUNCPTR (gst_wayland_sink_dispose); gobject_class->finalize = GST_DEBUG_FUNCPTR (gst_wayland_sink_finalize); gstbasesink_class->get_caps = GST_DEBUG_FUNCPTR (gst_wayland_sink_get_caps); @@ -217,8 +186,8 @@ gst_wayland_sink_class_init (GstWaylandSinkClass * klass) g_object_class_install_property (gobject_class, PROP_WAYLAND_DISPLAY, g_param_spec_pointer ("wayland-display", "Wayland Display", - "Wayland Display id created by the application ", - G_PARAM_READWRITE)); + "Wayland Display handle created by the application ", + G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); parent_class = g_type_class_peek_parent (klass); } @@ -291,27 +260,24 @@ destroy_display (struct display *display) static void destroy_window (struct window *window) { - wl_shell_surface_destroy (window->shell_surface); - wl_surface_destroy (window->surface); + if (window->shell_surface) + wl_shell_surface_destroy (window->shell_surface); + if (window->surface) + wl_surface_destroy (window->surface); free (window); } -static void -gst_wayland_sink_dispose (GObject * object) -{ - G_OBJECT_CLASS (parent_class)->dispose (object); -} - static void gst_wayland_sink_finalize (GObject * object) { GstWaylandSink *sink = GST_WAYLAND_SINK (object); GST_DEBUG_OBJECT (sink, "Finalizing the sink.."); - gst_caps_replace (&sink->caps, NULL); - free (sink->display); - free (sink->window); + if (sink->window) + destroy_window (sink->window); + if (sink->display) + destroy_display (sink->display); if (sink->pool_lock) { g_mutex_free (sink->pool_lock); @@ -327,7 +293,6 @@ gst_wayland_sink_finalize (GObject * object) G_OBJECT_CLASS (parent_class)->finalize (object); } - static GstCaps * gst_wayland_sink_get_caps (GstBaseSink * bsink) { @@ -432,7 +397,8 @@ wayland_buffer_create (GstWaylandSink * sink) data = mmap (NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); unlink (filename); if (data == MAP_FAILED) { - fprintf (stderr, "mmap failed: %m\n"); + GST_ELEMENT_ERROR (sink, LIBRARY, SHUTDOWN, (NULL), + ("mmap() failed: %s", strerror (errno))); close (fd); exit (0); } @@ -446,7 +412,6 @@ wayland_buffer_create (GstWaylandSink * sink) GST_BUFFER_SIZE (wbuffer) = size; return wbuffer; - } static void @@ -457,7 +422,7 @@ gst_wayland_buffer_destroy (GstWaylandSink * sink, GstWlBuffer * buffer) gst_object_unref (sink); } - GST_MINI_OBJECT_CLASS (wlbuffer_parent_class)->finalize (GST_MINI_OBJECT + GST_MINI_OBJECT_CLASS (gst_wlbuffer_parent_class)->finalize (GST_MINI_OBJECT (buffer)); } @@ -521,7 +486,6 @@ gst_wayland_sink_buffer_alloc (GstBaseSink * bsink, guint64 offset, guint size, gst_caps_unref (desired_caps); return ret; - } static gboolean @@ -531,22 +495,13 @@ gst_wayland_sink_set_caps (GstBaseSink * bsink, GstCaps * caps) const GstStructure *structure; GstCaps *allowed_caps; gboolean ret = TRUE; - GstCaps *intersection; GST_LOG_OBJECT (sink, "set caps %" GST_PTR_FORMAT, caps); - structure = gst_caps_get_structure (caps, 0); - allowed_caps = gst_pad_get_caps (GST_BASE_SINK_PAD (bsink)); - /* We intersect those caps with our template to make sure they are correct */ - intersection = gst_caps_intersect (allowed_caps, caps); - gst_caps_unref (allowed_caps); - - if (gst_caps_is_empty (intersection)) { - gst_caps_unref (intersection); + if (!gst_caps_can_intersect (allowed_caps, caps)) return FALSE; - } structure = gst_caps_get_structure (caps, 0); @@ -558,8 +513,6 @@ gst_wayland_sink_set_caps (GstBaseSink * bsink, GstCaps * caps) gst_caps_replace (&sink->caps, caps); - gst_caps_unref (intersection); - return TRUE; } @@ -593,7 +546,7 @@ create_window (GstWaylandSink * sink, struct display *display, int width, window->shell_surface = wl_shell_get_shell_surface (display->shell, window->surface); -// wl_shell_surface_set_toplevel (window->shell_surface); + /* wl_shell_surface_set_toplevel (window->shell_surface); */ wl_shell_surface_set_fullscreen (window->shell_surface, WL_SHELL_SURFACE_FULLSCREEN_METHOD_DEFAULT, 0, NULL); @@ -602,7 +555,6 @@ create_window (GstWaylandSink * sink, struct display *display, int width, g_mutex_unlock (sink->wayland_lock); } - static gboolean gst_wayland_sink_start (GstBaseSink * bsink) { @@ -635,7 +587,6 @@ gst_wayland_sink_preroll (GstBaseSink * bsink, GstBuffer * buffer) return gst_wayland_sink_render (bsink, buffer); } - static GstFlowReturn gst_wayland_sink_render (GstBaseSink * bsink, GstBuffer * buffer) { @@ -674,15 +625,6 @@ gst_wayland_sink_render (GstBaseSink * bsink, GstBuffer * buffer) if (mem_cpy) { GstWlBuffer *wlbuf = wayland_buffer_create (sink); - /*Fixme: remove the memcpy and add memory allocation stuffs to buff_alloc */ - /*guint8 *src = GST_BUFFER_DATA (buffer); - guint len = GST_BUFFER_SIZE (buffer) / sink->height; - - for (i = 0; i < sink->height; i++) { - memcpy (data, src, len); - src += len; - data += len; - } */ memcpy (GST_BUFFER_DATA (wlbuf), GST_BUFFER_DATA (buffer), GST_BUFFER_SIZE (buffer)); @@ -735,4 +677,5 @@ plugin_init (GstPlugin * plugin) GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "waylandsink", - "Wayland Video Sink", plugin_init, VERSION, "LGPL", "gst-wayland", "") + "Wayland Video Sink", plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, + GST_PACKAGE_ORIGIN) diff --git a/ext/wayland/gstwaylandsink.h b/ext/wayland/gstwaylandsink.h index 56fffd8234..f9c1ca87cb 100644 --- a/ext/wayland/gstwaylandsink.h +++ b/ext/wayland/gstwaylandsink.h @@ -21,6 +21,19 @@ #ifndef __GST_WAYLAND_VIDEO_SINK_H__ #define __GST_WAYLAND_VIDEO_SINK_H__ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + #include #include #include @@ -67,6 +80,7 @@ typedef struct _GstWaylandSinkClass GstWaylandSinkClass; #define GST_WLBUFFER (obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_WLBUFFER, GstWlBuffer)) typedef struct _GstWlBuffer GstWlBuffer; +typedef struct _GstWlBufferClass GstWlBufferClass; struct _GstWlBuffer { GstBuffer buffer; /* Extending GstBuffer */ @@ -76,6 +90,11 @@ struct _GstWlBuffer { GstWaylandSink *wlsink; }; +struct _GstWlBufferClass +{ + GstBufferClass parent_class; +}; + struct _GstWaylandSink { @@ -103,11 +122,10 @@ struct _GstWaylandSink struct _GstWaylandSinkClass { GstVideoSinkClass parent; - }; GType gst_wayland_sink_get_type (void) G_GNUC_CONST; -GType gst_dfbsurface_get_type (void); +GType gst_wlbuffer_get_type (void); G_END_DECLS #endif /* __GST_WAYLAND_VIDEO_SINK_H__ */ From 7f70d42837113c31397db60597dd143624bc8d06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Tue, 13 Mar 2012 20:50:04 +0000 Subject: [PATCH 084/138] inter: fix warnings when gst-inspecting interaudio{src,sink} The channel property isn't implemented, so don't register it. --- gst/inter/gstinteraudiosink.c | 2 ++ gst/inter/gstinteraudiosrc.c | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/gst/inter/gstinteraudiosink.c b/gst/inter/gstinteraudiosink.c index 342ebf519f..db81811473 100644 --- a/gst/inter/gstinteraudiosink.c +++ b/gst/inter/gstinteraudiosink.c @@ -151,10 +151,12 @@ gst_inter_audio_sink_class_init (GstInterAudioSinkClass * klass) base_sink_class->unlock_stop = GST_DEBUG_FUNCPTR (gst_inter_audio_sink_unlock_stop); +#if 0 g_object_class_install_property (gobject_class, PROP_CHANNEL, g_param_spec_string ("channel", "Channel", "Channel name to match inter src and sink elements", "default", G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); +#endif } static void diff --git a/gst/inter/gstinteraudiosrc.c b/gst/inter/gstinteraudiosrc.c index af9c295b20..48641a53ed 100644 --- a/gst/inter/gstinteraudiosrc.c +++ b/gst/inter/gstinteraudiosrc.c @@ -159,11 +159,12 @@ gst_inter_audio_src_class_init (GstInterAudioSrcClass * klass) base_src_class->prepare_seek_segment = GST_DEBUG_FUNCPTR (gst_inter_audio_src_prepare_seek_segment); +#if 0 g_object_class_install_property (gobject_class, PROP_CHANNEL, g_param_spec_string ("channel", "Channel", "Channel name to match inter src and sink elements", "default", G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); - +#endif } static void From 25d92711bc5161223e95c5478696879161f0cf7e Mon Sep 17 00:00:00 2001 From: Dmitry Ketov Date: Wed, 14 Mar 2012 10:24:05 +0100 Subject: [PATCH 085/138] winscreencap: Integrate into autotools build system Fixes bug #672031. --- configure.ac | 30 ++++++++++++++++++++++++++++++ sys/winscreencap/Makefile.am | 15 +++++++++------ 2 files changed, 39 insertions(+), 6 deletions(-) diff --git a/configure.ac b/configure.ac index b4993f95dd..37d7859d4c 100644 --- a/configure.ac +++ b/configure.ac @@ -528,6 +528,36 @@ AG_GST_CHECK_FEATURE(DIRECTDRAW, [DirectDraw plug-in], directdrawsink, [ AC_SUBST(HAVE_DIRECTDRAW) ]) +dnl Direct3D9 +AM_CONDITIONAL(USE_DIRECT3D9, true) +AG_GST_CHECK_FEATURE(DIRECT3D9, [Direct3D9], winscreencap, [ + HAVE_DIRECT3D="no" + + save_LIBS="$LIBS" + + LIBS="$LIBS -ld3d9 -lgdi32" + AC_MSG_CHECKING(for Direct3D9 LDFLAGS) + + AC_LINK_IFELSE([AC_LANG_PROGRAM([[ +#include +#include +]], [[ + Direct3DCreate9(D3D_SDK_VERSION); +]])], + [HAVE_DIRECT3D9="yes"], + [HAVE_DIRECT3D9="no"]) + AC_MSG_RESULT($HAVE_DIRECT3D9) + + LIBS=$save_LIBS + + if test "x$HAVE_DIRECT3D9" = "xyes"; then + + DIRECT3D9_LIBS="-ld3d9 -lgdi32" + AC_SUBST(DIRECT3D9_LIBS) + fi + AC_SUBST(HAVE_DIRECT3D9) +]) + dnl *** AppleMedia (OS X and iOS) *** translit(dnm, m, l) AM_CONDITIONAL(USE_APPLE_MEDIA, true) HAVE_APPLE_MEDIA="no" diff --git a/sys/winscreencap/Makefile.am b/sys/winscreencap/Makefile.am index d14273b38a..09d80d2c08 100644 --- a/sys/winscreencap/Makefile.am +++ b/sys/winscreencap/Makefile.am @@ -1,8 +1,11 @@ -# This plugin isn't buildable with autotools at this point in time, so just -# ensure everything's listed in EXTRA_DIST +plugin_LTLIBRARIES = libgstwinscreencap.la -EXTRA_DIST = \ - gstdx9screencapsrc.c gstdx9screencapsrc.h \ - gstgdiscreencapsrc.c gstgdiscreencapsrc.h \ - gstwinscreencap.c gstwinscreencap.h +libgstwinscreencap_la_SOURCES = gstdx9screencapsrc.c gstgdiscreencapsrc.c gstwinscreencap.c +libgstwinscreencap_la_CFLAGS = $(GST_CFLAGS) $(GST_BASE_CFLAGS) \ + $(GST_PLUGINS_BASE_CFLAGS) +libgstwinscreencap_la_LIBADD = $(GST_BASE_LIBS) $(GST_PLUGINS_BASE_LIBS) \ + $(DIRECT3D9_LIBS) +libgstwinscreencap_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstwinscreencap_la_LIBTOOLFLAGS = --tag=disable-static +noinst_HEADERS= gstwinscreencap.h From 61ca28696f78738e972336d1d65026527cef5795 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Thu, 15 Mar 2012 00:05:41 +0000 Subject: [PATCH 086/138] opencv: make build with opencv 2.3.1 as in debian sid Where highgui.h doesn't exist any more, but only opencv2/highgui/highgui.hpp. Also, not quite sure why we're checking for cvaux.h, it's not used anywhere. --- configure.ac | 6 +----- ext/opencv/MotionCells.h | 4 ++++ ext/opencv/gsttemplatematch.h | 6 +++++- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/configure.ac b/configure.ac index 37d7859d4c..3630a3ab4c 100644 --- a/configure.ac +++ b/configure.ac @@ -1432,16 +1432,12 @@ AG_GST_CHECK_FEATURE(OPENCV, [opencv plugins], opencv, [ AC_LANG_CPLUSPLUS OLD_CPPFLAGS=$CPPFLAGS CPPFLAGS=$OPENCV_CFLAGS - AC_CHECK_HEADER(highgui.h, HAVE_HIGHGUI="yes", HAVE_HIGHGUI="no") - AC_CHECK_HEADER(cvaux.h, HAVE_CVAUX="yes", HAVE_CVAUX="no") + AC_CHECK_HEADERS(highgui.h opencv2/highgui/highgui.hpp, HAVE_HIGHGUI="yes", HAVE_HIGHGUI="no") CPPFLAGS=$OLD_CPPFLAGS AC_LANG_C if test "x$HAVE_HIGHGUI" = "xno"; then AC_MSG_RESULT(highgui.h could not be found.) HAVE_OPENCV="no" - elif test "x$HAVE_CVAUX" = "xno"; then - AC_MSG_RESULT(cvaux.h could not be found.) - HAVE_OPENCV="no" else HAVE_OPENCV="yes" fi diff --git a/ext/opencv/MotionCells.h b/ext/opencv/MotionCells.h index ee84fd6b5b..c5d4b17a5c 100644 --- a/ext/opencv/MotionCells.h +++ b/ext/opencv/MotionCells.h @@ -46,7 +46,11 @@ #define MOTIONCELLS_H_ #include // includes OpenCV definitions +#ifndef __OPENCV_OLD_CV_H__ #include // includes highGUI definitions +#else +#include // includes highGUI definitions +#endif #include #include #include diff --git a/ext/opencv/gsttemplatematch.h b/ext/opencv/gsttemplatematch.h index 7b4b38852c..7e55ac6cf6 100644 --- a/ext/opencv/gsttemplatematch.h +++ b/ext/opencv/gsttemplatematch.h @@ -48,7 +48,11 @@ #include #include -#include +#ifndef __OPENCV_OLD_CV_H__ +#include // includes highGUI definitions +#else +#include // includes highGUI definitions +#endif G_BEGIN_DECLS /* #defines don't like whitespacey bits */ From 25cc93139de8a21ac3fbf092242393e52db4b57a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Thu, 15 Mar 2012 00:13:40 +0000 Subject: [PATCH 087/138] .gitignore: ignore more test binaries and stamp files --- tests/check/elements/.gitignore | 1 + tests/check/libs/.gitignore | 1 + 2 files changed, 2 insertions(+) diff --git a/tests/check/elements/.gitignore b/tests/check/elements/.gitignore index 08043fb77c..c7a3d2a4fb 100644 --- a/tests/check/elements/.gitignore +++ b/tests/check/elements/.gitignore @@ -43,6 +43,7 @@ y4menc videorecordingbin viewfinderbin voaacenc +voamrwbenc vp8dec vp8enc zbar diff --git a/tests/check/libs/.gitignore b/tests/check/libs/.gitignore index 33bb8b6d6f..238cb3d11b 100644 --- a/tests/check/libs/.gitignore +++ b/tests/check/libs/.gitignore @@ -1,3 +1,4 @@ +.dirstamp h264parser mpegvideoparser vc1parser From fead44ad128ddbb054d108ce9489233a04069d65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Thu, 15 Mar 2012 15:47:24 +0000 Subject: [PATCH 088/138] faceoverlay: minor cosmetic changes Remove template maker comments, use our defines for package name and origin. --- gst/faceoverlay/gstfaceoverlay.c | 42 ++------------------------------ 1 file changed, 2 insertions(+), 40 deletions(-) diff --git a/gst/faceoverlay/gstfaceoverlay.c b/gst/faceoverlay/gstfaceoverlay.c index 209f656b43..1140f1c842 100644 --- a/gst/faceoverlay/gstfaceoverlay.c +++ b/gst/faceoverlay/gstfaceoverlay.c @@ -1,5 +1,4 @@ -/* - * GStreamer faceoverlay plugin +/* GStreamer faceoverlay plugin * Copyright (C) 2011 Laura Lucas Alday * * Permission is hereby granted, free of charge, to any person obtaining a @@ -76,13 +75,6 @@ GST_DEBUG_CATEGORY_STATIC (gst_face_overlay_debug); #define GST_STR_VIDEO_CAPS GST_VIDEO_CAPS_ARGB #endif -/* Filter signals and args */ -enum -{ - /* FILL ME */ - LAST_SIGNAL -}; - enum { PROP_0, @@ -319,9 +311,6 @@ gst_face_overlay_message_handler (GstBin * bin, GstMessage * message) GST_BIN_CLASS (parent_class)->handle_message (bin, message); } -/* GObject vmethod implementations */ -/* the _base_init() function is meant to initialize class and child class - * properties during each new child class creation */ static void gst_face_overlay_base_init (gpointer gclass) { @@ -337,10 +326,6 @@ gst_face_overlay_base_init (gpointer gclass) gst_element_class_add_static_pad_template (element_class, &sink_factory); } -/* initialize the faceoverlay's class */ -/* the _class_init() function is used to initialise the class only once - * (specifying what signals, arguments and virtual functions the class has and - * setting up global state) */ static void gst_face_overlay_class_init (GstFaceOverlayClass * klass) { @@ -380,15 +365,8 @@ gst_face_overlay_class_init (GstFaceOverlayClass * klass) GST_DEBUG_FUNCPTR (gst_face_overlay_message_handler); gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_face_overlay_change_state); - } -/* initialize the new element - * instantiate pads and add them to element - * set pad calback functions - * initialize instance structure - * the _init() function is used to initialise a specific instance of this type. - */ static void gst_face_overlay_init (GstFaceOverlay * filter, GstFaceOverlayClass * gclass) { @@ -407,7 +385,6 @@ gst_face_overlay_init (GstFaceOverlay * filter, GstFaceOverlayClass * gclass) filter->srcpad = gst_pad_new_from_static_template (&src_factory, "src"); gst_element_add_pad (GST_ELEMENT (filter), filter->srcpad); - } static void @@ -466,14 +443,9 @@ gst_face_overlay_get_property (GObject * object, guint prop_id, } } -/* entry point to initialize the plug-in - * initialize the plug-in itself - * register the element factories and other features - */ static gboolean faceoverlay_init (GstPlugin * faceoverlay) { - /* debug category for fltering log messages */ GST_DEBUG_CATEGORY_INIT (gst_face_overlay_debug, "faceoverlay", 0, "SVG Face Overlay"); @@ -481,18 +453,8 @@ faceoverlay_init (GstPlugin * faceoverlay) GST_TYPE_FACEOVERLAY); } -/* PACKAGE: this is usually set by autotools depending on some _INIT macro - * in configure.ac and then written into and defined in config.h, but we can - * just set it ourselves here in case someone doesn't use autotools to - * compile this code. GST_PLUGIN_DEFINE needs PACKAGE to be defined. - */ -#ifndef PACKAGE -#define PACKAGE "faceoverlay" -#endif - -/* gstreamer looks for this structure to register plugins */ GST_PLUGIN_DEFINE (GST_VERSION_MAJOR, GST_VERSION_MINOR, "faceoverlay", "SVG Face Overlay", - faceoverlay_init, VERSION, "LGPL", "GStreamer", "http://gstreamer.net/") + faceoverlay_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN) From d405ea2e632363e560dd3784177f249196bb2bc1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Thu, 15 Mar 2012 16:52:44 +0000 Subject: [PATCH 089/138] faceoverlay: fix weird pad creation code The element would create normal pads in its instance_init function, and then later in NULL->READY create the elements it needs, remove the pads created in the instance_init function, and add new ghost pads instead. Not without saving the external peer pads of the old pads of course, which it would promptly re-link to the new ghost pads. Do all of that a bit differently. Fixes the generic/states.check unit test. https://bugzilla.gnome.org/show_bug.cgi?id=670588 --- gst/faceoverlay/gstfaceoverlay.c | 180 +++++++++++-------------------- gst/faceoverlay/gstfaceoverlay.h | 7 +- 2 files changed, 68 insertions(+), 119 deletions(-) diff --git a/gst/faceoverlay/gstfaceoverlay.c b/gst/faceoverlay/gstfaceoverlay.c index 1140f1c842..dd3818911f 100644 --- a/gst/faceoverlay/gstfaceoverlay.c +++ b/gst/faceoverlay/gstfaceoverlay.c @@ -109,121 +109,62 @@ static void gst_face_overlay_message_handler (GstBin * bin, static GstStateChangeReturn gst_face_overlay_change_state (GstElement * element, GstStateChange transition); static gboolean gst_face_overlay_create_children (GstFaceOverlay * filter); -static gboolean gst_face_overlay_reset (GstFaceOverlay * filter); -static gboolean gst_face_overlay_create_pad (GstFaceOverlay * filter, - GstPad * filter_pad, const char *pad_name, GstElement * child_element); -static gboolean toggle_pads_link_state (GstPad * pad1, GstPad * pad2); - - -static gboolean -toggle_pads_link_state (GstPad * pad1, GstPad * pad2) -{ - gboolean ok = TRUE; - - if (gst_pad_is_linked (pad1)) { - if (gst_pad_get_direction (pad1) == GST_PAD_SINK) - gst_pad_unlink (pad2, pad1); - else - gst_pad_unlink (pad1, pad2); - } else { - if (gst_pad_get_direction (pad1) == GST_PAD_SINK) - ok &= (gst_pad_link (pad2, pad1) == 0); - else - ok &= (gst_pad_link (pad1, pad2) == 0); - } - - return ok; -} - -/* Unlinks and removes the pad that was created in gst_face_overlay_init () - * and adds the internal element ghost pad instead */ -static gboolean -gst_face_overlay_create_pad (GstFaceOverlay * filter, GstPad * filter_pad, - const char *pad_name, GstElement * child_element) -{ - GstPad *peer = NULL; - GstPad *pad = NULL; - gboolean ok = TRUE; - - /* get the outside world pad connected to faceoverlay src/sink pad */ - peer = gst_pad_get_peer (filter_pad); - - /* unlink and remove the faceoverlay src/sink pad */ - toggle_pads_link_state (peer, filter_pad); - - gst_element_remove_pad (GST_ELEMENT (filter), filter_pad); - - /* add a ghost pad pointing to the child element pad (facedetect sink or - * svg_overlay src depending on filter_pad direction) and add it to - * faceoverlay bin */ - pad = gst_element_get_static_pad (child_element, pad_name); - filter_pad = gst_ghost_pad_new (pad_name, pad); - gst_object_unref (GST_OBJECT (pad)); - - gst_element_add_pad (GST_ELEMENT (filter), filter_pad); - - /* link the child element pad to the outside world thru the ghost pad */ - toggle_pads_link_state (peer, filter_pad); - - g_object_unref (peer); - - return ok; -} - -static gboolean -gst_face_overlay_reset (GstFaceOverlay * filter) -{ - gst_element_set_state (filter->face_detect, GST_STATE_NULL); - gst_bin_remove (GST_BIN (filter), filter->face_detect); - filter->face_detect = NULL; - - gst_element_set_state (filter->svg_overlay, GST_STATE_NULL); - gst_bin_remove (GST_BIN (filter), filter->svg_overlay); - filter->svg_overlay = NULL; - - gst_element_set_state (filter->colorspace, GST_STATE_NULL); - gst_bin_remove (GST_BIN (filter), filter->colorspace); - filter->colorspace = NULL; - - return TRUE; -} static gboolean gst_face_overlay_create_children (GstFaceOverlay * filter) { - gboolean ret = TRUE; + GstElement *csp, *face_detect, *overlay; + GstPad *pad; + + csp = gst_element_factory_make ("ffmpegcolorspace", NULL); + face_detect = gst_element_factory_make ("facedetect", NULL); + overlay = gst_element_factory_make ("rsvgoverlay", NULL); + + /* FIXME: post missing-plugin messages on NULL->READY if needed */ + if (csp == NULL || face_detect == NULL || overlay == NULL) + goto missing_element; + + g_object_set (face_detect, "display", FALSE, NULL); + + gst_bin_add_many (GST_BIN (filter), face_detect, csp, overlay, NULL); + filter->svg_overlay = overlay; + + if (!gst_element_link_many (face_detect, csp, overlay, NULL)) + GST_ERROR_OBJECT (filter, "couldn't link elements"); + + pad = gst_element_get_static_pad (face_detect, "sink"); + if (!gst_ghost_pad_set_target (GST_GHOST_PAD (filter->sinkpad), pad)) + GST_ERROR_OBJECT (filter->sinkpad, "couldn't set sinkpad target"); + gst_object_unref (pad); + + pad = gst_element_get_static_pad (overlay, "src"); + if (!gst_ghost_pad_set_target (GST_GHOST_PAD (filter->srcpad), pad)) + GST_ERROR_OBJECT (filter->srcpad, "couldn't set srcpad target"); + gst_object_unref (pad); + + return TRUE; + +/* ERRORS */ +missing_element: + { + /* clean up */ + if (csp == NULL) + GST_ERROR_OBJECT (filter, "ffmpegcolorspace element not found"); + else + gst_object_unref (csp); + + if (face_detect == NULL) + GST_ERROR_OBJECT (filter, "facedetect element not found (opencv plugin)"); + else + gst_object_unref (face_detect); + + if (overlay == NULL) + GST_ERROR_OBJECT (filter, "rsvgoverlay element not found (rsvg plugin)"); + else + gst_object_unref (overlay); - if ((filter->colorspace = gst_element_factory_make ("ffmpegcolorspace", - NULL)) == NULL) { return FALSE; } - - if ((filter->face_detect = gst_element_factory_make ("facedetect", - NULL)) == NULL) { - return FALSE; - } - g_object_set (filter->face_detect, "display", 0, NULL); - - if ((filter->svg_overlay = gst_element_factory_make ("rsvgoverlay", - NULL)) == NULL) { - return FALSE; - } - - gst_bin_add_many (GST_BIN (filter), - filter->face_detect, filter->colorspace, filter->svg_overlay, NULL); - - ret &= gst_element_link_pads (filter->face_detect, "src", - filter->colorspace, "sink"); - ret &= gst_element_link_pads (filter->colorspace, "src", - filter->svg_overlay, "sink"); - - ret &= gst_face_overlay_create_pad (filter, filter->sinkpad, "sink", - filter->face_detect); - ret &= gst_face_overlay_create_pad (filter, filter->srcpad, "src", - filter->svg_overlay); - - return ret; - } static GstStateChangeReturn @@ -234,8 +175,12 @@ gst_face_overlay_change_state (GstElement * element, GstStateChange transition) switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: - if (!gst_face_overlay_create_children (filter)) + if (filter->svg_overlay == NULL) { + GST_ELEMENT_ERROR (filter, CORE, MISSING_PLUGIN, (NULL), + ("Some required plugins are missing, probably either the opencv " + "facedetect element or rsvgoverlay")); return GST_STATE_CHANGE_FAILURE; + } break; default: break; @@ -244,9 +189,6 @@ gst_face_overlay_change_state (GstElement * element, GstStateChange transition) ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); switch (transition) { - case GST_STATE_CHANGE_READY_TO_NULL: - gst_face_overlay_reset (filter); - break; default: break; } @@ -370,21 +312,27 @@ gst_face_overlay_class_init (GstFaceOverlayClass * klass) static void gst_face_overlay_init (GstFaceOverlay * filter, GstFaceOverlayClass * gclass) { + GstPadTemplate *tmpl; + filter->x = 0; filter->y = 0; filter->w = 1; filter->h = 1; - filter->colorspace = NULL; filter->svg_overlay = NULL; - filter->face_detect = NULL; filter->location = NULL; filter->process_message = TRUE; - filter->sinkpad = gst_pad_new_from_static_template (&sink_factory, "sink"); + tmpl = gst_static_pad_template_get (&sink_factory); + filter->sinkpad = gst_ghost_pad_new_no_target_from_template ("sink", tmpl); + gst_object_unref (tmpl); gst_element_add_pad (GST_ELEMENT (filter), filter->sinkpad); - filter->srcpad = gst_pad_new_from_static_template (&src_factory, "src"); + tmpl = gst_static_pad_template_get (&src_factory); + filter->srcpad = gst_ghost_pad_new_no_target_from_template ("src", tmpl); + gst_object_unref (tmpl); gst_element_add_pad (GST_ELEMENT (filter), filter->srcpad); + + gst_face_overlay_create_children (filter); } static void diff --git a/gst/faceoverlay/gstfaceoverlay.h b/gst/faceoverlay/gstfaceoverlay.h index 7b8e50c00b..7f4427c28e 100644 --- a/gst/faceoverlay/gstfaceoverlay.h +++ b/gst/faceoverlay/gstfaceoverlay.h @@ -1,5 +1,4 @@ -/* - * GStreamer faceoverlay plugin +/* GStreamer faceoverlay plugin * Copyright (C) 2011 Laura Lucas Alday * * Permission is hereby granted, free of charge, to any person obtaining a @@ -47,7 +46,7 @@ #include G_BEGIN_DECLS -/* #defines don't like whitespacey bits */ + #define GST_TYPE_FACEOVERLAY \ (gst_face_overlay_get_type()) #define GST_FACEOVERLAY(obj) \ @@ -58,6 +57,7 @@ G_BEGIN_DECLS (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_FACEOVERLAY)) #define GST_IS_FACEOVERLAY_CLASS(klass) \ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_FACEOVERLAY)) + typedef struct _GstFaceOverlay GstFaceOverlay; typedef struct _GstFaceOverlayClass GstFaceOverlayClass; @@ -88,4 +88,5 @@ struct _GstFaceOverlayClass GType gst_face_overlay_get_type (void); G_END_DECLS + #endif /* __GST_FACEOVERLAY_H__ */ From e1e827d364942ceb6f6fd61c6ae4bb5ff3db6fdc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Thu, 15 Mar 2012 17:26:14 +0000 Subject: [PATCH 090/138] rsvgoverlay: fix crash due to double adapter unref --- ext/rsvg/gstrsvgoverlay.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/ext/rsvg/gstrsvgoverlay.c b/ext/rsvg/gstrsvgoverlay.c index 42de199f75..7f12f8f11d 100644 --- a/ext/rsvg/gstrsvgoverlay.c +++ b/ext/rsvg/gstrsvgoverlay.c @@ -336,7 +336,7 @@ gst_rsvg_overlay_data_sink_event (GstPad * pad, GstEvent * event) GST_RSVG_UNLOCK (overlay); } - case GST_EVENT_FLUSH_START: + case GST_EVENT_FLUSH_STOP: gst_adapter_clear (overlay->adapter); break; @@ -436,10 +436,11 @@ gst_rsvg_overlay_stop (GstBaseTransform * btrans) if (overlay->handle) { g_object_unref (overlay->handle); - g_object_unref (overlay->adapter); overlay->handle = NULL; } + gst_adapter_clear (overlay->adapter); + return TRUE; } From 55b0f1e60168571ebbbd7a99ab51a687607a6619 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Thu, 15 Mar 2012 17:42:56 +0000 Subject: [PATCH 091/138] faceoverlay: fix pad templates Use generic and unspecififed rgb/caps for now. The exact caps supported depend on the facedetect element and rsvgoverlay. It's not clear how this worked before, since facedetect only accepts 24-bit RGB, but the caps advertised 32-bit ARGB/BGRA. In any case, we don't want to force anything really, so that if any of those elements acquires support for additional formats we pick those up automatically. --- gst/faceoverlay/gstfaceoverlay.c | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/gst/faceoverlay/gstfaceoverlay.c b/gst/faceoverlay/gstfaceoverlay.c index dd3818911f..ebb2de9b8d 100644 --- a/gst/faceoverlay/gstfaceoverlay.c +++ b/gst/faceoverlay/gstfaceoverlay.c @@ -69,12 +69,6 @@ GST_DEBUG_CATEGORY_STATIC (gst_face_overlay_debug); #define GST_CAT_DEFAULT gst_face_overlay_debug -#if G_BYTE_ORDER == G_LITTLE_ENDIAN -#define GST_STR_VIDEO_CAPS GST_VIDEO_CAPS_BGRA -#else -#define GST_STR_VIDEO_CAPS GST_VIDEO_CAPS_ARGB -#endif - enum { PROP_0, @@ -85,17 +79,16 @@ enum PROP_H }; -/* the capabilities of the inputs and outputs. */ static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, - GST_STATIC_CAPS (GST_STR_VIDEO_CAPS) + GST_STATIC_CAPS ("video/x-raw-rgb; video/x-raw-yuv") ); static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", GST_PAD_SRC, GST_PAD_ALWAYS, - GST_STATIC_CAPS (GST_STR_VIDEO_CAPS) + GST_STATIC_CAPS ("video/x-raw-rgb; video/x-raw-yuv") ); GST_BOILERPLATE (GstFaceOverlay, gst_face_overlay, GstBin, GST_TYPE_BIN); From 549447d2880b6af7a59967039b34675f9b92eb73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Thu, 15 Mar 2012 17:47:58 +0000 Subject: [PATCH 092/138] faceoverlay: move face handling into own function and handle 0 face count When a face disappears, we seem to get a message from facedetect with a face count of 0, which we want to just ignore instead of trying to access face #-1, which causes nasty warnings. --- gst/faceoverlay/gstfaceoverlay.c | 106 +++++++++++++++++-------------- 1 file changed, 58 insertions(+), 48 deletions(-) diff --git a/gst/faceoverlay/gstfaceoverlay.c b/gst/faceoverlay/gstfaceoverlay.c index ebb2de9b8d..b3442b2bc2 100644 --- a/gst/faceoverlay/gstfaceoverlay.c +++ b/gst/faceoverlay/gstfaceoverlay.c @@ -189,58 +189,68 @@ gst_face_overlay_change_state (GstElement * element, GstStateChange transition) return ret; } +static void +gst_face_overlay_handle_faces (GstFaceOverlay * filter, GstStructure * s) +{ + guint x, y, width, height; + int delta_x, delta_y, svg_x, svg_y, svg_width, svg_height; + const GstStructure *face; + const GValue *faces_list, *face_val; + int face_count; + +#if 0 + /* optionally draw the image once every two messages for better performance */ + filter->process_message = !filter->process_message; + if (!filter->process_message) + return; +#endif + + faces_list = gst_structure_get_value (s, "faces"); + face_count = gst_value_list_get_size (faces_list); + GST_LOG_OBJECT (filter, "face count: %d", face_count); + + /* FIXME: should we clear the overlay in this case? */ + if (face_count == 0) + return; + + /* The last face in the list seems to be the right one, objects mistakenly + * detected as faces for a couple of frames seem to be in the list + * beginning. TODO: needs confirmation. */ + face_val = gst_value_list_get_value (faces_list, face_count - 1); + face = gst_value_get_structure (face_val); + gst_structure_get_uint (face, "x", &x); + gst_structure_get_uint (face, "y", &y); + gst_structure_get_uint (face, "width", &width); + gst_structure_get_uint (face, "height", &height); + + /* Apply x and y offsets relative to face position and size. + * Set image width and height as a fraction of face width and height. + * Cast to int since face position and size will never be bigger than + * G_MAX_INT and we may have negative values as svg_x or svg_y */ + + delta_x = (int) (filter->x * (int) width); + svg_x = (int) x + delta_x; + + delta_y = (int) (filter->y * (int) height); + svg_y = (int) y + delta_y; + + svg_width = (int) width *filter->w; + svg_height = (int) height *filter->h; + + GST_LOG_OBJECT (filter, "setting overlay to %d x %d @ %d,%d (file: %s)", + svg_width, svg_height, svg_x, svg_y, GST_STR_NULL (filter->location)); + + g_object_set (filter->svg_overlay, + "location", filter->location, + "x", svg_x, "y", svg_y, "width", svg_width, "height", svg_height, NULL); +} + static void gst_face_overlay_message_handler (GstBin * bin, GstMessage * message) { if (GST_MESSAGE_TYPE (message) == GST_MESSAGE_ELEMENT && - strcmp (gst_structure_get_name (message->structure), "facedetect") == 0) { - GstFaceOverlay *filter = GST_FACEOVERLAY (bin); - - /* optionally draw the image once every two messages for better performance - * filter->process_message = !filter->process_message; - * if(!filter->process_message) - * return; - */ - - guint x, y, width, height; - int delta_x, delta_y, svg_x, svg_y, svg_width, svg_height; - const GstStructure *face; - int face_count; - - face_count = - gst_value_list_get_size (gst_structure_get_value (message->structure, - "faces")); - - /* The last face in the list seems to be the right one, objects mistakenly - * detected as faces for a couple of frames seem to be in the list - * beginning. TODO: needs confirmation. */ - face = - gst_value_get_structure (gst_value_list_get_value - (gst_structure_get_value (message->structure, "faces"), - face_count - 1)); - gst_structure_get_uint (face, "x", &x); - gst_structure_get_uint (face, "y", &y); - gst_structure_get_uint (face, "width", &width); - gst_structure_get_uint (face, "height", &height); - - /* Apply x and y offsets relative to face position and size. - * Set image width and height as a fraction of face width and height. - * Cast to int since face position and size will never be bigger than - * G_MAX_INT and we may have negative values as svg_x or svg_y */ - - delta_x = (int) (filter->x * (int) width); - svg_x = (int) x + delta_x; - - delta_y = (int) (filter->y * (int) height); - svg_y = (int) y + delta_y; - - svg_width = (int) width *filter->w; - svg_height = (int) height *filter->h; - - g_object_set (filter->svg_overlay, - "location", filter->location, - "x", svg_x, "y", svg_y, "width", svg_width, "height", svg_height, NULL); - + gst_structure_has_name (message->structure, "facedetect")) { + gst_face_overlay_handle_faces (GST_FACEOVERLAY (bin), message->structure); } GST_BIN_CLASS (parent_class)->handle_message (bin, message); From 3bbb0387c48689597720e5ff337ac6929d448a1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Thu, 15 Mar 2012 18:08:09 +0000 Subject: [PATCH 093/138] faceoverlay: don't make rsvgoverlay reload the SVG for every single frame Only set location on rsvgoverlay if it has changed. --- gst/faceoverlay/gstfaceoverlay.c | 13 ++++++++++--- gst/faceoverlay/gstfaceoverlay.h | 2 ++ 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/gst/faceoverlay/gstfaceoverlay.c b/gst/faceoverlay/gstfaceoverlay.c index b3442b2bc2..da3cb40705 100644 --- a/gst/faceoverlay/gstfaceoverlay.c +++ b/gst/faceoverlay/gstfaceoverlay.c @@ -174,6 +174,7 @@ gst_face_overlay_change_state (GstElement * element, GstStateChange transition) "facedetect element or rsvgoverlay")); return GST_STATE_CHANGE_FAILURE; } + filter->update_svg = TRUE; break; default: break; @@ -237,11 +238,16 @@ gst_face_overlay_handle_faces (GstFaceOverlay * filter, GstStructure * s) svg_width = (int) width *filter->w; svg_height = (int) height *filter->h; - GST_LOG_OBJECT (filter, "setting overlay to %d x %d @ %d,%d (file: %s)", - svg_width, svg_height, svg_x, svg_y, GST_STR_NULL (filter->location)); + if (filter->update_svg) { + GST_DEBUG_OBJECT (filter, "set rsvgoverlay location=%s", filter->location); + g_object_set (filter->svg_overlay, "location", filter->location, NULL); + filter->update_svg = FALSE; + } + + GST_LOG_OBJECT (filter, "overlay dimensions: %d x %d @ %d,%d", + svg_width, svg_height, svg_x, svg_y); g_object_set (filter->svg_overlay, - "location", filter->location, "x", svg_x, "y", svg_y, "width", svg_width, "height", svg_height, NULL); } @@ -347,6 +353,7 @@ gst_face_overlay_set_property (GObject * object, guint prop_id, switch (prop_id) { case PROP_LOCATION: filter->location = g_value_dup_string (value); + filter->update_svg = TRUE; break; case PROP_X: filter->x = g_value_get_float (value); diff --git a/gst/faceoverlay/gstfaceoverlay.h b/gst/faceoverlay/gstfaceoverlay.h index 7f4427c28e..c21327b11a 100644 --- a/gst/faceoverlay/gstfaceoverlay.h +++ b/gst/faceoverlay/gstfaceoverlay.h @@ -73,6 +73,8 @@ struct _GstFaceOverlay gboolean process_message; + gboolean update_svg; + gchar *location; gfloat x; gfloat y; From 36a6a13f1c3a113b9a68dbd5362072ed937f7a13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Thu, 15 Mar 2012 18:21:37 +0000 Subject: [PATCH 094/138] faceoverlay: add some locking for properties, free previous location when it changes --- gst/faceoverlay/gstfaceoverlay.c | 34 ++++++++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/gst/faceoverlay/gstfaceoverlay.c b/gst/faceoverlay/gstfaceoverlay.c index da3cb40705..9695f0aef5 100644 --- a/gst/faceoverlay/gstfaceoverlay.c +++ b/gst/faceoverlay/gstfaceoverlay.c @@ -197,6 +197,7 @@ gst_face_overlay_handle_faces (GstFaceOverlay * filter, GstStructure * s) int delta_x, delta_y, svg_x, svg_y, svg_width, svg_height; const GstStructure *face; const GValue *faces_list, *face_val; + gchar *new_location = NULL; int face_count; #if 0 @@ -229,6 +230,8 @@ gst_face_overlay_handle_faces (GstFaceOverlay * filter, GstStructure * s) * Cast to int since face position and size will never be bigger than * G_MAX_INT and we may have negative values as svg_x or svg_y */ + GST_OBJECT_LOCK (filter); + delta_x = (int) (filter->x * (int) width); svg_x = (int) x + delta_x; @@ -239,10 +242,16 @@ gst_face_overlay_handle_faces (GstFaceOverlay * filter, GstStructure * s) svg_height = (int) height *filter->h; if (filter->update_svg) { - GST_DEBUG_OBJECT (filter, "set rsvgoverlay location=%s", filter->location); - g_object_set (filter->svg_overlay, "location", filter->location, NULL); + new_location = g_strdup (filter->location); filter->update_svg = FALSE; } + GST_OBJECT_UNLOCK (filter); + + if (new_location != NULL) { + GST_DEBUG_OBJECT (filter, "set rsvgoverlay location=%s", new_location); + g_object_set (filter->svg_overlay, "location", new_location, NULL); + g_free (new_location); + } GST_LOG_OBJECT (filter, "overlay dimensions: %d x %d @ %d,%d", svg_width, svg_height, svg_x, svg_y); @@ -352,20 +361,31 @@ gst_face_overlay_set_property (GObject * object, guint prop_id, switch (prop_id) { case PROP_LOCATION: + GST_OBJECT_LOCK (filter); + g_free (filter->location); filter->location = g_value_dup_string (value); filter->update_svg = TRUE; + GST_OBJECT_UNLOCK (filter); break; case PROP_X: + GST_OBJECT_LOCK (filter); filter->x = g_value_get_float (value); + GST_OBJECT_UNLOCK (filter); break; case PROP_Y: + GST_OBJECT_LOCK (filter); filter->y = g_value_get_float (value); + GST_OBJECT_UNLOCK (filter); break; case PROP_W: + GST_OBJECT_LOCK (filter); filter->w = g_value_get_float (value); + GST_OBJECT_UNLOCK (filter); break; case PROP_H: + GST_OBJECT_LOCK (filter); filter->h = g_value_get_float (value); + GST_OBJECT_UNLOCK (filter); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); @@ -381,19 +401,29 @@ gst_face_overlay_get_property (GObject * object, guint prop_id, switch (prop_id) { case PROP_LOCATION: + GST_OBJECT_LOCK (filter); g_value_set_string (value, filter->location); + GST_OBJECT_UNLOCK (filter); break; case PROP_X: + GST_OBJECT_LOCK (filter); g_value_set_float (value, filter->x); + GST_OBJECT_UNLOCK (filter); break; case PROP_Y: + GST_OBJECT_LOCK (filter); g_value_set_float (value, filter->y); + GST_OBJECT_UNLOCK (filter); break; case PROP_W: + GST_OBJECT_LOCK (filter); g_value_set_float (value, filter->w); + GST_OBJECT_UNLOCK (filter); break; case PROP_H: + GST_OBJECT_LOCK (filter); g_value_set_float (value, filter->h); + GST_OBJECT_UNLOCK (filter); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); From 3f07ebcc37b77ee7c39f964aab6e207eb7ff028f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Thu, 15 Mar 2012 18:26:24 +0000 Subject: [PATCH 095/138] faceoverlay: clear overlay if the face disappears --- gst/faceoverlay/gstfaceoverlay.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/gst/faceoverlay/gstfaceoverlay.c b/gst/faceoverlay/gstfaceoverlay.c index 9695f0aef5..67bd96ee4f 100644 --- a/gst/faceoverlay/gstfaceoverlay.c +++ b/gst/faceoverlay/gstfaceoverlay.c @@ -211,9 +211,14 @@ gst_face_overlay_handle_faces (GstFaceOverlay * filter, GstStructure * s) face_count = gst_value_list_get_size (faces_list); GST_LOG_OBJECT (filter, "face count: %d", face_count); - /* FIXME: should we clear the overlay in this case? */ - if (face_count == 0) + if (face_count == 0) { + GST_DEBUG_OBJECT (filter, "no face, clearing overlay"); + g_object_set (filter->svg_overlay, "location", NULL, NULL); + GST_OBJECT_LOCK (filter); + filter->update_svg = TRUE; + GST_OBJECT_UNLOCK (filter); return; + } /* The last face in the list seems to be the right one, objects mistakenly * detected as faces for a couple of frames seem to be in the list From e6c9b608517c3d54c1eed08ce36c1363788d8570 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Thu, 15 Mar 2012 18:28:01 +0000 Subject: [PATCH 096/138] rsvgoverlay: cosmetic change Rename PROP_FILENAME to PROP_LOCATION to match the name of the property. Add some debug logging. --- ext/rsvg/gstrsvgoverlay.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/ext/rsvg/gstrsvgoverlay.c b/ext/rsvg/gstrsvgoverlay.c index 7f12f8f11d..1673829c29 100644 --- a/ext/rsvg/gstrsvgoverlay.c +++ b/ext/rsvg/gstrsvgoverlay.c @@ -72,7 +72,7 @@ enum { PROP_0, PROP_DATA, - PROP_FILENAME, + PROP_LOCATION, PROP_FIT_TO_FRAME, PROP_X, PROP_Y, @@ -164,6 +164,8 @@ gst_rsvg_overlay_set_svg_data (GstRsvgOverlay * overlay, const gchar * data, overlay->svg_width = svg_dimension.width; overlay->svg_height = svg_dimension.height; gst_base_transform_set_passthrough (btrans, FALSE); + GST_INFO_OBJECT (overlay, "updated SVG, %d x %d", overlay->svg_width, + overlay->svg_height); } } } @@ -184,7 +186,7 @@ gst_rsvg_overlay_set_property (GObject * object, guint prop_id, FALSE); break; } - case PROP_FILENAME: + case PROP_LOCATION: { gst_rsvg_overlay_set_svg_data (overlay, g_value_get_string (value), TRUE); break; @@ -474,7 +476,7 @@ gst_rsvg_overlay_class_init (GstRsvgOverlayClass * klass) g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_DATA, g_param_spec_string ("data", "data", "SVG data.", "", G_PARAM_WRITABLE | G_PARAM_STATIC_STRINGS)); - g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_FILENAME, + g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_LOCATION, g_param_spec_string ("location", "location", "SVG file location.", "", G_PARAM_WRITABLE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_FIT_TO_FRAME, From 3d7c8aad7024014fd9e48f5c52d42bcc5564c2d6 Mon Sep 17 00:00:00 2001 From: Stefan Sauer Date: Thu, 15 Mar 2012 22:22:12 +0100 Subject: [PATCH 097/138] facedetect: don't skip faces Skipping faces at this point makes us lie about the num-ber of faces and also causes leaks. --- ext/opencv/gstfacedetect.c | 87 +++++++++++++++++++------------------- 1 file changed, 43 insertions(+), 44 deletions(-) diff --git a/ext/opencv/gstfacedetect.c b/ext/opencv/gstfacedetect.c index 01126710e9..cff13e7954 100644 --- a/ext/opencv/gstfacedetect.c +++ b/ext/opencv/gstfacedetect.c @@ -514,8 +514,6 @@ gst_face_detect_transform_ip (GstOpencvVideoFilter * base, GstBuffer * buf, for (i = 0; i < (faces ? faces->total : 0); i++) { CvRect *r = (CvRect *) cvGetSeqElem (faces, i); - GValue value = { 0 }; - GstStructure *s; guint mw = filter->min_size_width / 8; guint mh = filter->min_size_height / 8; guint rnx, rny, rnw, rnh; @@ -578,50 +576,51 @@ gst_face_detect_transform_ip (GstOpencvVideoFilter * base, GstBuffer * buf, i, faces->total, r->x, r->y, r->width, r->height, have_eyes, have_nose, have_mouth); - /* ignore 'face' where we don't fix mount/nose/eyes ? */ - if (!(have_eyes && have_nose && have_mouth)) - continue; + if (msg) { + GValue value = { 0 }; + GstStructure *s; - s = gst_structure_new ("face", - "x", G_TYPE_UINT, r->x, - "y", G_TYPE_UINT, r->y, - "width", G_TYPE_UINT, r->width, - "height", G_TYPE_UINT, r->height, NULL); - if (nose && nose->total) { - CvRect *sr = (CvRect *) cvGetSeqElem (nose, 0); - GST_LOG_OBJECT (filter, "nose/%d: x,y = %4u,%4u: w.h = %4u,%4u", - nose->total, rnx + sr->x, rny + sr->y, sr->width, sr->height); - gst_structure_set (s, - "nose->x", G_TYPE_UINT, rnx + sr->x, - "nose->y", G_TYPE_UINT, rny + sr->y, - "nose->width", G_TYPE_UINT, sr->width, - "nose->height", G_TYPE_UINT, sr->height, NULL); - } - if (mouth && mouth->total) { - CvRect *sr = (CvRect *) cvGetSeqElem (mouth, 0); - GST_LOG_OBJECT (filter, "mouth/%d: x,y = %4u,%4u: w.h = %4u,%4u", - mouth->total, rmx + sr->x, rmy + sr->y, sr->width, sr->height); - gst_structure_set (s, - "mouth->x", G_TYPE_UINT, rmx + sr->x, - "mouth->y", G_TYPE_UINT, rmy + sr->y, - "mouth->width", G_TYPE_UINT, sr->width, - "mouth->height", G_TYPE_UINT, sr->height, NULL); - } - if (eyes && eyes->total) { - CvRect *sr = (CvRect *) cvGetSeqElem (eyes, 0); - GST_LOG_OBJECT (filter, "eyes/%d: x,y = %4u,%4u: w.h = %4u,%4u", - eyes->total, rex + sr->x, rey + sr->y, sr->width, sr->height); - gst_structure_set (s, - "eyes->x", G_TYPE_UINT, rex + sr->x, - "eyes->y", G_TYPE_UINT, rey + sr->y, - "eyes->width", G_TYPE_UINT, sr->width, - "eyes->height", G_TYPE_UINT, sr->height, NULL); - } + s = gst_structure_new ("face", + "x", G_TYPE_UINT, r->x, + "y", G_TYPE_UINT, r->y, + "width", G_TYPE_UINT, r->width, + "height", G_TYPE_UINT, r->height, NULL); + if (nose && nose->total) { + CvRect *sr = (CvRect *) cvGetSeqElem (nose, 0); + GST_LOG_OBJECT (filter, "nose/%d: x,y = %4u,%4u: w.h = %4u,%4u", + nose->total, rnx + sr->x, rny + sr->y, sr->width, sr->height); + gst_structure_set (s, + "nose->x", G_TYPE_UINT, rnx + sr->x, + "nose->y", G_TYPE_UINT, rny + sr->y, + "nose->width", G_TYPE_UINT, sr->width, + "nose->height", G_TYPE_UINT, sr->height, NULL); + } + if (mouth && mouth->total) { + CvRect *sr = (CvRect *) cvGetSeqElem (mouth, 0); + GST_LOG_OBJECT (filter, "mouth/%d: x,y = %4u,%4u: w.h = %4u,%4u", + mouth->total, rmx + sr->x, rmy + sr->y, sr->width, sr->height); + gst_structure_set (s, + "mouth->x", G_TYPE_UINT, rmx + sr->x, + "mouth->y", G_TYPE_UINT, rmy + sr->y, + "mouth->width", G_TYPE_UINT, sr->width, + "mouth->height", G_TYPE_UINT, sr->height, NULL); + } + if (eyes && eyes->total) { + CvRect *sr = (CvRect *) cvGetSeqElem (eyes, 0); + GST_LOG_OBJECT (filter, "eyes/%d: x,y = %4u,%4u: w.h = %4u,%4u", + eyes->total, rex + sr->x, rey + sr->y, sr->width, sr->height); + gst_structure_set (s, + "eyes->x", G_TYPE_UINT, rex + sr->x, + "eyes->y", G_TYPE_UINT, rey + sr->y, + "eyes->width", G_TYPE_UINT, sr->width, + "eyes->height", G_TYPE_UINT, sr->height, NULL); + } - g_value_init (&value, GST_TYPE_STRUCTURE); - gst_value_set_structure (&value, s); - gst_value_list_append_value (&facelist, &value); - g_value_unset (&value); + g_value_init (&value, GST_TYPE_STRUCTURE); + gst_value_set_structure (&value, s); + gst_value_list_append_value (&facelist, &value); + g_value_unset (&value); + } if (do_display) { CvPoint center; From a31a698943b2402da2e23886b46e61f9d143ce4e Mon Sep 17 00:00:00 2001 From: Stefan Sauer Date: Thu, 15 Mar 2012 22:49:51 +0100 Subject: [PATCH 098/138] faceoverlay: don't access message fields directly --- gst/faceoverlay/gstfaceoverlay.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/gst/faceoverlay/gstfaceoverlay.c b/gst/faceoverlay/gstfaceoverlay.c index 67bd96ee4f..7d87fc7261 100644 --- a/gst/faceoverlay/gstfaceoverlay.c +++ b/gst/faceoverlay/gstfaceoverlay.c @@ -191,7 +191,7 @@ gst_face_overlay_change_state (GstElement * element, GstStateChange transition) } static void -gst_face_overlay_handle_faces (GstFaceOverlay * filter, GstStructure * s) +gst_face_overlay_handle_faces (GstFaceOverlay * filter, const GstStructure * s) { guint x, y, width, height; int delta_x, delta_y, svg_x, svg_y, svg_width, svg_height; @@ -268,9 +268,12 @@ gst_face_overlay_handle_faces (GstFaceOverlay * filter, GstStructure * s) static void gst_face_overlay_message_handler (GstBin * bin, GstMessage * message) { - if (GST_MESSAGE_TYPE (message) == GST_MESSAGE_ELEMENT && - gst_structure_has_name (message->structure, "facedetect")) { - gst_face_overlay_handle_faces (GST_FACEOVERLAY (bin), message->structure); + if (GST_MESSAGE_TYPE (message) == GST_MESSAGE_ELEMENT) { + const GstStructure *s = gst_message_get_structure (message); + + if (gst_structure_has_name (s, "facedetect")) { + gst_face_overlay_handle_faces (GST_FACEOVERLAY (bin), s); + } } GST_BIN_CLASS (parent_class)->handle_message (bin, message); From 288c6fa26cb87fad9d6695ac4e52f0a090379178 Mon Sep 17 00:00:00 2001 From: Stefan Sauer Date: Thu, 15 Mar 2012 22:58:11 +0100 Subject: [PATCH 099/138] faceoverlay: code cleanups Use glib types and simply expressions in the message handler. --- gst/faceoverlay/gstfaceoverlay.c | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/gst/faceoverlay/gstfaceoverlay.c b/gst/faceoverlay/gstfaceoverlay.c index 7d87fc7261..56c0522f3a 100644 --- a/gst/faceoverlay/gstfaceoverlay.c +++ b/gst/faceoverlay/gstfaceoverlay.c @@ -194,11 +194,11 @@ static void gst_face_overlay_handle_faces (GstFaceOverlay * filter, const GstStructure * s) { guint x, y, width, height; - int delta_x, delta_y, svg_x, svg_y, svg_width, svg_height; + gint svg_x, svg_y, svg_width, svg_height; const GstStructure *face; const GValue *faces_list, *face_val; gchar *new_location = NULL; - int face_count; + gint face_count; #if 0 /* optionally draw the image once every two messages for better performance */ @@ -237,14 +237,11 @@ gst_face_overlay_handle_faces (GstFaceOverlay * filter, const GstStructure * s) GST_OBJECT_LOCK (filter); - delta_x = (int) (filter->x * (int) width); - svg_x = (int) x + delta_x; + svg_x = (gint) x + (gint) (filter->x * width); + svg_y = (gint) y + (gint) (filter->y * height); - delta_y = (int) (filter->y * (int) height); - svg_y = (int) y + delta_y; - - svg_width = (int) width *filter->w; - svg_height = (int) height *filter->h; + svg_width = (gint) (filter->w * width); + svg_height = (gint) (filter->h * height); if (filter->update_svg) { new_location = g_strdup (filter->location); From fbcee587f456dfca7c8dd2fbf163d12804ffd81c Mon Sep 17 00:00:00 2001 From: Stefan Sauer Date: Thu, 15 Mar 2012 23:08:02 +0100 Subject: [PATCH 100/138] facedetect: always send facedetect message The application might like to know, when we don't see the face anymore. --- ext/opencv/gstfacedetect.c | 99 ++++++++++++++++++-------------------- 1 file changed, 46 insertions(+), 53 deletions(-) diff --git a/ext/opencv/gstfacedetect.c b/ext/opencv/gstfacedetect.c index cff13e7954..71bdee6e10 100644 --- a/ext/opencv/gstfacedetect.c +++ b/ext/opencv/gstfacedetect.c @@ -481,7 +481,9 @@ gst_face_detect_transform_ip (GstOpencvVideoFilter * base, GstBuffer * buf, if (filter->cvFaceDetect) { GstMessage *msg = NULL; + GstStructure *s; GValue facelist = { 0 }; + GValue facedata = { 0 }; CvSeq *faces; CvSeq *mouth, *nose, *eyes; gint i; @@ -507,10 +509,8 @@ gst_face_detect_transform_ip (GstOpencvVideoFilter * base, GstBuffer * buf, #endif ); - if (faces && faces->total > 0) { - msg = gst_face_detect_message_new (filter, buf); - g_value_init (&facelist, GST_TYPE_LIST); - } + msg = gst_face_detect_message_new (filter, buf); + g_value_init (&facelist, GST_TYPE_LIST); for (i = 0; i < (faces ? faces->total : 0); i++) { CvRect *r = (CvRect *) cvGetSeqElem (faces, i); @@ -576,51 +576,46 @@ gst_face_detect_transform_ip (GstOpencvVideoFilter * base, GstBuffer * buf, i, faces->total, r->x, r->y, r->width, r->height, have_eyes, have_nose, have_mouth); - if (msg) { - GValue value = { 0 }; - GstStructure *s; - - s = gst_structure_new ("face", - "x", G_TYPE_UINT, r->x, - "y", G_TYPE_UINT, r->y, - "width", G_TYPE_UINT, r->width, - "height", G_TYPE_UINT, r->height, NULL); - if (nose && nose->total) { - CvRect *sr = (CvRect *) cvGetSeqElem (nose, 0); - GST_LOG_OBJECT (filter, "nose/%d: x,y = %4u,%4u: w.h = %4u,%4u", - nose->total, rnx + sr->x, rny + sr->y, sr->width, sr->height); - gst_structure_set (s, - "nose->x", G_TYPE_UINT, rnx + sr->x, - "nose->y", G_TYPE_UINT, rny + sr->y, - "nose->width", G_TYPE_UINT, sr->width, - "nose->height", G_TYPE_UINT, sr->height, NULL); - } - if (mouth && mouth->total) { - CvRect *sr = (CvRect *) cvGetSeqElem (mouth, 0); - GST_LOG_OBJECT (filter, "mouth/%d: x,y = %4u,%4u: w.h = %4u,%4u", - mouth->total, rmx + sr->x, rmy + sr->y, sr->width, sr->height); - gst_structure_set (s, - "mouth->x", G_TYPE_UINT, rmx + sr->x, - "mouth->y", G_TYPE_UINT, rmy + sr->y, - "mouth->width", G_TYPE_UINT, sr->width, - "mouth->height", G_TYPE_UINT, sr->height, NULL); - } - if (eyes && eyes->total) { - CvRect *sr = (CvRect *) cvGetSeqElem (eyes, 0); - GST_LOG_OBJECT (filter, "eyes/%d: x,y = %4u,%4u: w.h = %4u,%4u", - eyes->total, rex + sr->x, rey + sr->y, sr->width, sr->height); - gst_structure_set (s, - "eyes->x", G_TYPE_UINT, rex + sr->x, - "eyes->y", G_TYPE_UINT, rey + sr->y, - "eyes->width", G_TYPE_UINT, sr->width, - "eyes->height", G_TYPE_UINT, sr->height, NULL); - } - - g_value_init (&value, GST_TYPE_STRUCTURE); - gst_value_set_structure (&value, s); - gst_value_list_append_value (&facelist, &value); - g_value_unset (&value); + s = gst_structure_new ("face", + "x", G_TYPE_UINT, r->x, + "y", G_TYPE_UINT, r->y, + "width", G_TYPE_UINT, r->width, + "height", G_TYPE_UINT, r->height, NULL); + if (nose && nose->total) { + CvRect *sr = (CvRect *) cvGetSeqElem (nose, 0); + GST_LOG_OBJECT (filter, "nose/%d: x,y = %4u,%4u: w.h = %4u,%4u", + nose->total, rnx + sr->x, rny + sr->y, sr->width, sr->height); + gst_structure_set (s, + "nose->x", G_TYPE_UINT, rnx + sr->x, + "nose->y", G_TYPE_UINT, rny + sr->y, + "nose->width", G_TYPE_UINT, sr->width, + "nose->height", G_TYPE_UINT, sr->height, NULL); } + if (mouth && mouth->total) { + CvRect *sr = (CvRect *) cvGetSeqElem (mouth, 0); + GST_LOG_OBJECT (filter, "mouth/%d: x,y = %4u,%4u: w.h = %4u,%4u", + mouth->total, rmx + sr->x, rmy + sr->y, sr->width, sr->height); + gst_structure_set (s, + "mouth->x", G_TYPE_UINT, rmx + sr->x, + "mouth->y", G_TYPE_UINT, rmy + sr->y, + "mouth->width", G_TYPE_UINT, sr->width, + "mouth->height", G_TYPE_UINT, sr->height, NULL); + } + if (eyes && eyes->total) { + CvRect *sr = (CvRect *) cvGetSeqElem (eyes, 0); + GST_LOG_OBJECT (filter, "eyes/%d: x,y = %4u,%4u: w.h = %4u,%4u", + eyes->total, rex + sr->x, rey + sr->y, sr->width, sr->height); + gst_structure_set (s, + "eyes->x", G_TYPE_UINT, rex + sr->x, + "eyes->y", G_TYPE_UINT, rey + sr->y, + "eyes->width", G_TYPE_UINT, sr->width, + "eyes->height", G_TYPE_UINT, sr->height, NULL); + } + + g_value_init (&facedata, GST_TYPE_STRUCTURE); + gst_value_set_structure (&facedata, s); + gst_value_list_append_value (&facelist, &facedata); + g_value_unset (&facedata); if (do_display) { CvPoint center; @@ -678,11 +673,9 @@ gst_face_detect_transform_ip (GstOpencvVideoFilter * base, GstBuffer * buf, } } - if (msg) { - gst_structure_set_value (msg->structure, "faces", &facelist); - g_value_unset (&facelist); - gst_element_post_message (GST_ELEMENT (filter), msg); - } + gst_structure_set_value (msg->structure, "faces", &facelist); + g_value_unset (&facelist); + gst_element_post_message (GST_ELEMENT (filter), msg); } return GST_FLOW_OK; From 6fde848ada3a4abd91e345dff179e238ec771bd9 Mon Sep 17 00:00:00 2001 From: Stefan Sauer Date: Thu, 15 Mar 2012 23:17:55 +0100 Subject: [PATCH 101/138] facedetect: move the detector to an own method to hide the ugly ifdefs This improves the readability in the actual processing function. --- ext/opencv/gstfacedetect.c | 47 +++++++++++++++----------------------- 1 file changed, 18 insertions(+), 29 deletions(-) diff --git a/ext/opencv/gstfacedetect.c b/ext/opencv/gstfacedetect.c index 71bdee6e10..6883e2c648 100644 --- a/ext/opencv/gstfacedetect.c +++ b/ext/opencv/gstfacedetect.c @@ -469,6 +469,19 @@ gst_face_detect_message_new (GstFaceDetect * filter, GstBuffer * buf) return gst_message_new_element (GST_OBJECT (filter), s); } +static CvSeq * +gst_face_detect_run_detector (GstFaceDetect * filter, + CvHaarClassifierCascade * detector, gint min_size_width, + gint min_size_height) +{ + return cvHaarDetectObjects (filter->cvGray, detector, + filter->cvStorage, filter->scale_factor, filter->min_neighbors, + filter->flags, cvSize (min_size_width, min_size_height) +#if (CV_MAJOR_VERSION >= 2) && (CV_MINOR_VERSION >= 2) + , cvSize (min_size_width + 2, min_size_height + 2) +#endif + ); +} /* * Performs the face detection @@ -500,14 +513,8 @@ gst_face_detect_transform_ip (GstOpencvVideoFilter * base, GstBuffer * buf, cvCvtColor (img, filter->cvGray, CV_RGB2GRAY); cvClearMemStorage (filter->cvStorage); - faces = - cvHaarDetectObjects (filter->cvGray, filter->cvFaceDetect, - filter->cvStorage, filter->scale_factor, filter->min_neighbors, - filter->flags, cvSize (filter->min_size_width, filter->min_size_height) -#if (CV_MAJOR_VERSION >= 2) && (CV_MINOR_VERSION >= 2) - , cvSize (filter->min_size_width + 2, filter->min_size_height + 2) -#endif - ); + faces = gst_face_detect_run_detector (filter, filter->cvFaceDetect, + filter->min_size_width, filter->min_size_height); msg = gst_face_detect_message_new (filter, buf); g_value_init (&facelist, GST_TYPE_LIST); @@ -529,13 +536,7 @@ gst_face_detect_transform_ip (GstOpencvVideoFilter * base, GstBuffer * buf, rnh = r->height / 2; cvSetImageROI (filter->cvGray, cvRect (rnx, rny, rnw, rnh)); nose = - cvHaarDetectObjects (filter->cvGray, filter->cvNoseDetect, - filter->cvStorage, filter->scale_factor, filter->min_neighbors, - filter->flags, cvSize (mw, mh) -#if (CV_MAJOR_VERSION >= 2) && (CV_MINOR_VERSION >= 2) - , cvSize (mw + 2, mh + 2) -#endif - ); + gst_face_detect_run_detector (filter, filter->cvNoseDetect, mw, mh); have_nose = (nose && nose->total); cvResetImageROI (filter->cvGray); @@ -545,13 +546,7 @@ gst_face_detect_transform_ip (GstOpencvVideoFilter * base, GstBuffer * buf, rmh = r->height / 2; cvSetImageROI (filter->cvGray, cvRect (rmx, rmy, rmw, rmh)); mouth = - cvHaarDetectObjects (filter->cvGray, filter->cvMouthDetect, - filter->cvStorage, filter->scale_factor, filter->min_neighbors, - filter->flags, cvSize (mw, mh) -#if (CV_MAJOR_VERSION >= 2) && (CV_MINOR_VERSION >= 2) - , cvSize (mw + 2, mh + 2) -#endif - ); + gst_face_detect_run_detector (filter, filter->cvMouthDetect, mw, mh); have_mouth = (mouth && mouth->total); cvResetImageROI (filter->cvGray); @@ -561,13 +556,7 @@ gst_face_detect_transform_ip (GstOpencvVideoFilter * base, GstBuffer * buf, reh = r->height / 2; cvSetImageROI (filter->cvGray, cvRect (rex, rey, rew, reh)); eyes = - cvHaarDetectObjects (filter->cvGray, filter->cvEyesDetect, - filter->cvStorage, filter->scale_factor, filter->min_neighbors, - filter->flags, cvSize (mw, mh) -#if (CV_MAJOR_VERSION >= 2) && (CV_MINOR_VERSION >= 2) - , cvSize (mw + 2, mh + 2) -#endif - ); + gst_face_detect_run_detector (filter, filter->cvEyesDetect, mw, mh); have_eyes = (eyes && eyes->total); cvResetImageROI (filter->cvGray); From 2311a0ac0efa3da8306f2aa776a9dbc3e3134062 Mon Sep 17 00:00:00 2001 From: Stefan Sauer Date: Fri, 16 Mar 2012 12:04:11 +0100 Subject: [PATCH 102/138] facedetect: skip detection for unavailable detectors --- ext/opencv/gstfacedetect.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ext/opencv/gstfacedetect.c b/ext/opencv/gstfacedetect.c index 6883e2c648..a52158b231 100644 --- a/ext/opencv/gstfacedetect.c +++ b/ext/opencv/gstfacedetect.c @@ -474,6 +474,9 @@ gst_face_detect_run_detector (GstFaceDetect * filter, CvHaarClassifierCascade * detector, gint min_size_width, gint min_size_height) { + if (!detector) + return NULL; + return cvHaarDetectObjects (filter->cvGray, detector, filter->cvStorage, filter->scale_factor, filter->min_neighbors, filter->flags, cvSize (min_size_width, min_size_height) From f8cf7bf9738210dfdbf639fad1bd28566304f488 Mon Sep 17 00:00:00 2001 From: Stefan Sauer Date: Fri, 16 Mar 2012 12:10:10 +0100 Subject: [PATCH 103/138] faceoverlay: remove blank line in gtk-doc comment --- gst/faceoverlay/gstfaceoverlay.c | 1 - 1 file changed, 1 deletion(-) diff --git a/gst/faceoverlay/gstfaceoverlay.c b/gst/faceoverlay/gstfaceoverlay.c index 56c0522f3a..b923c8fb95 100644 --- a/gst/faceoverlay/gstfaceoverlay.c +++ b/gst/faceoverlay/gstfaceoverlay.c @@ -51,7 +51,6 @@ * Example launch line * |[ * gst-launch autovideosrc ! ffmpegcolorspace ! faceoverlay location=/path/to/gnome-video-effects/pixmaps/bow.svg x=-5 y=-15 w=0.3 h=0.1 ! ffmpegcolorspace ! autovideosink - * ]| * */ From 9ebacafc6ad8deb3be29f1972bd209fbb0c4c4ce Mon Sep 17 00:00:00 2001 From: Vincent Penquerc'h Date: Thu, 15 Mar 2012 17:10:18 +0000 Subject: [PATCH 104/138] rsndvdsrc: post a message with title number and durations https://bugzilla.gnome.org/show_bug.cgi?id=672165 --- ext/resindvd/resindvdsrc.c | 50 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/ext/resindvd/resindvdsrc.c b/ext/resindvd/resindvdsrc.c index 76139aa529..98473694bb 100644 --- a/ext/resindvd/resindvdsrc.c +++ b/ext/resindvd/resindvdsrc.c @@ -2427,6 +2427,53 @@ rsn_dvdsrc_src_event (GstBaseSrc * basesrc, GstEvent * event) return res; } +static void +rsn_dvdsrc_post_title_info (GstElement * element) +{ + resinDvdSrc *src = RESINDVDSRC (element); + GstMessage *message; + GstStructure *s; + int32_t n, ntitles; + int res; + GValue array = { 0 }; + + res = dvdnav_get_number_of_titles (src->dvdnav, &ntitles); + if (res != DVDNAV_STATUS_OK) { + GST_WARNING_OBJECT (src, "Failed to get number of titles: %d", res); + return; + } + + g_value_init (&array, GST_TYPE_ARRAY); + + s = gst_structure_new ("application/x-gst-dvd", "event", + G_TYPE_STRING, "dvd-title-info", NULL); + + for (n = 0; n < ntitles; ++n) { + uint64_t *times, duration; + uint32_t nchapters; + GValue item = { 0 }; + + g_value_init (&item, G_TYPE_UINT64); + + nchapters = + dvdnav_describe_title_chapters (src->dvdnav, n, ×, &duration); + if (nchapters == 0) { + GST_WARNING_OBJECT (src, "Failed to get title %d info", n); + g_value_set_uint64 (&item, GST_CLOCK_TIME_NONE); + } else { + g_value_set_uint64 (&item, gst_util_uint64_scale (duration, GST_SECOND, + 90000)); + } + gst_value_array_append_value (&array, &item); + g_value_unset (&item); + } + gst_structure_set_value (s, "title-durations", &array); + g_value_unset (&array); + + message = gst_message_new_element (GST_OBJECT (src), s); + gst_element_post_message (GST_ELEMENT_CAST (src), message); +} + static GstStateChangeReturn rsn_dvdsrc_change_state (GstElement * element, GstStateChange transition) { @@ -2463,6 +2510,9 @@ rsn_dvdsrc_change_state (GstElement * element, GstStateChange transition) rsn_dvdsrc_check_nav_blocks (src); g_mutex_unlock (src->dvd_lock); break; + case GST_STATE_CHANGE_READY_TO_PAUSED: + rsn_dvdsrc_post_title_info (element); + break; default: break; } From d4509a2fda5bff72201e393f774ebfed8f0137cd Mon Sep 17 00:00:00 2001 From: Stefan Sauer Date: Fri, 16 Mar 2012 12:57:05 +0100 Subject: [PATCH 105/138] opencv: use opencv prefix from pkgconfig to lookup datafiles Don't hardconde /usr to lookup datafiles (such as haar cascades). --- configure.ac | 3 +++ ext/opencv/gstfaceblur.c | 3 ++- ext/opencv/gstfacedetect.c | 9 +++++---- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/configure.ac b/configure.ac index 3630a3ab4c..9cf3de2fce 100644 --- a/configure.ac +++ b/configure.ac @@ -1444,6 +1444,9 @@ AG_GST_CHECK_FEATURE(OPENCV, [opencv plugins], opencv, [ ], [ HAVE_OPENCV="no" ]) + OPENCV_PREFIX="`$PKG_CONFIG --variable=prefix opencv`" + AC_DEFINE_UNQUOTED(OPENCV_PREFIX, "$OPENCV_PREFIX", [opencv install prefix]) + AC_SUBST(OPENCV_PREFIX) AC_SUBST(OPENCV_CFLAGS) AC_SUBST(OPENCV_LIBS) ]) diff --git a/ext/opencv/gstfaceblur.c b/ext/opencv/gstfaceblur.c index 2f9dcf5448..7b801c1ccf 100644 --- a/ext/opencv/gstfaceblur.c +++ b/ext/opencv/gstfaceblur.c @@ -68,7 +68,8 @@ GST_DEBUG_CATEGORY_STATIC (gst_face_blur_debug); #define GST_CAT_DEFAULT gst_face_blur_debug -#define DEFAULT_PROFILE "/usr/share/opencv/haarcascades/haarcascade_frontalface_default.xml" +#define HAAR_CASCADES_DIR OPENCV_PREFIX "/share/opencv/haarcascades/" +#define DEFAULT_PROFILE HAAR_CASCADES_DIR "haarcascade_frontalface_default.xml" /* Filter signals and args */ enum diff --git a/ext/opencv/gstfacedetect.c b/ext/opencv/gstfacedetect.c index a52158b231..89079f07f8 100644 --- a/ext/opencv/gstfacedetect.c +++ b/ext/opencv/gstfacedetect.c @@ -82,10 +82,11 @@ GST_DEBUG_CATEGORY_STATIC (gst_face_detect_debug); #define GST_CAT_DEFAULT gst_face_detect_debug -#define DEFAULT_FACE_PROFILE "/usr/share/opencv/haarcascades/haarcascade_frontalface_default.xml" -#define DEFAULT_NOSE_PROFILE "/usr/share/opencv/haarcascades/haarcascade_mcs_nose.xml" -#define DEFAULT_MOUTH_PROFILE "/usr/share/opencv/haarcascades/haarcascade_mcs_mouth.xml" -#define DEFAULT_EYES_PROFILE "/usr/share/opencv/haarcascades/haarcascade_mcs_eyepair_small.xml" +#define HAAR_CASCADES_DIR OPENCV_PREFIX "/share/opencv/haarcascades/" +#define DEFAULT_FACE_PROFILE HAAR_CASCADES_DIR "haarcascade_frontalface_default.xml" +#define DEFAULT_NOSE_PROFILE HAAR_CASCADES_DIR "haarcascade_mcs_nose.xml" +#define DEFAULT_MOUTH_PROFILE HAAR_CASCADES_DIR "haarcascade_mcs_mouth.xml" +#define DEFAULT_EYES_PROFILE HAAR_CASCADES_DIR "haarcascade_mcs_eyepair_small.xml" #define DEFAULT_SCALE_FACTOR 1.1 #define DEFAULT_FLAGS 0 #define DEFAULT_MIN_NEIGHBORS 3 From 99fb8e941a003e3565aa1a1943e296680c253735 Mon Sep 17 00:00:00 2001 From: Stefan Sauer Date: Fri, 16 Mar 2012 13:14:48 +0100 Subject: [PATCH 106/138] opencv: cosmetic code changes Check for the availability of the detectors in the processing function to avoid setting up the ROIs. Use the booleans for have_xxx more. --- ext/opencv/gstfacedetect.c | 82 +++++++++++++++++++++----------------- 1 file changed, 46 insertions(+), 36 deletions(-) diff --git a/ext/opencv/gstfacedetect.c b/ext/opencv/gstfacedetect.c index 89079f07f8..f53b6eab7e 100644 --- a/ext/opencv/gstfacedetect.c +++ b/ext/opencv/gstfacedetect.c @@ -475,9 +475,6 @@ gst_face_detect_run_detector (GstFaceDetect * filter, CvHaarClassifierCascade * detector, gint min_size_width, gint min_size_height) { - if (!detector) - return NULL; - return cvHaarDetectObjects (filter->cvGray, detector, filter->cvStorage, filter->scale_factor, filter->min_neighbors, filter->flags, cvSize (min_size_width, min_size_height) @@ -534,35 +531,48 @@ gst_face_detect_transform_ip (GstOpencvVideoFilter * base, GstBuffer * buf, /* detect face features */ - rnx = r->x + r->width / 4; - rny = r->y + r->height / 4; - rnw = r->width / 2; - rnh = r->height / 2; - cvSetImageROI (filter->cvGray, cvRect (rnx, rny, rnw, rnh)); - nose = - gst_face_detect_run_detector (filter, filter->cvNoseDetect, mw, mh); - have_nose = (nose && nose->total); - cvResetImageROI (filter->cvGray); + if (filter->cvNoseDetect) { + rnx = r->x + r->width / 4; + rny = r->y + r->height / 4; + rnw = r->width / 2; + rnh = r->height / 2; + cvSetImageROI (filter->cvGray, cvRect (rnx, rny, rnw, rnh)); + nose = + gst_face_detect_run_detector (filter, filter->cvNoseDetect, mw, mh); + have_nose = (nose && nose->total); + cvResetImageROI (filter->cvGray); + } else { + have_nose = FALSE; + } - rmx = r->x; - rmy = r->y + r->height / 2; - rmw = r->width; - rmh = r->height / 2; - cvSetImageROI (filter->cvGray, cvRect (rmx, rmy, rmw, rmh)); - mouth = - gst_face_detect_run_detector (filter, filter->cvMouthDetect, mw, mh); - have_mouth = (mouth && mouth->total); - cvResetImageROI (filter->cvGray); + if (filter->cvMouthDetect) { + rmx = r->x; + rmy = r->y + r->height / 2; + rmw = r->width; + rmh = r->height / 2; + cvSetImageROI (filter->cvGray, cvRect (rmx, rmy, rmw, rmh)); + mouth = + gst_face_detect_run_detector (filter, filter->cvMouthDetect, mw, + mh); + have_mouth = (mouth && mouth->total); + cvResetImageROI (filter->cvGray); + } else { + have_mouth = FALSE; + } - rex = r->x; - rey = r->y; - rew = r->width; - reh = r->height / 2; - cvSetImageROI (filter->cvGray, cvRect (rex, rey, rew, reh)); - eyes = - gst_face_detect_run_detector (filter, filter->cvEyesDetect, mw, mh); - have_eyes = (eyes && eyes->total); - cvResetImageROI (filter->cvGray); + if (filter->cvEyesDetect) { + rex = r->x; + rey = r->y; + rew = r->width; + reh = r->height / 2; + cvSetImageROI (filter->cvGray, cvRect (rex, rey, rew, reh)); + eyes = + gst_face_detect_run_detector (filter, filter->cvEyesDetect, mw, mh); + have_eyes = (eyes && eyes->total); + cvResetImageROI (filter->cvGray); + } else { + have_eyes = FALSE; + } GST_LOG_OBJECT (filter, "%2d/%2d: x,y = %4u,%4u: w.h = %4u,%4u : features(e,n,m) = %d,%d,%d", @@ -574,7 +584,7 @@ gst_face_detect_transform_ip (GstOpencvVideoFilter * base, GstBuffer * buf, "y", G_TYPE_UINT, r->y, "width", G_TYPE_UINT, r->width, "height", G_TYPE_UINT, r->height, NULL); - if (nose && nose->total) { + if (have_nose) { CvRect *sr = (CvRect *) cvGetSeqElem (nose, 0); GST_LOG_OBJECT (filter, "nose/%d: x,y = %4u,%4u: w.h = %4u,%4u", nose->total, rnx + sr->x, rny + sr->y, sr->width, sr->height); @@ -584,7 +594,7 @@ gst_face_detect_transform_ip (GstOpencvVideoFilter * base, GstBuffer * buf, "nose->width", G_TYPE_UINT, sr->width, "nose->height", G_TYPE_UINT, sr->height, NULL); } - if (mouth && mouth->total) { + if (have_mouth) { CvRect *sr = (CvRect *) cvGetSeqElem (mouth, 0); GST_LOG_OBJECT (filter, "mouth/%d: x,y = %4u,%4u: w.h = %4u,%4u", mouth->total, rmx + sr->x, rmy + sr->y, sr->width, sr->height); @@ -594,7 +604,7 @@ gst_face_detect_transform_ip (GstOpencvVideoFilter * base, GstBuffer * buf, "mouth->width", G_TYPE_UINT, sr->width, "mouth->height", G_TYPE_UINT, sr->height, NULL); } - if (eyes && eyes->total) { + if (have_eyes) { CvRect *sr = (CvRect *) cvGetSeqElem (eyes, 0); GST_LOG_OBJECT (filter, "eyes/%d: x,y = %4u,%4u: w.h = %4u,%4u", eyes->total, rex + sr->x, rey + sr->y, sr->width, sr->height); @@ -627,7 +637,7 @@ gst_face_detect_transform_ip (GstOpencvVideoFilter * base, GstBuffer * buf, cvEllipse (img, center, axes, 0.0, 0.0, 360.0, CV_RGB (cr, cg, cb), 3, 8, 0); - if (nose && nose->total) { + if (have_nose) { CvRect *sr = (CvRect *) cvGetSeqElem (nose, 0); w = sr->width / 2; @@ -639,7 +649,7 @@ gst_face_detect_transform_ip (GstOpencvVideoFilter * base, GstBuffer * buf, cvEllipse (img, center, axes, 0.0, 0.0, 360.0, CV_RGB (cr, cg, cb), 1, 8, 0); } - if (mouth && mouth->total) { + if (have_mouth) { CvRect *sr = (CvRect *) cvGetSeqElem (mouth, 0); w = sr->width / 2; @@ -651,7 +661,7 @@ gst_face_detect_transform_ip (GstOpencvVideoFilter * base, GstBuffer * buf, cvEllipse (img, center, axes, 0.0, 0.0, 360.0, CV_RGB (cr, cg, cb), 1, 8, 0); } - if (eyes && eyes->total) { + if (have_eyes) { CvRect *sr = (CvRect *) cvGetSeqElem (eyes, 0); w = sr->width / 2; From 486ddd38cf872099048f05b5f7739d6205e8d979 Mon Sep 17 00:00:00 2001 From: Stefan Sauer Date: Fri, 16 Mar 2012 17:07:46 +0100 Subject: [PATCH 107/138] facedetect: initialize some arbitrary variable that gcc-4.6 can track properly The access to them is clearly guarded by the booleans though. --- ext/opencv/gstfacedetect.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ext/opencv/gstfacedetect.c b/ext/opencv/gstfacedetect.c index f53b6eab7e..485e424245 100644 --- a/ext/opencv/gstfacedetect.c +++ b/ext/opencv/gstfacedetect.c @@ -499,7 +499,7 @@ gst_face_detect_transform_ip (GstOpencvVideoFilter * base, GstBuffer * buf, GValue facelist = { 0 }; GValue facedata = { 0 }; CvSeq *faces; - CvSeq *mouth, *nose, *eyes; + CvSeq *mouth = NULL, *nose = NULL, *eyes = NULL; gint i; gboolean do_display = FALSE; @@ -524,9 +524,9 @@ gst_face_detect_transform_ip (GstOpencvVideoFilter * base, GstBuffer * buf, CvRect *r = (CvRect *) cvGetSeqElem (faces, i); guint mw = filter->min_size_width / 8; guint mh = filter->min_size_height / 8; - guint rnx, rny, rnw, rnh; - guint rmx, rmy, rmw, rmh; - guint rex, rey, rew, reh; + guint rnx = 0, rny = 0, rnw, rnh; + guint rmx = 0, rmy = 0, rmw, rmh; + guint rex = 0, rey = 0, rew, reh; gboolean have_nose, have_mouth, have_eyes; /* detect face features */ From 692bf9ba633c909efd313259598202d30ce0bb08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Sat, 17 Mar 2012 12:47:52 +0000 Subject: [PATCH 108/138] opencv: fix configure check and build with opencv 2.1 AC_CHECK_HEADERS() calls action-if-not-found also if just one of the headers checked for is missing, which is not what we wanted. Also, check for highgui_c.h instead of highgui.hpp. https://bugzilla.gnome.org/show_bug.cgi?id=672226 --- configure.ac | 11 ++++++----- ext/opencv/MotionCells.cpp | 7 +++++++ ext/opencv/MotionCells.h | 7 ++++--- ext/opencv/gstopencvutils.c | 4 ++++ ext/opencv/gsttemplatematch.h | 7 ++++--- ext/opencv/motioncells_wrapper.cpp | 7 +++++++ 6 files changed, 32 insertions(+), 11 deletions(-) diff --git a/configure.ac b/configure.ac index 9cf3de2fce..ec821e224c 100644 --- a/configure.ac +++ b/configure.ac @@ -1432,14 +1432,15 @@ AG_GST_CHECK_FEATURE(OPENCV, [opencv plugins], opencv, [ AC_LANG_CPLUSPLUS OLD_CPPFLAGS=$CPPFLAGS CPPFLAGS=$OPENCV_CFLAGS - AC_CHECK_HEADERS(highgui.h opencv2/highgui/highgui.hpp, HAVE_HIGHGUI="yes", HAVE_HIGHGUI="no") + AC_CHECK_HEADERS([highgui.h opencv2/highgui/highgui_c.h]) CPPFLAGS=$OLD_CPPFLAGS AC_LANG_C - if test "x$HAVE_HIGHGUI" = "xno"; then - AC_MSG_RESULT(highgui.h could not be found.) - HAVE_OPENCV="no" - else + + if test $ac_cv_header_highgui_h = "yes" -o $ac_cv_header_opencv2_highgui_highgui_c_h = "yes" ; then HAVE_OPENCV="yes" + else + AC_MSG_RESULT([neither highgui.h nor opencv2/highgui/highgui_c.h could not be found]) + HAVE_OPENCV="no" fi ], [ HAVE_OPENCV="no" diff --git a/ext/opencv/MotionCells.cpp b/ext/opencv/MotionCells.cpp index 5223bc7f73..6d18a9993d 100644 --- a/ext/opencv/MotionCells.cpp +++ b/ext/opencv/MotionCells.cpp @@ -42,6 +42,13 @@ * Boston, MA 02111-1307, USA. */ +/* This breaks the build for reasons that aren't entirely clear to me yet */ +#if 0 +//#ifdef HAVE_CONFIG_H +//#include "config.h" +//#endif +#endif + #include #include #include diff --git a/ext/opencv/MotionCells.h b/ext/opencv/MotionCells.h index c5d4b17a5c..68a2fec575 100644 --- a/ext/opencv/MotionCells.h +++ b/ext/opencv/MotionCells.h @@ -46,10 +46,11 @@ #define MOTIONCELLS_H_ #include // includes OpenCV definitions -#ifndef __OPENCV_OLD_CV_H__ +#ifdef HAVE_HIGHGUI_H #include // includes highGUI definitions -#else -#include // includes highGUI definitions +#endif +#ifdef HAVE_OPENCV2_HIGHGUI_HIGHGUI_C_H +#include // includes highGUI definitions #endif #include #include diff --git a/ext/opencv/gstopencvutils.c b/ext/opencv/gstopencvutils.c index dc42f90d58..8c72257cc6 100644 --- a/ext/opencv/gstopencvutils.c +++ b/ext/opencv/gstopencvutils.c @@ -19,6 +19,10 @@ * Boston, MA 02111-1307, USA. */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + #include "gstopencvutils.h" static gboolean diff --git a/ext/opencv/gsttemplatematch.h b/ext/opencv/gsttemplatematch.h index 7e55ac6cf6..8d99f982e4 100644 --- a/ext/opencv/gsttemplatematch.h +++ b/ext/opencv/gsttemplatematch.h @@ -48,10 +48,11 @@ #include #include -#ifndef __OPENCV_OLD_CV_H__ +#ifdef HAVE_HIGHGUI_H #include // includes highGUI definitions -#else -#include // includes highGUI definitions +#endif +#ifdef HAVE_OPENCV2_HIGHGUI_HIGHGUI_C_H +#include // includes highGUI definitions #endif G_BEGIN_DECLS diff --git a/ext/opencv/motioncells_wrapper.cpp b/ext/opencv/motioncells_wrapper.cpp index d509686774..f55802bb4d 100644 --- a/ext/opencv/motioncells_wrapper.cpp +++ b/ext/opencv/motioncells_wrapper.cpp @@ -42,6 +42,13 @@ * Boston, MA 02111-1307, USA. */ +/* This breaks the build for reasons that aren't entirely clear to me yet */ +#if 0 +//#ifdef HAVE_CONFIG_H +//#include "config.h" +//#endif +#endif + #include #include #include "motioncells_wrapper.h" From e504dc3f6b13c00f1b1db9b97bd42ba0449bfb92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Sat, 17 Mar 2012 15:16:29 +0000 Subject: [PATCH 109/138] tools: add videofilter template for gst-element-maker --- tools/element-templates/videofilter | 78 +++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 tools/element-templates/videofilter diff --git a/tools/element-templates/videofilter b/tools/element-templates/videofilter new file mode 100644 index 0000000000..fb22b28840 --- /dev/null +++ b/tools/element-templates/videofilter @@ -0,0 +1,78 @@ +/* vim: set filetype=c: */ +% ClassName +GstVideoFilter +% TYPE_CLASS_NAME +GST_TYPE_VIDEO_FILTER +% pads +sinkpad-simple srcpad-simple +% pkg-config +gstreamer-video-0.10 +% includes +#include +#include +% prototypes +static gboolean +gst_replace_start (GstBaseTransform * trans); +static gboolean +gst_replace_stop (GstBaseTransform * trans); +static GstFlowReturn +gst_replace_transform_ip (GstBaseTransform * trans, GstBuffer * buf); +static gboolean +gst_replace_set_caps (GstBaseTransform * trans, GstCaps * incaps, + GstCaps * outcaps); +% declare-class + GstBaseTransformClass *base_transform_class = GST_BASE_TRANSFORM_CLASS (klass); +% set-methods + base_transform_class->start = GST_DEBUG_FUNCPTR (gst_replace_start); + base_transform_class->stop = GST_DEBUG_FUNCPTR (gst_replace_stop); + base_transform_class->set_caps = GST_DEBUG_FUNCPTR (gst_replace_set_caps); + base_transform_class->transform_ip = GST_DEBUG_FUNCPTR (gst_replace_transform_ip); +% methods + +static gboolean +gst_replace_start (GstBaseTransform * trans) +{ + /* GstReplace *replace = GST_REPLACE (trans); */ + + /* initialize processing */ + return TRUE; +} + +static gboolean +gst_replace_stop (GstBaseTransform * trans) +{ + /* GstReplace *replace = GST_REPLACE (trans); */ + + /* finalize processing */ + return TRUE; +} + +static gboolean +gst_replace_set_caps (GstBaseTransform * trans, GstCaps * incaps, + GstCaps * outcaps) +{ + /* GstReplace *replace = GST_REPLACE (trans); */ + GstVideoFormat video_format; + int w, h; + + /* parse input caps, output caps are the same so we ignore them */ + if (!gst_video_format_parse_caps (incaps, &video_format, &w, &h)) + return FALSE; + + /* You'll need to add those fields to the instance struct first */ + /* replace->video_format = video_format; */ + /* replace->width = w; */ + /* replace->height = h; */ + return TRUE; +} + +static GstFlowReturn +gst_replace_transform_ip (GstBaseTransform * trans, GstBuffer * buf) +{ + /* GstReplace *replace = GST_REPLACE (trans); */ + + /* process the video data in the buffer in-place */ + return GST_FLOW_OK; +} + +% end From 48398114e672e7900faf239c2fe5ae6f343fa9e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Sat, 17 Mar 2012 15:49:45 +0000 Subject: [PATCH 110/138] gst-element-maker: add {src,sink}pad-template, since many base classes create pads for us And use them in the videofilter template. --- tools/element-templates/sinkpad-template | 19 +++++++++++++++++++ tools/element-templates/srcpad-template | 19 +++++++++++++++++++ tools/element-templates/videofilter | 2 +- 3 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 tools/element-templates/sinkpad-template create mode 100644 tools/element-templates/srcpad-template diff --git a/tools/element-templates/sinkpad-template b/tools/element-templates/sinkpad-template new file mode 100644 index 0000000000..b06b346b11 --- /dev/null +++ b/tools/element-templates/sinkpad-template @@ -0,0 +1,19 @@ +/* vim: set filetype=c: */ + +% instance-members +% prototypes +% pad-template +static GstStaticPadTemplate gst_replace_sink_template = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/unknown") + ); + +% base-init + gst_element_class_add_static_pad_template (element_class, + &gst_replace_sink_template); +% instance-init +% methods +% end + diff --git a/tools/element-templates/srcpad-template b/tools/element-templates/srcpad-template new file mode 100644 index 0000000000..dd0842bbd9 --- /dev/null +++ b/tools/element-templates/srcpad-template @@ -0,0 +1,19 @@ +/* vim: set filetype=c: */ + +% instance-members +% prototypes +% pad-template +static GstStaticPadTemplate gst_replace_src_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("application/unknown") + ); + +% base-init + gst_element_class_add_static_pad_template (element_class, + &gst_replace_src_template); +% instance-init +% methods +% end + diff --git a/tools/element-templates/videofilter b/tools/element-templates/videofilter index fb22b28840..65b2f37568 100644 --- a/tools/element-templates/videofilter +++ b/tools/element-templates/videofilter @@ -4,7 +4,7 @@ GstVideoFilter % TYPE_CLASS_NAME GST_TYPE_VIDEO_FILTER % pads -sinkpad-simple srcpad-simple +sinkpad-template srcpad-template % pkg-config gstreamer-video-0.10 % includes From 3991742d77a81183f8ffbad59df7e1ec741ff803 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Sat, 17 Mar 2012 16:05:20 +0000 Subject: [PATCH 111/138] gst-element-maker: add video pad template and use it in videofilter class Would be nicer if one could just supplement the generic template from the element template though. Also, I would really have liked to just add those sections from the pads template into the element templet directly (so I can cater for src template caps == sink template caps), but that didn't seem to work. --- .../element-templates/sinkpad-template-video | 33 +++++++++++++++++++ tools/element-templates/srcpad-template-video | 33 +++++++++++++++++++ tools/element-templates/videofilter | 2 +- 3 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 tools/element-templates/sinkpad-template-video create mode 100644 tools/element-templates/srcpad-template-video diff --git a/tools/element-templates/sinkpad-template-video b/tools/element-templates/sinkpad-template-video new file mode 100644 index 0000000000..ffdac843a1 --- /dev/null +++ b/tools/element-templates/sinkpad-template-video @@ -0,0 +1,33 @@ +/* vim: set filetype=c: */ + +% instance-members +% prototypes +% pad-template +/* FIXME: add/remove formats you can handle */ +#define VIDEO_SINK_CAPS \ + GST_VIDEO_CAPS_RGBA \ + GST_VIDEO_CAPS_ARGB \ + GST_VIDEO_CAPS_BGRA \ + GST_VIDEO_CAPS_ABGR \ + GST_VIDEO_CAPS_RGBx \ + GST_VIDEO_CAPS_xRGB \ + GST_VIDEO_CAPS_BGRx \ + GST_VIDEO_CAPS_xBGR \ + GST_VIDEO_CAPS_RGB \ + GST_VIDEO_CAPS_BGR \ + GST_VIDEO_CAPS_YUV("{ AYUV }") + +static GstStaticPadTemplate gst_replace_sink_template = +GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (VIDEO_SINK_CAPS) + ); + +% base-init + gst_element_class_add_static_pad_template (element_class, + &gst_replace_sink_template); +% instance-init +% methods +% end + diff --git a/tools/element-templates/srcpad-template-video b/tools/element-templates/srcpad-template-video new file mode 100644 index 0000000000..bfdc931c5c --- /dev/null +++ b/tools/element-templates/srcpad-template-video @@ -0,0 +1,33 @@ +/* vim: set filetype=c: */ + +% instance-members +% prototypes +% pad-template +/* FIXME: add/remove formats you can handle */ +#define VIDEO_SRC_CAPS \ + GST_VIDEO_CAPS_RGBA \ + GST_VIDEO_CAPS_ARGB \ + GST_VIDEO_CAPS_BGRA \ + GST_VIDEO_CAPS_ABGR \ + GST_VIDEO_CAPS_RGBx \ + GST_VIDEO_CAPS_xRGB \ + GST_VIDEO_CAPS_BGRx \ + GST_VIDEO_CAPS_xBGR \ + GST_VIDEO_CAPS_RGB \ + GST_VIDEO_CAPS_BGR \ + GST_VIDEO_CAPS_YUV("{ AYUV }") + +static GstStaticPadTemplate gst_replace_src_template = +GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS (VIDEO_SRC_CAPS) + ); + +% base-init + gst_element_class_add_static_pad_template (element_class, + &gst_replace_src_template); +% instance-init +% methods +% end + diff --git a/tools/element-templates/videofilter b/tools/element-templates/videofilter index 65b2f37568..3a94b0838f 100644 --- a/tools/element-templates/videofilter +++ b/tools/element-templates/videofilter @@ -4,7 +4,7 @@ GstVideoFilter % TYPE_CLASS_NAME GST_TYPE_VIDEO_FILTER % pads -sinkpad-template srcpad-template +sinkpad-template-video srcpad-template-video % pkg-config gstreamer-video-0.10 % includes From 9aa9903430ee384a7ea46034f60b3e5d76f5abb6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Sat, 17 Mar 2012 16:09:31 +0000 Subject: [PATCH 112/138] gst-element-maker: fix -template-video caps string Don't forget separator. --- .../element-templates/sinkpad-template-video | 20 +++++++++---------- tools/element-templates/srcpad-template-video | 20 +++++++++---------- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/tools/element-templates/sinkpad-template-video b/tools/element-templates/sinkpad-template-video index ffdac843a1..b317c6fd79 100644 --- a/tools/element-templates/sinkpad-template-video +++ b/tools/element-templates/sinkpad-template-video @@ -5,16 +5,16 @@ % pad-template /* FIXME: add/remove formats you can handle */ #define VIDEO_SINK_CAPS \ - GST_VIDEO_CAPS_RGBA \ - GST_VIDEO_CAPS_ARGB \ - GST_VIDEO_CAPS_BGRA \ - GST_VIDEO_CAPS_ABGR \ - GST_VIDEO_CAPS_RGBx \ - GST_VIDEO_CAPS_xRGB \ - GST_VIDEO_CAPS_BGRx \ - GST_VIDEO_CAPS_xBGR \ - GST_VIDEO_CAPS_RGB \ - GST_VIDEO_CAPS_BGR \ + GST_VIDEO_CAPS_RGBA "; " \ + GST_VIDEO_CAPS_ARGB "; " \ + GST_VIDEO_CAPS_BGRA "; " \ + GST_VIDEO_CAPS_ABGR "; " \ + GST_VIDEO_CAPS_RGBx "; " \ + GST_VIDEO_CAPS_xRGB "; " \ + GST_VIDEO_CAPS_BGRx "; " \ + GST_VIDEO_CAPS_xBGR "; " \ + GST_VIDEO_CAPS_RGB "; " \ + GST_VIDEO_CAPS_BGR "; " \ GST_VIDEO_CAPS_YUV("{ AYUV }") static GstStaticPadTemplate gst_replace_sink_template = diff --git a/tools/element-templates/srcpad-template-video b/tools/element-templates/srcpad-template-video index bfdc931c5c..4f39320868 100644 --- a/tools/element-templates/srcpad-template-video +++ b/tools/element-templates/srcpad-template-video @@ -5,16 +5,16 @@ % pad-template /* FIXME: add/remove formats you can handle */ #define VIDEO_SRC_CAPS \ - GST_VIDEO_CAPS_RGBA \ - GST_VIDEO_CAPS_ARGB \ - GST_VIDEO_CAPS_BGRA \ - GST_VIDEO_CAPS_ABGR \ - GST_VIDEO_CAPS_RGBx \ - GST_VIDEO_CAPS_xRGB \ - GST_VIDEO_CAPS_BGRx \ - GST_VIDEO_CAPS_xBGR \ - GST_VIDEO_CAPS_RGB \ - GST_VIDEO_CAPS_BGR \ + GST_VIDEO_CAPS_RGBA "; " \ + GST_VIDEO_CAPS_ARGB "; " \ + GST_VIDEO_CAPS_BGRA "; " \ + GST_VIDEO_CAPS_ABGR "; " \ + GST_VIDEO_CAPS_RGBx "; " \ + GST_VIDEO_CAPS_xRGB "; " \ + GST_VIDEO_CAPS_BGRx "; " \ + GST_VIDEO_CAPS_xBGR "; " \ + GST_VIDEO_CAPS_RGB "; " \ + GST_VIDEO_CAPS_BGR "; " \ GST_VIDEO_CAPS_YUV("{ AYUV }") static GstStaticPadTemplate gst_replace_src_template = From 67f546968c22487b769149dddfb3d11de45acbe3 Mon Sep 17 00:00:00 2001 From: David Schleef Date: Sat, 17 Mar 2012 11:35:18 -0700 Subject: [PATCH 113/138] inter: Add channel property The channel property allows multiple intersrc/sink pairs to find each other. It's a free-form text string that must match among various inter elements. Also fixed up documentation and latency handling. --- gst/inter/gstinteraudiosink.c | 44 ++++++++++++---- gst/inter/gstinteraudiosink.h | 1 + gst/inter/gstinteraudiosrc.c | 97 ++++++++++++++++++++++++++--------- gst/inter/gstinteraudiosrc.h | 1 + gst/inter/gstintersubsink.c | 45 ++++++++++++---- gst/inter/gstintersubsink.h | 1 + gst/inter/gstintersubsrc.c | 51 ++++++++++++++---- gst/inter/gstintersubsrc.h | 1 + gst/inter/gstintertest.c | 14 ++--- gst/inter/gstintervideosink.c | 21 +++++--- gst/inter/gstintervideosrc.c | 33 +++++++++--- 11 files changed, 236 insertions(+), 73 deletions(-) diff --git a/gst/inter/gstinteraudiosink.c b/gst/inter/gstinteraudiosink.c index db81811473..91285f126d 100644 --- a/gst/inter/gstinteraudiosink.c +++ b/gst/inter/gstinteraudiosink.c @@ -19,14 +19,21 @@ /** * SECTION:element-gstinteraudiosink * - * The interaudiosink element does FIXME stuff. + * The interaudiosink element is an audio sink element. It is used + * in connection with a interaudiosrc element in a different pipeline, + * similar to intervideosink and intervideosrc. * * * Example launch line * |[ - * gst-launch -v fakesrc ! interaudiosink ! FIXME ! fakesink + * gst-launch -v audiotestsrc ! queue ! interaudiosink * ]| - * FIXME Describe what the pipeline does. + * + * The interaudiosink element cannot be used effectively with gst-launch, + * as it requires a second pipeline in the application to receive the + * audio. + * See the gstintertest.c example in the gst-plugins-bad source code for + * more details. * */ @@ -91,8 +98,7 @@ GST_STATIC_PAD_TEMPLATE ("sink", "endianness = (int) BYTE_ORDER, " "signed = (boolean) true, " "width = (int) 16, " - "depth = (int) 16, " - "rate = (int) [ 1, MAX ], " "channels = (int) [ 1, 2 ]") + "depth = (int) 16, " "rate = (int) 48000, " "channels = (int) 2") ); @@ -113,8 +119,11 @@ gst_inter_audio_sink_base_init (gpointer g_class) gst_element_class_add_static_pad_template (element_class, &gst_inter_audio_sink_sink_template); - gst_element_class_set_details_simple (element_class, "FIXME Long name", - "Generic", "FIXME Description", "FIXME "); + gst_element_class_set_details_simple (element_class, + "Internal audio sink", + "Sink/Audio", + "Virtual audio sink for internal process communication", + "David Schleef "); } static void @@ -163,16 +172,20 @@ static void gst_inter_audio_sink_init (GstInterAudioSink * interaudiosink, GstInterAudioSinkClass * interaudiosink_class) { - interaudiosink->surface = gst_inter_surface_get ("default"); + interaudiosink->channel = g_strdup ("default"); } void gst_inter_audio_sink_set_property (GObject * object, guint property_id, const GValue * value, GParamSpec * pspec) { - /* GstInterAudioSink *interaudiosink = GST_INTER_AUDIO_SINK (object); */ + GstInterAudioSink *interaudiosink = GST_INTER_AUDIO_SINK (object); switch (property_id) { + case PROP_CHANNEL: + g_free (interaudiosink->channel); + interaudiosink->channel = g_value_dup_string (value); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; @@ -183,9 +196,12 @@ void gst_inter_audio_sink_get_property (GObject * object, guint property_id, GValue * value, GParamSpec * pspec) { - /* GstInterAudioSink *interaudiosink = GST_INTER_AUDIO_SINK (object); */ + GstInterAudioSink *interaudiosink = GST_INTER_AUDIO_SINK (object); switch (property_id) { + case PROP_CHANNEL: + g_value_set_string (value, interaudiosink->channel); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; @@ -261,6 +277,11 @@ gst_inter_audio_sink_get_times (GstBaseSink * sink, GstBuffer * buffer, static gboolean gst_inter_audio_sink_start (GstBaseSink * sink) { + GstInterAudioSink *interaudiosink = GST_INTER_AUDIO_SINK (sink); + + GST_DEBUG ("start"); + + interaudiosink->surface = gst_inter_surface_get (interaudiosink->channel); return TRUE; } @@ -276,6 +297,9 @@ gst_inter_audio_sink_stop (GstBaseSink * sink) gst_adapter_clear (interaudiosink->surface->audio_adapter); g_mutex_unlock (interaudiosink->surface->mutex); + gst_inter_surface_unref (interaudiosink->surface); + interaudiosink->surface = NULL; + return TRUE; } diff --git a/gst/inter/gstinteraudiosink.h b/gst/inter/gstinteraudiosink.h index b0a32769ec..5ea09997ad 100644 --- a/gst/inter/gstinteraudiosink.h +++ b/gst/inter/gstinteraudiosink.h @@ -39,6 +39,7 @@ struct _GstInterAudioSink GstBaseSink base_interaudiosink; GstInterSurface *surface; + char *channel; int fps_n; int fps_d; diff --git a/gst/inter/gstinteraudiosrc.c b/gst/inter/gstinteraudiosrc.c index 48641a53ed..0a136ee1c4 100644 --- a/gst/inter/gstinteraudiosrc.c +++ b/gst/inter/gstinteraudiosrc.c @@ -19,14 +19,19 @@ /** * SECTION:element-gstinteraudiosrc * - * The interaudiosrc element does FIXME stuff. + * The interaudiosrc element is an audio source element. It is used + * in connection with a interaudiosink element in a different pipeline. * * * Example launch line * |[ - * gst-launch -v fakesrc ! interaudiosrc ! FIXME ! fakesink + * gst-launch -v interaudiosrc ! queue ! audiosink * ]| - * FIXME Describe what the pipeline does. + * + * The interaudiosrc element cannot be used effectively with gst-launch, + * as it requires a second pipeline in the application to send audio. + * See the gstintertest.c example in the gst-plugins-bad source code for + * more details. * */ @@ -93,8 +98,7 @@ GST_STATIC_PAD_TEMPLATE ("src", "endianness = (int) BYTE_ORDER, " "signed = (boolean) true, " "width = (int) 16, " - "depth = (int) 16, " - "rate = (int) [ 1, MAX ], " "channels = (int) [ 1, 2 ]") + "depth = (int) 16, " "rate = (int) 48000, " "channels = (int) 2") ); @@ -115,8 +119,11 @@ gst_inter_audio_src_base_init (gpointer g_class) gst_element_class_add_static_pad_template (element_class, &gst_inter_audio_src_src_template); - gst_element_class_set_details_simple (element_class, "FIXME Long name", - "Generic", "FIXME Description", "FIXME "); + gst_element_class_set_details_simple (element_class, + "Internal audio source", + "Source/Audio", + "Virtual audio source for internal process communication", + "David Schleef "); } static void @@ -175,16 +182,20 @@ gst_inter_audio_src_init (GstInterAudioSrc * interaudiosrc, gst_base_src_set_live (GST_BASE_SRC (interaudiosrc), TRUE); gst_base_src_set_blocksize (GST_BASE_SRC (interaudiosrc), -1); - interaudiosrc->surface = gst_inter_surface_get ("default"); + interaudiosrc->channel = g_strdup ("default"); } void gst_inter_audio_src_set_property (GObject * object, guint property_id, const GValue * value, GParamSpec * pspec) { - /* GstInterAudioSrc *interaudiosrc = GST_INTER_AUDIO_SRC (object); */ + GstInterAudioSrc *interaudiosrc = GST_INTER_AUDIO_SRC (object); switch (property_id) { + case PROP_CHANNEL: + g_free (interaudiosrc->channel); + interaudiosrc->channel = g_value_dup_string (value); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; @@ -195,9 +206,12 @@ void gst_inter_audio_src_get_property (GObject * object, guint property_id, GValue * value, GParamSpec * pspec) { - /* GstInterAudioSrc *interaudiosrc = GST_INTER_AUDIO_SRC (object); */ + GstInterAudioSrc *interaudiosrc = GST_INTER_AUDIO_SRC (object); switch (property_id) { + case PROP_CHANNEL: + g_value_set_string (value, interaudiosrc->channel); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; @@ -282,6 +296,8 @@ gst_inter_audio_src_start (GstBaseSrc * src) GST_DEBUG_OBJECT (interaudiosrc, "start"); + interaudiosrc->surface = gst_inter_surface_get (interaudiosrc->channel); + return TRUE; } @@ -292,6 +308,9 @@ gst_inter_audio_src_stop (GstBaseSrc * src) GST_DEBUG_OBJECT (interaudiosrc, "stop"); + gst_inter_surface_unref (interaudiosrc->surface); + interaudiosrc->surface = NULL; + return TRUE; } @@ -346,12 +365,20 @@ static gboolean gst_inter_audio_src_event (GstBaseSrc * src, GstEvent * event) { GstInterAudioSrc *interaudiosrc = GST_INTER_AUDIO_SRC (src); + gboolean ret; GST_DEBUG_OBJECT (interaudiosrc, "event"); - return TRUE; + switch (GST_EVENT_TYPE (event)) { + default: + ret = GST_BASE_SRC_CLASS (parent_class)->event (src, event); + } + + return ret; } +#define SIZE 1600 + static GstFlowReturn gst_inter_audio_src_create (GstBaseSrc * src, guint64 offset, guint size, GstBuffer ** buf) @@ -366,31 +393,31 @@ gst_inter_audio_src_create (GstBaseSrc * src, guint64 offset, guint size, g_mutex_lock (interaudiosrc->surface->mutex); n = gst_adapter_available (interaudiosrc->surface->audio_adapter) / 4; - if (n > 1600 * 2) { - GST_DEBUG ("flushing %d samples", 800); - gst_adapter_flush (interaudiosrc->surface->audio_adapter, 800 * 4); - n -= 800; + if (n > SIZE * 2) { + GST_DEBUG ("flushing %d samples", SIZE / 2); + gst_adapter_flush (interaudiosrc->surface->audio_adapter, (SIZE / 2) * 4); + n -= (SIZE / 2); } - if (n > 1600) - n = 1600; + if (n > SIZE) + n = SIZE; if (n > 0) { buffer = gst_adapter_take_buffer (interaudiosrc->surface->audio_adapter, n * 4); } g_mutex_unlock (interaudiosrc->surface->mutex); - if (n < 1600) { - GstBuffer *newbuf = gst_buffer_new_and_alloc (1600 * 4); + if (n < SIZE) { + GstBuffer *newbuf = gst_buffer_new_and_alloc (SIZE * 4); - GST_DEBUG ("creating %d samples of silence", 1600 - n); - memset (GST_BUFFER_DATA (newbuf) + n * 4, 0, 1600 * 4 - n * 4); + GST_DEBUG ("creating %d samples of silence", SIZE - n); + memset (GST_BUFFER_DATA (newbuf) + n * 4, 0, SIZE * 4 - n * 4); if (buffer) { memcpy (GST_BUFFER_DATA (newbuf), GST_BUFFER_DATA (buffer), n * 4); gst_buffer_unref (buffer); } buffer = newbuf; } - n = 1600; + n = SIZE; GST_BUFFER_OFFSET (buffer) = interaudiosrc->n_samples; GST_BUFFER_OFFSET_END (buffer) = interaudiosrc->n_samples + n; @@ -430,10 +457,34 @@ static gboolean gst_inter_audio_src_query (GstBaseSrc * src, GstQuery * query) { GstInterAudioSrc *interaudiosrc = GST_INTER_AUDIO_SRC (src); + gboolean ret; GST_DEBUG_OBJECT (interaudiosrc, "query"); - return TRUE; + switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_LATENCY:{ + GstClockTime min_latency, max_latency; + + min_latency = 30 * gst_util_uint64_scale_int (GST_SECOND, SIZE, 48000); + + max_latency = min_latency; + + GST_ERROR_OBJECT (src, + "report latency min %" GST_TIME_FORMAT " max %" GST_TIME_FORMAT, + GST_TIME_ARGS (min_latency), GST_TIME_ARGS (max_latency)); + + gst_query_set_latency (query, + gst_base_src_is_live (src), min_latency, max_latency); + + ret = TRUE; + break; + } + default: + ret = GST_BASE_SRC_CLASS (parent_class)->query (src, query); + break; + } + + return ret; } static gboolean diff --git a/gst/inter/gstinteraudiosrc.h b/gst/inter/gstinteraudiosrc.h index 958a1a53d9..4ccc7f5c51 100644 --- a/gst/inter/gstinteraudiosrc.h +++ b/gst/inter/gstinteraudiosrc.h @@ -39,6 +39,7 @@ struct _GstInterAudioSrc GstBaseSrc base_interaudiosrc; GstInterSurface *surface; + char *channel; guint64 n_samples; int sample_rate; diff --git a/gst/inter/gstintersubsink.c b/gst/inter/gstintersubsink.c index 1328b18a5d..a42b3e5731 100644 --- a/gst/inter/gstintersubsink.c +++ b/gst/inter/gstintersubsink.c @@ -19,14 +19,19 @@ /** * SECTION:element-gstintersubsink * - * The intersubsink element does FIXME stuff. + * The intersubsink element is a subtitle sink element. It is used + * in connection with a intersubsrc element in a different pipeline. * * * Example launch line * |[ - * gst-launch -v fakesrc ! intersubsink ! FIXME ! fakesink + * gst-launch -v ... ! intersubsink * ]| - * FIXME Describe what the pipeline does. + * + * The intersubsink element cannot be used effectively with gst-launch, + * as it requires a second pipeline in the application to send audio. + * See the gstintertest.c example in the gst-plugins-bad source code for + * more details. * */ @@ -73,7 +78,8 @@ static gboolean gst_inter_sub_sink_unlock_stop (GstBaseSink * sink); enum { - PROP_0 + PROP_0, + PROP_CHANNEL }; /* pad templates */ @@ -103,8 +109,11 @@ gst_inter_sub_sink_base_init (gpointer g_class) gst_element_class_add_pad_template (element_class, gst_static_pad_template_get (&gst_inter_sub_sink_sink_template)); - gst_element_class_set_details_simple (element_class, "FIXME Long name", - "Generic", "FIXME Description", "FIXME "); + gst_element_class_set_details_simple (element_class, + "Internal subtitle sink", + "Sink/Subtitle", + "Virtual subtitle sink for internal process communication", + "David Schleef "); } static void @@ -139,6 +148,11 @@ gst_inter_sub_sink_class_init (GstInterSubSinkClass * klass) base_sink_class->unlock_stop = GST_DEBUG_FUNCPTR (gst_inter_sub_sink_unlock_stop); + g_object_class_install_property (gobject_class, PROP_CHANNEL, + g_param_spec_string ("channel", "Channel", + "Channel name to match inter src and sink elements", + "default", G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + } static void @@ -146,7 +160,7 @@ gst_inter_sub_sink_init (GstInterSubSink * intersubsink, GstInterSubSinkClass * intersubsink_class) { - intersubsink->surface = gst_inter_surface_get ("default"); + intersubsink->channel = g_strdup ("default"); intersubsink->fps_n = 1; intersubsink->fps_d = 1; @@ -156,9 +170,13 @@ void gst_inter_sub_sink_set_property (GObject * object, guint property_id, const GValue * value, GParamSpec * pspec) { - /* GstInterSubSink *intersubsink = GST_INTER_SUB_SINK (object); */ + GstInterSubSink *intersubsink = GST_INTER_SUB_SINK (object); switch (property_id) { + case PROP_CHANNEL: + g_free (intersubsink->channel); + intersubsink->channel = g_value_dup_string (value); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; @@ -169,9 +187,12 @@ void gst_inter_sub_sink_get_property (GObject * object, guint property_id, GValue * value, GParamSpec * pspec) { - /* GstInterSubSink *intersubsink = GST_INTER_SUB_SINK (object); */ + GstInterSubSink *intersubsink = GST_INTER_SUB_SINK (object); switch (property_id) { + case PROP_CHANNEL: + g_value_set_string (value, intersubsink->channel); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; @@ -247,6 +268,9 @@ gst_inter_sub_sink_get_times (GstBaseSink * sink, GstBuffer * buffer, static gboolean gst_inter_sub_sink_start (GstBaseSink * sink) { + GstInterSubSink *intersubsink = GST_INTER_SUB_SINK (sink); + + intersubsink->surface = gst_inter_surface_get (intersubsink->channel); return TRUE; } @@ -263,6 +287,9 @@ gst_inter_sub_sink_stop (GstBaseSink * sink) intersubsink->surface->sub_buffer = NULL; g_mutex_unlock (intersubsink->surface->mutex); + gst_inter_surface_unref (intersubsink->surface); + intersubsink->surface = NULL; + return TRUE; } diff --git a/gst/inter/gstintersubsink.h b/gst/inter/gstintersubsink.h index be2da9b3b2..33b48f78f8 100644 --- a/gst/inter/gstintersubsink.h +++ b/gst/inter/gstintersubsink.h @@ -40,6 +40,7 @@ struct _GstInterSubSink GstPad *sinkpad; GstInterSurface *surface; + char *channel; int fps_n; int fps_d; diff --git a/gst/inter/gstintersubsrc.c b/gst/inter/gstintersubsrc.c index 60a29b3d75..437a3e1ea3 100644 --- a/gst/inter/gstintersubsrc.c +++ b/gst/inter/gstintersubsrc.c @@ -31,6 +31,8 @@ * * The intersubsrc element cannot be used effectively with gst-launch, * as it requires a second pipeline in the application to send subtitles. + * See the gstintertest.c example in the gst-plugins-bad source code for + * more details. * */ @@ -82,7 +84,8 @@ gst_inter_sub_src_prepare_seek_segment (GstBaseSrc * src, GstEvent * seek, enum { - PROP_0 + PROP_0, + PROP_CHANNEL }; /* pad templates */ @@ -113,9 +116,10 @@ gst_inter_sub_src_base_init (gpointer g_class) gst_static_pad_template_get (&gst_inter_sub_src_src_template)); gst_element_class_set_details_simple (element_class, - "Inter-pipeline subtitle source", - "Source/Subtitle", "Inter-pipeline subtitle source", - "David Schleef "); + "Internal subtitle source", + "Source/Subtitle", + "Virtual subtitle source for internal process communication", + "David Schleef "); } static void @@ -159,7 +163,10 @@ gst_inter_sub_src_class_init (GstInterSubSrcClass * klass) base_src_class->prepare_seek_segment = GST_DEBUG_FUNCPTR (gst_inter_sub_src_prepare_seek_segment); - + g_object_class_install_property (gobject_class, PROP_CHANNEL, + g_param_spec_string ("channel", "Channel", + "Channel name to match inter src and sink elements", + "default", G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); } static void @@ -173,16 +180,20 @@ gst_inter_sub_src_init (GstInterSubSrc * intersubsrc, gst_base_src_set_format (GST_BASE_SRC (intersubsrc), GST_FORMAT_TIME); gst_base_src_set_live (GST_BASE_SRC (intersubsrc), TRUE); - intersubsrc->surface = gst_inter_surface_get ("default"); + intersubsrc->channel = g_strdup ("default"); } void gst_inter_sub_src_set_property (GObject * object, guint property_id, const GValue * value, GParamSpec * pspec) { - /* GstInterSubSrc *intersubsrc = GST_INTER_SUB_SRC (object); */ + GstInterSubSrc *intersubsrc = GST_INTER_SUB_SRC (object); switch (property_id) { + case PROP_CHANNEL: + g_free (intersubsrc->channel); + intersubsrc->channel = g_value_dup_string (value); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; @@ -193,9 +204,12 @@ void gst_inter_sub_src_get_property (GObject * object, guint property_id, GValue * value, GParamSpec * pspec) { - /* GstInterSubSrc *intersubsrc = GST_INTER_SUB_SRC (object); */ + GstInterSubSrc *intersubsrc = GST_INTER_SUB_SRC (object); switch (property_id) { + case PROP_CHANNEL: + g_value_set_string (value, intersubsrc->channel); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; @@ -270,6 +284,8 @@ gst_inter_sub_src_start (GstBaseSrc * src) GST_DEBUG_OBJECT (intersubsrc, "start"); + intersubsrc->surface = gst_inter_surface_get (intersubsrc->channel); + return TRUE; } @@ -280,6 +296,9 @@ gst_inter_sub_src_stop (GstBaseSrc * src) GST_DEBUG_OBJECT (intersubsrc, "stop"); + gst_inter_surface_unref (intersubsrc->surface); + intersubsrc->surface = NULL; + return TRUE; } @@ -334,10 +353,16 @@ static gboolean gst_inter_sub_src_event (GstBaseSrc * src, GstEvent * event) { GstInterSubSrc *intersubsrc = GST_INTER_SUB_SRC (src); + gboolean ret; GST_DEBUG_OBJECT (intersubsrc, "event"); - return TRUE; + switch (GST_EVENT_TYPE (event)) { + default: + ret = GST_BASE_SRC_CLASS (parent_class)->event (src, event); + } + + return ret; } static GstFlowReturn @@ -409,10 +434,16 @@ static gboolean gst_inter_sub_src_query (GstBaseSrc * src, GstQuery * query) { GstInterSubSrc *intersubsrc = GST_INTER_SUB_SRC (src); + gboolean ret; GST_DEBUG_OBJECT (intersubsrc, "query"); - return TRUE; + switch (GST_QUERY_TYPE (query)) { + default: + ret = GST_BASE_SRC_CLASS (parent_class)->query (src, query); + } + + return ret; } static gboolean diff --git a/gst/inter/gstintersubsrc.h b/gst/inter/gstintersubsrc.h index 74bfed1e75..38f7a6696b 100644 --- a/gst/inter/gstintersubsrc.h +++ b/gst/inter/gstintersubsrc.h @@ -40,6 +40,7 @@ struct _GstInterSubSrc GstPad *srcpad; GstInterSurface *surface; + char *channel; int rate; int n_frames; diff --git a/gst/inter/gstintertest.c b/gst/inter/gstintertest.c index ff4c65f474..269d642792 100644 --- a/gst/inter/gstintertest.c +++ b/gst/inter/gstintertest.c @@ -1,5 +1,5 @@ /* GstInterTest - * Copyright (C) 2011 FIXME + * Copyright (C) 2011 David Schleef * Copyright (C) 2010 Entropy Wave Inc * * Redistribution and use in source and binary forms, with or without @@ -86,7 +86,7 @@ main (int argc, char *argv[]) g_thread_init (NULL); #endif - context = g_option_context_new ("- FIXME"); + context = g_option_context_new ("- Internal src/sink test"); g_option_context_add_main_entries (context, entries, GETTEXT_PACKAGE); g_option_context_add_group (context, gst_init_get_option_group ()); if (!g_option_context_parse (context, &argc, &argv, &error)) { @@ -188,14 +188,14 @@ gst_inter_test_create_pipeline_vts (GstInterTest * intertest) pipe_desc = g_string_new (""); - g_string_append (pipe_desc, "videotestsrc name=source num-buffers=10000 ! "); + g_string_append (pipe_desc, "videotestsrc name=source num-buffers=100 ! "); g_string_append (pipe_desc, "video/x-raw-yuv,format=(fourcc)I420,width=320,height=240 ! "); g_string_append (pipe_desc, "timeoverlay ! "); g_string_append (pipe_desc, "intervideosink name=sink sync=true "); g_string_append (pipe_desc, - "audiotestsrc samplesperbuffer=1600 num-buffers=100 ! "); - g_string_append (pipe_desc, "interaudiosink "); + "audiotestsrc samplesperbuffer=1600 num-buffers=100 ! audioconvert ! "); + g_string_append (pipe_desc, "interaudiosink sync=true "); if (verbose) g_print ("pipeline: %s\n", pipe_desc->str); @@ -232,7 +232,7 @@ gst_inter_test_create_pipeline_server (GstInterTest * intertest) g_string_append (pipe_desc, "intervideosrc ! queue ! "); g_string_append (pipe_desc, "xvimagesink name=sink "); g_string_append (pipe_desc, "interaudiosrc ! queue ! "); - g_string_append (pipe_desc, "alsasink latency-time=100000000 "); + g_string_append (pipe_desc, "alsasink "); if (verbose) g_print ("pipeline: %s\n", pipe_desc->str); @@ -337,7 +337,7 @@ gst_inter_test_handle_paused_to_ready (GstInterTest * intertest) static void gst_inter_test_handle_ready_to_null (GstInterTest * intertest) { - g_main_loop_quit (intertest->main_loop); + //g_main_loop_quit (intertest->main_loop); } diff --git a/gst/inter/gstintervideosink.c b/gst/inter/gstintervideosink.c index 856a791613..554bf1afaf 100644 --- a/gst/inter/gstintervideosink.c +++ b/gst/inter/gstintervideosink.c @@ -19,14 +19,20 @@ /** * SECTION:element-gstintervideosink * - * The intervideosink element does FIXME stuff. + * The intervideosink element is a video sink element. It is used + * in connection with an intervideosrc element in a different pipeline, + * similar to interaudiosink and interaudiosrc. * * * Example launch line * |[ - * gst-launch -v fakesrc ! intervideosink ! FIXME ! fakesink + * gst-launch -v videotestsrc ! intervideosink * ]| - * FIXME Describe what the pipeline does. + * + * The intervideosink element cannot be used effectively with gst-launch, + * as it requires a second pipeline in the application to send video to. + * See the gstintertest.c example in the gst-plugins-bad source code for + * more details. * */ @@ -107,8 +113,11 @@ gst_inter_video_sink_base_init (gpointer g_class) gst_element_class_add_static_pad_template (element_class, &gst_inter_video_sink_sink_template); - gst_element_class_set_details_simple (element_class, "FIXME Long name", - "Generic", "FIXME Description", "FIXME "); + gst_element_class_set_details_simple (element_class, + "Internal video sink", + "Sink/Video", + "Virtual video sink for internal process communication", + "David Schleef "); } static void @@ -155,8 +164,6 @@ static void gst_inter_video_sink_init (GstInterVideoSink * intervideosink, GstInterVideoSinkClass * intervideosink_class) { - intervideosink->surface = gst_inter_surface_get ("default"); - intervideosink->channel = g_strdup ("default"); } diff --git a/gst/inter/gstintervideosrc.c b/gst/inter/gstintervideosrc.c index 4fa1df8eae..e58cb7fc4f 100644 --- a/gst/inter/gstintervideosrc.c +++ b/gst/inter/gstintervideosrc.c @@ -19,14 +19,18 @@ /** * SECTION:element-gstintervideosrc * - * The intervideosrc element does FIXME stuff. + * The intervideosrc element is a video source element. It is used + * in connection with a intervideosink element in a different pipeline, + * similar to interaudiosink and interaudiosrc. * * * Example launch line * |[ - * gst-launch -v fakesrc ! intervideosrc ! FIXME ! fakesink + * gst-launch -v intervideosrc ! queue ! xvimagesink * ]| - * FIXME Describe what the pipeline does. + * + * The intersubsrc element cannot be used effectively with gst-launch, + * as it requires a second pipeline in the application to send subtitles. * */ @@ -111,8 +115,11 @@ gst_inter_video_src_base_init (gpointer g_class) gst_element_class_add_static_pad_template (element_class, &gst_inter_video_src_src_template); - gst_element_class_set_details_simple (element_class, "FIXME Long name", - "Generic", "FIXME Description", "FIXME "); + gst_element_class_set_details_simple (element_class, + "Internal video source", + "Source/Video", + "Virtual video source for internal process communication", + "David Schleef "); } static void @@ -361,10 +368,16 @@ static gboolean gst_inter_video_src_event (GstBaseSrc * src, GstEvent * event) { GstInterVideoSrc *intervideosrc = GST_INTER_VIDEO_SRC (src); + gboolean ret; GST_DEBUG_OBJECT (intervideosrc, "event"); - return TRUE; + switch (GST_EVENT_TYPE (event)) { + default: + ret = GST_BASE_SRC_CLASS (parent_class)->event (src, event); + } + + return ret; } static GstFlowReturn @@ -450,10 +463,16 @@ static gboolean gst_inter_video_src_query (GstBaseSrc * src, GstQuery * query) { GstInterVideoSrc *intervideosrc = GST_INTER_VIDEO_SRC (src); + gboolean ret; GST_DEBUG_OBJECT (intervideosrc, "query"); - return TRUE; + switch (GST_QUERY_TYPE (query)) { + default: + ret = GST_BASE_SRC_CLASS (parent_class)->query (src, query); + } + + return ret; } static gboolean From b45c206647f669d60c6e23cb03acb1c14882b9a3 Mon Sep 17 00:00:00 2001 From: David Schleef Date: Sat, 17 Mar 2012 11:45:39 -0700 Subject: [PATCH 114/138] element-templates: chain query/event functions Chain up to parent class. This fix should be done to all of the templates. --- tools/element-templates/basesrc | 16 ++++++++++++++-- tools/element-templates/element | 12 +++++++++++- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/tools/element-templates/basesrc b/tools/element-templates/basesrc index 0b7e56fc17..1be325a22f 100644 --- a/tools/element-templates/basesrc +++ b/tools/element-templates/basesrc @@ -161,10 +161,16 @@ static gboolean gst_replace_event (GstBaseSrc * src, GstEvent * event) { GstReplace *replace = GST_REPLACE (src); + gboolean ret; GST_DEBUG_OBJECT (replace, "event"); - return TRUE; + switch (GST_EVENT_TYPE (event)) { + default: + ret = GST_BASE_SRC_CLASS (parent_class)->event (src, event); + } + + return ret; } static GstFlowReturn @@ -192,10 +198,16 @@ static gboolean gst_replace_query (GstBaseSrc * src, GstQuery * query) { GstReplace *replace = GST_REPLACE (src); + gboolean ret; GST_DEBUG_OBJECT (replace, "query"); - return TRUE; + switch (GST_QUERY_TYPE (query)) { + default: + ret = GST_BASE_SRC_CLASS (parent_class)->query (src, query); + } + + return ret; } static gboolean diff --git a/tools/element-templates/element b/tools/element-templates/element index ed025ee2b2..f0d76ebc33 100644 --- a/tools/element-templates/element +++ b/tools/element-templates/element @@ -123,7 +123,17 @@ gst_replace_send_event (GstElement * element, GstEvent * event) static gboolean gst_replace_query (GstElement * element, GstQuery * query) { + GstReplace *replace = GST_REPLACE (element); + gboolean ret; - return FALSE; + GST_DEBUG_OBJECT (replace, "query"); + + switch (GST_QUERY_TYPE (query)) { + default: + ret = GST_ELEMENT_CLASS (parent_class)->query (element, query); + break; + } + + return ret; } % end From 7cd0ac046ab13bd839ad108e82922a7a92fbd263 Mon Sep 17 00:00:00 2001 From: David Schleef Date: Wed, 7 Mar 2012 19:22:28 -0800 Subject: [PATCH 115/138] decklink: Add property probing Renames the subdevice property to just device, and has it return the number of devices in the system in response to a probe. This is useful both for using multiple capture cards, and for detecting whether it's worth adding the element to a pipeline. Also cleans up the property descriptions. --- sys/decklink/Makefile.am | 1 + sys/decklink/gstdecklinksink.cpp | 3 +- sys/decklink/gstdecklinksrc.cpp | 173 ++++++++++++++++++++++++++++--- sys/decklink/gstdecklinksrc.h | 2 +- 4 files changed, 161 insertions(+), 18 deletions(-) diff --git a/sys/decklink/Makefile.am b/sys/decklink/Makefile.am index a35658f6fd..23895d79fd 100644 --- a/sys/decklink/Makefile.am +++ b/sys/decklink/Makefile.am @@ -11,6 +11,7 @@ libgstdecklink_la_LIBADD = \ $(GST_BASE_LIBS) \ $(GST_LIBS) \ -lgstvideo-@GST_MAJORMINOR@ \ + -lgstinterfaces-@GST_MAJORMINOR@ \ $(DECKLINK_LIBS) \ $(LIBM) libgstdecklink_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) diff --git a/sys/decklink/gstdecklinksink.cpp b/sys/decklink/gstdecklinksink.cpp index 1f5dbd6678..3648b2c2ce 100644 --- a/sys/decklink/gstdecklinksink.cpp +++ b/sys/decklink/gstdecklinksink.cpp @@ -189,7 +189,8 @@ gst_decklink_sink_class_init (GstDecklinkSinkClass * klass) element_class->query = GST_DEBUG_FUNCPTR (gst_decklink_sink_query); g_object_class_install_property (gobject_class, PROP_MODE, - g_param_spec_enum ("mode", "Mode", "Mode", + g_param_spec_enum ("mode", "Playback Mode", + "Video Mode to use for playback", GST_TYPE_DECKLINK_MODE, GST_DECKLINK_MODE_NTSC, (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT))); diff --git a/sys/decklink/gstdecklinksrc.cpp b/sys/decklink/gstdecklinksrc.cpp index 6b088e8caa..a6c5d89f4f 100644 --- a/sys/decklink/gstdecklinksrc.cpp +++ b/sys/decklink/gstdecklinksrc.cpp @@ -45,6 +45,8 @@ #include "gstdecklinksrc.h" #include "capture.h" #include +#include + GST_DEBUG_CATEGORY (gst_decklink_src_debug_category); #define GST_CAT_DEFAULT gst_decklink_src_debug_category @@ -118,6 +120,10 @@ static gboolean gst_decklink_src_video_src_query (GstPad * pad, GstQuery * query); static GstIterator *gst_decklink_src_video_src_iterintlink (GstPad * pad); +static void +gst_decklinksrc_property_probe_interface_init (GstPropertyProbeInterface * + iface); + static void gst_decklink_src_task (void *priv); #ifdef _MSC_VER @@ -131,7 +137,7 @@ enum PROP_MODE, PROP_CONNECTION, PROP_AUDIO_INPUT, - PROP_SUBDEVICE + PROP_DEVICE }; /* pad templates */ @@ -147,12 +153,24 @@ GST_STATIC_PAD_TEMPLATE ("audiosrc", /* class initialization */ -#define DEBUG_INIT(bla) \ - GST_DEBUG_CATEGORY_INIT (gst_decklink_src_debug_category, "decklinksrc", 0, \ +static void +gst_decklinksrc_init_interfaces (GType type) +{ + static const GInterfaceInfo decklinksrc_propertyprobe_info = { + (GInterfaceInitFunc) gst_decklinksrc_property_probe_interface_init, + NULL, + NULL, + }; + + GST_DEBUG_CATEGORY_INIT (gst_decklink_src_debug_category, "decklinksrc", 0, "debug category for decklinksrc element"); + g_type_add_interface_static (type, GST_TYPE_PROPERTY_PROBE, + &decklinksrc_propertyprobe_info); +} + GST_BOILERPLATE_FULL (GstDecklinkSrc, gst_decklink_src, GstElement, - GST_TYPE_ELEMENT, DEBUG_INIT); + GST_TYPE_ELEMENT, gst_decklinksrc_init_interfaces); static void gst_decklink_src_base_init (gpointer g_class) @@ -196,27 +214,29 @@ gst_decklink_src_class_init (GstDecklinkSrcClass * klass) element_class->query = GST_DEBUG_FUNCPTR (gst_decklink_src_query); g_object_class_install_property (gobject_class, PROP_MODE, - g_param_spec_enum ("mode", "Mode", "Mode", + g_param_spec_enum ("mode", "Mode", "Video Mode to use for capture", GST_TYPE_DECKLINK_MODE, GST_DECKLINK_MODE_NTSC, (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT))); g_object_class_install_property (gobject_class, PROP_CONNECTION, - g_param_spec_enum ("connection", "Connection", "Connection", + g_param_spec_enum ("connection", "Connection", + "Video Input Connection to use", GST_TYPE_DECKLINK_CONNECTION, GST_DECKLINK_CONNECTION_SDI, (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT))); g_object_class_install_property (gobject_class, PROP_AUDIO_INPUT, - g_param_spec_enum ("audio-input", "Audio Input", "Audio Input Connection", + g_param_spec_enum ("audio-input", "Audio Input", + "Audio Input Connection", GST_TYPE_DECKLINK_AUDIO_CONNECTION, GST_DECKLINK_AUDIO_CONNECTION_AUTO, (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT))); - g_object_class_install_property (gobject_class, PROP_SUBDEVICE, - g_param_spec_int ("subdevice", "Subdevice", "Subdevice", - 0, 3, 0, + g_object_class_install_property (gobject_class, PROP_DEVICE, + g_param_spec_int ("device", "Device", "Capture device instance to use", + 0, G_MAXINT, 0, (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT))); } @@ -297,7 +317,7 @@ gst_decklink_src_init (GstDecklinkSrc * decklinksrc, decklinksrc->mode = GST_DECKLINK_MODE_NTSC; decklinksrc->connection = GST_DECKLINK_CONNECTION_SDI; decklinksrc->audio_connection = GST_DECKLINK_AUDIO_CONNECTION_AUTO; - decklinksrc->subdevice = 0; + decklinksrc->device = 0; decklinksrc->stop = FALSE; decklinksrc->dropped_frames = 0; @@ -344,8 +364,8 @@ gst_decklink_src_set_property (GObject * object, guint property_id, decklinksrc->audio_connection = (GstDecklinkAudioConnectionEnum) g_value_get_enum (value); break; - case PROP_SUBDEVICE: - decklinksrc->subdevice = g_value_get_int (value); + case PROP_DEVICE: + decklinksrc->device = g_value_get_int (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); @@ -372,8 +392,8 @@ gst_decklink_src_get_property (GObject * object, guint property_id, case PROP_AUDIO_INPUT: g_value_set_enum (value, decklinksrc->audio_connection); break; - case PROP_SUBDEVICE: - g_value_set_int (value, decklinksrc->subdevice); + case PROP_DEVICE: + g_value_set_int (value, decklinksrc->device); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); @@ -516,7 +536,7 @@ gst_decklink_src_start (GstElement * element) GST_ERROR ("no card"); return FALSE; } - for (i = 0; i < decklinksrc->subdevice; i++) { + for (i = 0; i < decklinksrc->device; i++) { ret = iterator->Next (&decklinksrc->decklink); if (ret != S_OK) { GST_ERROR ("no card"); @@ -1285,3 +1305,124 @@ gst_decklink_src_task (void *priv) } audio_frame->Release (); } + + +static const GList * +gst_decklinksrc_probe_get_properties (GstPropertyProbe * probe) +{ + GObjectClass *klass = G_OBJECT_GET_CLASS (probe); + static GList *list = NULL; + static gsize init = 0; + + if (g_once_init_enter (&init)) { + list = + g_list_append (NULL, g_object_class_find_property (klass, "device")); + + g_once_init_leave (&init, 1); + } + + return list; +} + +static gboolean probed = FALSE; +int n_devices; + +static void +gst_decklinksrc_class_probe_devices (GstElementClass * klass) +{ + IDeckLinkIterator *iterator; + IDeckLink *decklink; + + n_devices = 0; + iterator = CreateDeckLinkIteratorInstance (); + if (iterator) { + while (iterator->Next (&decklink) == S_OK) { + n_devices++; + } + } + + probed = TRUE; +} + +static void +gst_decklinksrc_probe_probe_property (GstPropertyProbe * probe, + guint prop_id, const GParamSpec * pspec) +{ + GstElementClass *klass = GST_ELEMENT_GET_CLASS (probe); + + switch (prop_id) { + case PROP_DEVICE: + gst_decklinksrc_class_probe_devices (klass); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (probe, prop_id, pspec); + break; + } +} + +static gboolean +gst_decklinksrc_probe_needs_probe (GstPropertyProbe * probe, + guint prop_id, const GParamSpec * pspec) +{ + gboolean ret = FALSE; + + switch (prop_id) { + case PROP_DEVICE: + ret = !probed; + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (probe, prop_id, pspec); + break; + } + return ret; +} + +static GValueArray * +gst_decklinksrc_class_list_devices (GstElementClass * klass) +{ + GValueArray *array; + GValue value = { 0 }; + GList *item; + int i; + + array = g_value_array_new (n_devices); + g_value_init (&value, G_TYPE_INT); + for (i = 0; i < n_devices; i++) { + g_value_set_int (&value, i); + g_value_array_append (array, &value); + + item = item->next; + } + g_value_unset (&value); + + return array; +} + +static GValueArray * +gst_decklinksrc_probe_get_values (GstPropertyProbe * probe, + guint prop_id, const GParamSpec * pspec) +{ + GstElementClass *klass = GST_ELEMENT_GET_CLASS (probe); + GValueArray *array = NULL; + + switch (prop_id) { + case PROP_DEVICE: + array = gst_decklinksrc_class_list_devices (klass); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (probe, prop_id, pspec); + break; + } + + return array; +} + +static void +gst_decklinksrc_property_probe_interface_init (GstPropertyProbeInterface * + iface) +{ + iface->get_properties = gst_decklinksrc_probe_get_properties; + iface->probe_property = gst_decklinksrc_probe_probe_property; + iface->needs_probe = gst_decklinksrc_probe_needs_probe; + iface->get_values = gst_decklinksrc_probe_get_values; +} diff --git a/sys/decklink/gstdecklinksrc.h b/sys/decklink/gstdecklinksrc.h index 69dea49f1e..c47279a88b 100644 --- a/sys/decklink/gstdecklinksrc.h +++ b/sys/decklink/gstdecklinksrc.h @@ -73,7 +73,7 @@ struct _GstDecklinkSrc GstDecklinkModeEnum mode; GstDecklinkConnectionEnum connection; GstDecklinkAudioConnectionEnum audio_connection; - int subdevice; + int device; #ifdef _MSC_VER gboolean comInitialized; From e37ce96b2c2a231f82f570892607a0aeed1f4edf Mon Sep 17 00:00:00 2001 From: blake tregre Date: Mon, 31 Oct 2011 18:56:23 -0700 Subject: [PATCH 116/138] decklinksrc: handle flow return properly and provide better message * sys/decklink/gstdecklinksrc.cpp: --- sys/decklink/gstdecklinksrc.cpp | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/sys/decklink/gstdecklinksrc.cpp b/sys/decklink/gstdecklinksrc.cpp index a6c5d89f4f..37a306ce15 100644 --- a/sys/decklink/gstdecklinksrc.cpp +++ b/sys/decklink/gstdecklinksrc.cpp @@ -1269,8 +1269,12 @@ gst_decklink_src_task (void *priv) gst_buffer_set_caps (buffer, decklinksrc->video_caps); ret = gst_pad_push (decklinksrc->videosrcpad, buffer); - if (ret != GST_FLOW_OK) { - GST_ELEMENT_ERROR (decklinksrc, CORE, NEGOTIATION, (NULL), (NULL)); + if (! (ret == GST_FLOW_OK || ret == GST_FLOW_NOT_LINKED || + ret == GST_FLOW_WRONG_STATE)) { + GST_ELEMENT_ERROR (decklinksrc, STREAM, FAILED, + ("Internal data stream error."), + ("stream stopped, reason %s", + gst_flow_get_name (ret))); } if (gst_pad_is_linked (decklinksrc->audiosrcpad)) { @@ -1299,8 +1303,12 @@ gst_decklink_src_task (void *priv) gst_buffer_set_caps (audio_buffer, decklinksrc->audio_caps); ret = gst_pad_push (decklinksrc->audiosrcpad, audio_buffer); - if (ret != GST_FLOW_OK) { - GST_ELEMENT_ERROR (decklinksrc, CORE, NEGOTIATION, (NULL), (NULL)); + if (! (ret == GST_FLOW_OK || ret == GST_FLOW_NOT_LINKED || + ret == GST_FLOW_WRONG_STATE)) { + GST_ELEMENT_ERROR (decklinksrc, STREAM, FAILED, + ("Internal data stream error."), + ("stream stopped, reason %s", + gst_flow_get_name (ret))); } } audio_frame->Release (); From 83e2ca791c1747fade969b6ac286ae094cab6cba Mon Sep 17 00:00:00 2001 From: David Schleef Date: Sat, 17 Mar 2012 11:39:54 -0700 Subject: [PATCH 117/138] decklink: reindent --- sys/decklink/capture.cpp | 13 ++++----- sys/decklink/gstdecklink.cpp | 48 +++++++++++++++---------------- sys/decklink/gstdecklinksink.cpp | 36 ++++++++++++----------- sys/decklink/gstdecklinksrc.cpp | 49 ++++++++++++++------------------ 4 files changed, 71 insertions(+), 75 deletions(-) diff --git a/sys/decklink/capture.cpp b/sys/decklink/capture.cpp index 39ee6c449a..8804eebaf1 100644 --- a/sys/decklink/capture.cpp +++ b/sys/decklink/capture.cpp @@ -43,11 +43,11 @@ IDeckLink *deckLink; IDeckLinkInput *deckLinkInput; IDeckLinkDisplayModeIterator *displayModeIterator; -static BMDTimecodeFormat g_timecodeFormat = (BMDTimecodeFormat)0; +static BMDTimecodeFormat g_timecodeFormat = (BMDTimecodeFormat) 0; DeckLinkCaptureDelegate::DeckLinkCaptureDelegate ():m_refCount (0) { - m_mutex = g_mutex_new(); + m_mutex = g_mutex_new (); } DeckLinkCaptureDelegate::~DeckLinkCaptureDelegate () @@ -55,8 +55,7 @@ DeckLinkCaptureDelegate::~DeckLinkCaptureDelegate () g_mutex_free (m_mutex); } -ULONG -DeckLinkCaptureDelegate::AddRef (void) +ULONG DeckLinkCaptureDelegate::AddRef (void) { g_mutex_lock (m_mutex); m_refCount++; @@ -65,15 +64,15 @@ DeckLinkCaptureDelegate::AddRef (void) return (ULONG) m_refCount; } -ULONG -DeckLinkCaptureDelegate::Release (void) +ULONG DeckLinkCaptureDelegate::Release (void) { g_mutex_lock (m_mutex); m_refCount--; g_mutex_unlock (m_mutex); if (m_refCount == 0) { - delete this; + delete + this; return 0; } diff --git a/sys/decklink/gstdecklink.cpp b/sys/decklink/gstdecklink.cpp index 0920cca2f4..9090c46958 100644 --- a/sys/decklink/gstdecklink.cpp +++ b/sys/decklink/gstdecklink.cpp @@ -94,7 +94,8 @@ gst_decklink_audio_connection_get_type (void) if (!type) { static const GEnumValue connections[] = { {GST_DECKLINK_AUDIO_CONNECTION_AUTO, "auto", "Automatic"}, - {GST_DECKLINK_AUDIO_CONNECTION_EMBEDDED, "embedded", "SDI/HDMI embedded audio"}, + {GST_DECKLINK_AUDIO_CONNECTION_EMBEDDED, "embedded", + "SDI/HDMI embedded audio"}, {GST_DECKLINK_AUDIO_CONNECTION_AES_EBU, "aes", "AES/EBU input"}, {GST_DECKLINK_AUDIO_CONNECTION_ANALOG, "analog", "Analog input"}, {0, NULL, NULL} @@ -110,29 +111,29 @@ gst_decklink_audio_connection_get_type (void) #define HD 1, 1, false, true static const GstDecklinkMode modes[] = { - {bmdModeNTSC, 720, 486, 30000, 1001, true, NTSC }, - {bmdModeNTSC2398, 720, 486, 24000, 1001, true, NTSC }, - {bmdModePAL, 720, 576, 25, 1, true, PAL }, - {bmdModeNTSCp, 720, 486, 30000, 1001, false, NTSC }, - {bmdModePALp, 720, 576, 25, 1, false, PAL }, + {bmdModeNTSC, 720, 486, 30000, 1001, true, NTSC}, + {bmdModeNTSC2398, 720, 486, 24000, 1001, true, NTSC}, + {bmdModePAL, 720, 576, 25, 1, true, PAL}, + {bmdModeNTSCp, 720, 486, 30000, 1001, false, NTSC}, + {bmdModePALp, 720, 576, 25, 1, false, PAL}, - {bmdModeHD1080p2398, 1920, 1080, 24000, 1001, false, HD }, - {bmdModeHD1080p24, 1920, 1080, 24, 1, false, HD }, - {bmdModeHD1080p25, 1920, 1080, 25, 1, false, HD }, - {bmdModeHD1080p2997, 1920, 1080, 30000, 1001, false, HD }, - {bmdModeHD1080p30, 1920, 1080, 30, 1, false, HD }, + {bmdModeHD1080p2398, 1920, 1080, 24000, 1001, false, HD}, + {bmdModeHD1080p24, 1920, 1080, 24, 1, false, HD}, + {bmdModeHD1080p25, 1920, 1080, 25, 1, false, HD}, + {bmdModeHD1080p2997, 1920, 1080, 30000, 1001, false, HD}, + {bmdModeHD1080p30, 1920, 1080, 30, 1, false, HD}, - {bmdModeHD1080i50, 1920, 1080, 25, 1, true, HD }, - {bmdModeHD1080i5994, 1920, 1080, 30000, 1001, true, HD }, - {bmdModeHD1080i6000, 1920, 1080, 30, 1, true, HD }, + {bmdModeHD1080i50, 1920, 1080, 25, 1, true, HD}, + {bmdModeHD1080i5994, 1920, 1080, 30000, 1001, true, HD}, + {bmdModeHD1080i6000, 1920, 1080, 30, 1, true, HD}, - {bmdModeHD1080p50, 1920, 1080, 50, 1, false, HD }, - {bmdModeHD1080p5994, 1920, 1080, 30000, 1001, false, HD }, - {bmdModeHD1080p6000, 1920, 1080, 60, 1, false, HD }, + {bmdModeHD1080p50, 1920, 1080, 50, 1, false, HD}, + {bmdModeHD1080p5994, 1920, 1080, 30000, 1001, false, HD}, + {bmdModeHD1080p6000, 1920, 1080, 60, 1, false, HD}, - {bmdModeHD720p50, 1280, 720, 50, 1, false, HD }, - {bmdModeHD720p5994, 1280, 720, 60000, 1001, false, HD }, - {bmdModeHD720p60, 1280, 720, 60, 1, false, HD } + {bmdModeHD720p50, 1280, 720, 50, 1, false, HD}, + {bmdModeHD720p5994, 1280, 720, 60000, 1001, false, HD}, + {bmdModeHD720p60, 1280, 720, 60, 1, false, HD} }; @@ -155,8 +156,7 @@ gst_decklink_mode_get_structure (GstDecklinkModeEnum e) "interlaced", G_TYPE_BOOLEAN, mode->interlaced, "pixel-aspect-ratio", GST_TYPE_FRACTION, mode->par_n, mode->par_d, "color-matrix", G_TYPE_STRING, mode->is_hdtv ? "hdtv" : "sdtv", - "chroma-site", G_TYPE_STRING, "mpeg2", - NULL); + "chroma-site", G_TYPE_STRING, "mpeg2", NULL); } GstCaps * @@ -178,8 +178,8 @@ gst_decklink_mode_get_template_caps (void) GstStructure *s; caps = gst_caps_new_empty (); - for(i=0;i<(int)G_N_ELEMENTS(modes);i++) { - s = gst_decklink_mode_get_structure ((GstDecklinkModeEnum)i); + for (i = 0; i < (int) G_N_ELEMENTS (modes); i++) { + s = gst_decklink_mode_get_structure ((GstDecklinkModeEnum) i); gst_caps_append_structure (caps, s); } diff --git a/sys/decklink/gstdecklinksink.cpp b/sys/decklink/gstdecklinksink.cpp index 3648b2c2ce..c979d02101 100644 --- a/sys/decklink/gstdecklinksink.cpp +++ b/sys/decklink/gstdecklinksink.cpp @@ -277,17 +277,17 @@ gst_decklink_sink_init (GstDecklinkSink * decklinksink, decklinksink->callback->decklinksink = decklinksink; #ifdef _MSC_VER - decklinksink->com_init_lock = g_mutex_new(); - decklinksink->com_deinit_lock = g_mutex_new(); - decklinksink->com_initialized = g_cond_new(); - decklinksink->com_uninitialize = g_cond_new(); - decklinksink->com_uninitialized = g_cond_new(); + decklinksink->com_init_lock = g_mutex_new (); + decklinksink->com_deinit_lock = g_mutex_new (); + decklinksink->com_initialized = g_cond_new (); + decklinksink->com_uninitialize = g_cond_new (); + decklinksink->com_uninitialized = g_cond_new (); g_mutex_lock (decklinksink->com_init_lock); /* create the COM initialization thread */ - g_thread_create ((GThreadFunc)gst_decklink_sink_com_thread, - decklinksink, FALSE, NULL); + g_thread_create ((GThreadFunc) gst_decklink_sink_com_thread, + decklinksink, FALSE, NULL); /* wait until the COM thread signals that COM has been initialized */ g_cond_wait (decklinksink->com_initialized, decklinksink->com_init_lock); @@ -347,7 +347,8 @@ gst_decklink_sink_com_thread (GstDecklinkSink * src) res = CoInitializeEx (0, COINIT_MULTITHREADED); if (res == S_FALSE) - GST_WARNING_OBJECT (src, "COM has been already initialized in the same process"); + GST_WARNING_OBJECT (src, + "COM has been already initialized in the same process"); else if (res == RPC_E_CHANGED_MODE) GST_WARNING_OBJECT (src, "The concurrency model of COM has changed."); else @@ -402,7 +403,8 @@ gst_decklink_sink_finalize (GObject * object) if (decklinksink->comInitialized) { g_mutex_lock (decklinksink->com_deinit_lock); g_cond_signal (decklinksink->com_uninitialize); - g_cond_wait (decklinksink->com_uninitialized, decklinksink->com_deinit_lock); + g_cond_wait (decklinksink->com_uninitialized, + decklinksink->com_deinit_lock); g_mutex_unlock (decklinksink->com_deinit_lock); } @@ -455,8 +457,8 @@ gst_decklink_sink_start (GstDecklinkSink * decklinksink) } //decklinksink->video_enabled = TRUE; - decklinksink->output-> - SetScheduledFrameCompletionCallback (decklinksink->callback); + decklinksink->output->SetScheduledFrameCompletionCallback (decklinksink-> + callback); sample_depth = bmdAudioSampleType16bitInteger; ret = decklinksink->output->EnableAudioOutput (bmdAudioSampleRate48kHz, @@ -1089,16 +1091,18 @@ HRESULT return S_OK; } -HRESULT Output::ScheduledPlaybackHasStopped () +HRESULT +Output::ScheduledPlaybackHasStopped () { GST_ERROR ("ScheduledPlaybackHasStopped"); return S_OK; } -HRESULT Output::RenderAudioSamples (bool preroll) +HRESULT +Output::RenderAudioSamples (bool preroll) { uint32_t samplesWritten; - GstBuffer * buffer; + GstBuffer *buffer; // guint64 samplesToWrite; @@ -1108,9 +1112,7 @@ HRESULT Output::RenderAudioSamples (bool preroll) // running = true; } else { g_mutex_lock (decklinksink->audio_mutex); - decklinksink->output->ScheduleAudioSamples ( - GST_BUFFER_DATA (decklinksink->audio_buffer), - GST_BUFFER_SIZE (decklinksink->audio_buffer) / 4, // 2 bytes per sample, stereo + decklinksink->output->ScheduleAudioSamples (GST_BUFFER_DATA (decklinksink->audio_buffer), GST_BUFFER_SIZE (decklinksink->audio_buffer) / 4, // 2 bytes per sample, stereo 0, 0, &samplesWritten); buffer = diff --git a/sys/decklink/gstdecklinksrc.cpp b/sys/decklink/gstdecklinksrc.cpp index 37a306ce15..7d33729a29 100644 --- a/sys/decklink/gstdecklinksrc.cpp +++ b/sys/decklink/gstdecklinksrc.cpp @@ -322,20 +322,20 @@ gst_decklink_src_init (GstDecklinkSrc * decklinksrc, decklinksrc->stop = FALSE; decklinksrc->dropped_frames = 0; decklinksrc->dropped_frames_old = 0; - decklinksrc->frame_num = -1; /* -1 so will be 0 after incrementing */ + decklinksrc->frame_num = -1; /* -1 so will be 0 after incrementing */ #ifdef _MSC_VER - decklinksrc->com_init_lock = g_mutex_new(); - decklinksrc->com_deinit_lock = g_mutex_new(); - decklinksrc->com_initialized = g_cond_new(); - decklinksrc->com_uninitialize = g_cond_new(); - decklinksrc->com_uninitialized = g_cond_new(); + decklinksrc->com_init_lock = g_mutex_new (); + decklinksrc->com_deinit_lock = g_mutex_new (); + decklinksrc->com_initialized = g_cond_new (); + decklinksrc->com_uninitialize = g_cond_new (); + decklinksrc->com_uninitialized = g_cond_new (); g_mutex_lock (decklinksrc->com_init_lock); /* create the COM initialization thread */ - g_thread_create ((GThreadFunc)gst_decklink_src_com_thread, - decklinksrc, FALSE, NULL); + g_thread_create ((GThreadFunc) gst_decklink_src_com_thread, + decklinksrc, FALSE, NULL); /* wait until the COM thread signals that COM has been initialized */ g_cond_wait (decklinksrc->com_initialized, decklinksrc->com_init_lock); @@ -415,7 +415,8 @@ gst_decklink_src_com_thread (GstDecklinkSrc * src) res = CoInitializeEx (0, COINIT_MULTITHREADED); if (res == S_FALSE) - GST_WARNING_OBJECT (src, "COM has been already initialized in the same process"); + GST_WARNING_OBJECT (src, + "COM has been already initialized in the same process"); else if (res == RPC_E_CHANGED_MODE) GST_WARNING_OBJECT (src, "The concurrency model of COM has changed."); else @@ -470,7 +471,6 @@ gst_decklink_src_finalize (GObject * object) if (decklinksrc->video_caps) { gst_caps_unref (decklinksrc->video_caps); } - #ifdef _MSC_VER /* signal the COM thread that it should uninitialize COM */ if (decklinksrc->comInitialized) { @@ -1213,10 +1213,9 @@ gst_decklink_src_task (void *priv) /* warning on dropped frames */ if (decklinksrc->dropped_frames - decklinksrc->dropped_frames_old > 0) { GST_ELEMENT_WARNING (decklinksrc, RESOURCE, READ, - ("Dropped %d frame(s), for a total of %d frame(s)", - decklinksrc->dropped_frames - decklinksrc->dropped_frames_old, - decklinksrc->dropped_frames), - (NULL)); + ("Dropped %d frame(s), for a total of %d frame(s)", + decklinksrc->dropped_frames - decklinksrc->dropped_frames_old, + decklinksrc->dropped_frames), (NULL)); decklinksrc->dropped_frames_old = decklinksrc->dropped_frames; } @@ -1269,12 +1268,11 @@ gst_decklink_src_task (void *priv) gst_buffer_set_caps (buffer, decklinksrc->video_caps); ret = gst_pad_push (decklinksrc->videosrcpad, buffer); - if (! (ret == GST_FLOW_OK || ret == GST_FLOW_NOT_LINKED || - ret == GST_FLOW_WRONG_STATE)) { + if (!(ret == GST_FLOW_OK || ret == GST_FLOW_NOT_LINKED || + ret == GST_FLOW_WRONG_STATE)) { GST_ELEMENT_ERROR (decklinksrc, STREAM, FAILED, - ("Internal data stream error."), - ("stream stopped, reason %s", - gst_flow_get_name (ret))); + ("Internal data stream error."), + ("stream stopped, reason %s", gst_flow_get_name (ret))); } if (gst_pad_is_linked (decklinksrc->audiosrcpad)) { @@ -1287,9 +1285,7 @@ gst_decklink_src_task (void *priv) gst_util_uint64_scale_int (decklinksrc->num_audio_samples * GST_SECOND, 1, 48000); GST_BUFFER_DURATION (audio_buffer) = - gst_util_uint64_scale_int ((decklinksrc->num_audio_samples + - n_samples) * GST_SECOND, 1, - 48000) - GST_BUFFER_TIMESTAMP (audio_buffer); + gst_util_uint64_scale_int (n_samples * GST_SECOND, 1, 48000); decklinksrc->num_audio_samples += n_samples; if (decklinksrc->audio_caps == NULL) { @@ -1303,12 +1299,11 @@ gst_decklink_src_task (void *priv) gst_buffer_set_caps (audio_buffer, decklinksrc->audio_caps); ret = gst_pad_push (decklinksrc->audiosrcpad, audio_buffer); - if (! (ret == GST_FLOW_OK || ret == GST_FLOW_NOT_LINKED || - ret == GST_FLOW_WRONG_STATE)) { + if (!(ret == GST_FLOW_OK || ret == GST_FLOW_NOT_LINKED || + ret == GST_FLOW_WRONG_STATE)) { GST_ELEMENT_ERROR (decklinksrc, STREAM, FAILED, - ("Internal data stream error."), - ("stream stopped, reason %s", - gst_flow_get_name (ret))); + ("Internal data stream error."), + ("stream stopped, reason %s", gst_flow_get_name (ret))); } } audio_frame->Release (); From c13e4eacc247b72721182abae4c9773dcb1896ec Mon Sep 17 00:00:00 2001 From: David Schleef Date: Sat, 17 Mar 2012 11:41:04 -0700 Subject: [PATCH 118/138] decklinksrc: Implement latency query Implement latency query. Fix memleak releasing resources. --- sys/decklink/gstdecklinksrc.cpp | 53 ++++++++++++++++++++++++++++++--- 1 file changed, 49 insertions(+), 4 deletions(-) diff --git a/sys/decklink/gstdecklinksrc.cpp b/sys/decklink/gstdecklinksrc.cpp index 7d33729a29..b2d67f05c7 100644 --- a/sys/decklink/gstdecklinksrc.cpp +++ b/sys/decklink/gstdecklinksrc.cpp @@ -695,6 +695,9 @@ gst_decklink_src_stop (GstElement * element) decklinksrc->input->Release (); decklinksrc->input = NULL; + decklinksrc->decklink->Release (); + decklinksrc->decklink = NULL; + return TRUE; } @@ -782,8 +785,18 @@ gst_decklink_src_send_event (GstElement * element, GstEvent * event) static gboolean gst_decklink_src_query (GstElement * element, GstQuery * query) { + GstDecklinkSrc *decklinksrc = GST_DECKLINK_SRC (element); + gboolean ret; - return FALSE; + GST_DEBUG_OBJECT (decklinksrc, "query"); + + switch (GST_QUERY_TYPE (query)) { + default: + ret = GST_ELEMENT_CLASS (parent_class)->query (element, query); + break; + } + + return ret; } static GstCaps * @@ -1138,7 +1151,7 @@ gst_decklink_src_video_src_event (GstPad * pad, GstEvent * event) static gboolean gst_decklink_src_video_src_query (GstPad * pad, GstQuery * query) { - gboolean res; + gboolean ret; GstDecklinkSrc *decklinksrc; decklinksrc = GST_DECKLINK_SRC (gst_pad_get_parent (pad)); @@ -1146,13 +1159,45 @@ gst_decklink_src_video_src_query (GstPad * pad, GstQuery * query) GST_DEBUG_OBJECT (decklinksrc, "query"); switch (GST_QUERY_TYPE (query)) { + case GST_QUERY_LATENCY:{ + GstClockTime min_latency, max_latency; + const GstDecklinkMode *mode; + + /* device must be open */ + if (decklinksrc->decklink == NULL) { + GST_WARNING_OBJECT (decklinksrc, + "Can't give latency since device isn't open !"); + goto done; + } + + mode = gst_decklink_get_mode (decklinksrc->mode); + + /* min latency is the time to capture one frame */ + min_latency = + gst_util_uint64_scale_int (GST_SECOND, mode->fps_d, mode->fps_n); + + /* max latency is total duration of the frame buffer */ + max_latency = 2 * min_latency; + + GST_DEBUG_OBJECT (decklinksrc, + "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); + + ret = TRUE; + break; + } default: - res = gst_pad_query_default (pad, query); + ret = gst_pad_query_default (pad, query); break; } +done: gst_object_unref (decklinksrc); - return res; + return ret; } static GstIterator * From 86eeca91de0cd5143ef23355cd8d4792d13e7b71 Mon Sep 17 00:00:00 2001 From: blake tregre Date: Sat, 11 Feb 2012 22:49:10 -0800 Subject: [PATCH 119/138] decklinksrc: push new new segment event to all pads Take care to push the event to all pads, but favor the video src pad. Fixes: #667716. --- sys/decklink/gstdecklinksrc.cpp | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/sys/decklink/gstdecklinksrc.cpp b/sys/decklink/gstdecklinksrc.cpp index b2d67f05c7..37fd59ae61 100644 --- a/sys/decklink/gstdecklinksrc.cpp +++ b/sys/decklink/gstdecklinksrc.cpp @@ -1300,11 +1300,28 @@ gst_decklink_src_task (void *priv) event = gst_event_new_new_segment (FALSE, 1.0, GST_FORMAT_TIME, 0, GST_CLOCK_TIME_NONE, 0); - ret = gst_pad_push_event (decklinksrc->videosrcpad, event); - if (!ret) { - GST_ERROR_OBJECT (decklinksrc, "new segment event ret=%d", ret); - return; + if (gst_pad_is_linked (decklinksrc->videosrcpad)) { + gst_event_ref (event); + ret = gst_pad_push_event (decklinksrc->videosrcpad, event); + if (!ret) { + GST_ERROR_OBJECT (decklinksrc, "new segment event ret=%d", ret); + gst_event_unref (event); + return; + } + } else { + gst_event_unref (event); } + + if (gst_pad_is_linked (decklinksrc->audiosrcpad)) { + ret = gst_pad_push_event (decklinksrc->audiosrcpad, event); + if (!ret) { + GST_ERROR_OBJECT (decklinksrc, "new segment event ret=%d", ret); + gst_event_unref (event); + } + } else { + gst_event_unref (event); + } + } if (decklinksrc->video_caps == NULL) { From 409e8dcc903be14dc4254b8106d50635044b8fd9 Mon Sep 17 00:00:00 2001 From: blake tregre Date: Mon, 31 Oct 2011 18:57:22 -0700 Subject: [PATCH 120/138] decklinksrc: disable pull mode decklink device doesn't support any pull mode related functionality. it's more like a live source, you see. Fixes: #667720. --- sys/decklink/gstdecklinksrc.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/sys/decklink/gstdecklinksrc.cpp b/sys/decklink/gstdecklinksrc.cpp index 37fd59ae61..d2025a3a94 100644 --- a/sys/decklink/gstdecklinksrc.cpp +++ b/sys/decklink/gstdecklinksrc.cpp @@ -901,9 +901,8 @@ gst_decklink_src_audio_src_activatepull (GstPad * pad, gboolean active) GST_DEBUG_OBJECT (decklinksrc, "activatepull"); - gst_object_unref (decklinksrc); - return TRUE; + return FALSE; } static GstPadLinkReturn @@ -1096,7 +1095,7 @@ gst_decklink_src_video_src_activatepull (GstPad * pad, gboolean active) gst_object_unref (decklinksrc); - return TRUE; + return FALSE; } static GstPadLinkReturn From 18475dd0c229aa23a52add001f3d829cf0eb62ba Mon Sep 17 00:00:00 2001 From: blake tregre Date: Mon, 31 Oct 2011 18:58:34 -0700 Subject: [PATCH 121/138] decklinksrc: make sure we can accept caps before returning true caps are determined by the plugin's properties, so we should check the incoming caps to see if they agree. Fixes: #667722. --- sys/decklink/gstdecklinksrc.cpp | 32 +++++++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/sys/decklink/gstdecklinksrc.cpp b/sys/decklink/gstdecklinksrc.cpp index d2025a3a94..9fa07176a2 100644 --- a/sys/decklink/gstdecklinksrc.cpp +++ b/sys/decklink/gstdecklinksrc.cpp @@ -819,28 +819,39 @@ static gboolean gst_decklink_src_audio_src_setcaps (GstPad * pad, GstCaps * caps) { GstDecklinkSrc *decklinksrc; + GstCaps *pad_caps; + gboolean can_intersect; decklinksrc = GST_DECKLINK_SRC (gst_pad_get_parent (pad)); + pad_caps = gst_pad_get_caps_reffed (pad); + can_intersect = gst_caps_can_intersect (pad_caps, caps); + gst_caps_unref (pad_caps); + GST_DEBUG_OBJECT (decklinksrc, "setcaps"); gst_object_unref (decklinksrc); - return TRUE; + return can_intersect; } static gboolean gst_decklink_src_audio_src_acceptcaps (GstPad * pad, GstCaps * caps) { GstDecklinkSrc *decklinksrc; + GstCaps *pad_caps; + gboolean can_intersect; decklinksrc = GST_DECKLINK_SRC (gst_pad_get_parent (pad)); + pad_caps = gst_pad_get_caps_reffed (pad); + can_intersect = gst_caps_can_intersect (pad_caps, caps); + gst_caps_unref (pad_caps); + GST_DEBUG_OBJECT (decklinksrc, "acceptcaps"); - gst_object_unref (decklinksrc); - return TRUE; + return can_intersect; } static void @@ -1011,28 +1022,39 @@ static gboolean gst_decklink_src_video_src_setcaps (GstPad * pad, GstCaps * caps) { GstDecklinkSrc *decklinksrc; + GstCaps *mode_caps; + gboolean can_intersect; decklinksrc = GST_DECKLINK_SRC (gst_pad_get_parent (pad)); GST_DEBUG_OBJECT (decklinksrc, "setcaps"); + mode_caps = gst_decklink_mode_get_caps (decklinksrc->mode); + can_intersect = gst_caps_can_intersect (mode_caps, caps); + gst_caps_unref (mode_caps); gst_object_unref (decklinksrc); - return TRUE; + return can_intersect; } static gboolean gst_decklink_src_video_src_acceptcaps (GstPad * pad, GstCaps * caps) { GstDecklinkSrc *decklinksrc; + GstCaps *mode_caps; + gboolean can_intersect; + decklinksrc = GST_DECKLINK_SRC (gst_pad_get_parent (pad)); GST_DEBUG_OBJECT (decklinksrc, "acceptcaps"); + mode_caps = gst_decklink_mode_get_caps (decklinksrc->mode); + can_intersect = gst_caps_can_intersect (mode_caps, caps); + gst_caps_unref (mode_caps); gst_object_unref (decklinksrc); - return TRUE; + return can_intersect; } static void From aca69cbf6324c3b9e1bae5421bb57ccff28b3123 Mon Sep 17 00:00:00 2001 From: David Schleef Date: Sat, 17 Mar 2012 15:07:49 -0700 Subject: [PATCH 122/138] decklinksink: Add device property Also add property probe for device property, similar to decklinksrc. --- sys/decklink/gstdecklink.cpp | 32 ++++- sys/decklink/gstdecklink.h | 29 +--- sys/decklink/gstdecklinksink.cpp | 225 +++++++++++++++++++++++++------ sys/decklink/gstdecklinksink.h | 1 + sys/decklink/gstdecklinksrc.cpp | 27 +--- 5 files changed, 225 insertions(+), 89 deletions(-) diff --git a/sys/decklink/gstdecklink.cpp b/sys/decklink/gstdecklink.cpp index 9090c46958..d747fcf9d6 100644 --- a/sys/decklink/gstdecklink.cpp +++ b/sys/decklink/gstdecklink.cpp @@ -95,7 +95,7 @@ gst_decklink_audio_connection_get_type (void) static const GEnumValue connections[] = { {GST_DECKLINK_AUDIO_CONNECTION_AUTO, "auto", "Automatic"}, {GST_DECKLINK_AUDIO_CONNECTION_EMBEDDED, "embedded", - "SDI/HDMI embedded audio"}, + "SDI/HDMI embedded audio"}, {GST_DECKLINK_AUDIO_CONNECTION_AES_EBU, "aes", "AES/EBU input"}, {GST_DECKLINK_AUDIO_CONNECTION_ANALOG, "analog", "Analog input"}, {0, NULL, NULL} @@ -186,6 +186,36 @@ gst_decklink_mode_get_template_caps (void) return caps; } +IDeckLink * +gst_decklink_get_nth_device (int n) +{ + IDeckLinkIterator *iterator; + IDeckLink *decklink = NULL; + HRESULT ret; + int i; + + iterator = CreateDeckLinkIteratorInstance (); + if (iterator == NULL) { + GST_ERROR ("no driver"); + return NULL; + } + + ret = iterator->Next (&decklink); + if (ret != S_OK) { + GST_ERROR ("no card"); + return NULL; + } + for (i = 0; i < n; i++) { + ret = iterator->Next (&decklink); + if (ret != S_OK) { + GST_ERROR ("no card"); + return NULL; + } + } + + return decklink; +} + static gboolean plugin_init (GstPlugin * plugin) { diff --git a/sys/decklink/gstdecklink.h b/sys/decklink/gstdecklink.h index bd1d1d30b7..77c5cc43a8 100644 --- a/sys/decklink/gstdecklink.h +++ b/sys/decklink/gstdecklink.h @@ -107,34 +107,7 @@ const GstDecklinkMode * gst_decklink_get_mode (GstDecklinkModeEnum e); GstCaps * gst_decklink_mode_get_caps (GstDecklinkModeEnum e); GstCaps * gst_decklink_mode_get_template_caps (void); -#define GST_DECKLINK_MODE_CAPS(w,h,n,d,i) \ - "video/x-raw-yuv,format=(fourcc){ UYVY, v210 },width=" #w ",height=" #h \ - ",framerate=" #n "/" #d ",interlaced=" #i - -#define GST_DECKLINK_CAPS \ - GST_DECKLINK_MODE_CAPS(720,486,30000,1001,true) ";" \ - GST_DECKLINK_MODE_CAPS(720,486,24000,1001,true) ";" \ - GST_DECKLINK_MODE_CAPS(720,576,25,1,true) ";" \ - GST_DECKLINK_MODE_CAPS(720,486,30000,1001,false) ";" \ - GST_DECKLINK_MODE_CAPS(720,576,25,1,false) ";" \ - \ - GST_DECKLINK_MODE_CAPS(1920,1080,24000,1001,false) ";" \ - GST_DECKLINK_MODE_CAPS(1920,1080,24,1,false) ";" \ - GST_DECKLINK_MODE_CAPS(1920,1080,25,1,false) ";" \ - GST_DECKLINK_MODE_CAPS(1920,1080,30000,1001,false) ";" \ - GST_DECKLINK_MODE_CAPS(1920,1080,30,1,false) ";" \ - \ - GST_DECKLINK_MODE_CAPS(1920,1080,25,1,true) ";" \ - GST_DECKLINK_MODE_CAPS(1920,1080,30000,1001,true) ";" \ - GST_DECKLINK_MODE_CAPS(1920,1080,30,1,true) ";" \ - \ - GST_DECKLINK_MODE_CAPS(1920,1080,50,1,false) ";" \ - GST_DECKLINK_MODE_CAPS(1920,1080,60000,1001,false) ";" \ - GST_DECKLINK_MODE_CAPS(1920,1080,60,1,false) ";" \ - \ - GST_DECKLINK_MODE_CAPS(1280,720,50,1,false) ";" \ - GST_DECKLINK_MODE_CAPS(1280,720,60000,1001,false) ";" \ - GST_DECKLINK_MODE_CAPS(1280,720,60,1,false) +IDeckLink * gst_decklink_get_nth_device (int n); #endif diff --git a/sys/decklink/gstdecklinksink.cpp b/sys/decklink/gstdecklinksink.cpp index c979d02101..bbf08a73fa 100644 --- a/sys/decklink/gstdecklinksink.cpp +++ b/sys/decklink/gstdecklinksink.cpp @@ -35,8 +35,8 @@ #endif #include -#include #include +#include #include "gstdecklink.h" #include "gstdecklinksink.h" #include @@ -118,24 +118,25 @@ static GstFlowReturn gst_decklink_sink_audiosink_bufferalloc (GstPad * pad, guint64 offset, guint size, GstCaps * caps, GstBuffer ** buf); static GstIterator *gst_decklink_sink_audiosink_iterintlink (GstPad * pad); +static void +gst_decklink_sink_property_probe_interface_init (GstPropertyProbeInterface * + iface); + #ifdef _MSC_VER /* COM initialization/uninitialization thread */ -static void gst_decklink_sink_com_thread (GstDecklinkSink * src); +static void gst_decklink_sink_com_thread (GstDecklinkSink * sink); #endif /* _MSC_VER */ enum { PROP_0, - PROP_MODE + PROP_MODE, + PROP_DEVICE }; /* pad templates */ -static GstStaticPadTemplate gst_decklink_sink_videosink_template = -GST_STATIC_PAD_TEMPLATE ("videosink", - GST_PAD_SINK, - GST_PAD_ALWAYS, - GST_STATIC_CAPS (GST_DECKLINK_CAPS)); +/* the video sink pad template is created on the fly */ static GstStaticPadTemplate gst_decklink_sink_audiosink_template = GST_STATIC_PAD_TEMPLATE ("audiosink", @@ -151,16 +152,37 @@ GST_STATIC_PAD_TEMPLATE ("audiosink", GST_DEBUG_CATEGORY_INIT (gst_decklink_sink_debug_category, "decklinksink", 0, \ "debug category for decklinksink element"); +static void +gst_decklink_sink_init_interfaces (GType type) +{ + static const GInterfaceInfo decklink_sink_propertyprobe_info = { + (GInterfaceInitFunc) gst_decklink_sink_property_probe_interface_init, + NULL, + NULL, + }; + + GST_DEBUG_CATEGORY_INIT (gst_decklink_sink_debug_category, "decklinksink", 0, + "debug category for decklinksink element"); + + g_type_add_interface_static (type, GST_TYPE_PROPERTY_PROBE, + &decklink_sink_propertyprobe_info); +} + + GST_BOILERPLATE_FULL (GstDecklinkSink, gst_decklink_sink, GstElement, - GST_TYPE_ELEMENT, DEBUG_INIT); + GST_TYPE_ELEMENT, gst_decklink_sink_init_interfaces); static void gst_decklink_sink_base_init (gpointer g_class) { GstElementClass *element_class = GST_ELEMENT_CLASS (g_class); + GstPadTemplate *pad_template; - gst_element_class_add_static_pad_template (element_class, - &gst_decklink_sink_videosink_template); + pad_template = + gst_pad_template_new ("videosink", GST_PAD_SINK, GST_PAD_ALWAYS, + gst_decklink_mode_get_template_caps ()); + gst_element_class_add_pad_template (element_class, pad_template); + gst_object_unref (pad_template); gst_element_class_add_static_pad_template (element_class, &gst_decklink_sink_audiosink_template); @@ -195,6 +217,12 @@ gst_decklink_sink_class_init (GstDecklinkSinkClass * klass) (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT))); + g_object_class_install_property (gobject_class, PROP_DEVICE, + g_param_spec_int ("device", "Device", "Capture device instance to use", + 0, G_MAXINT, 0, + (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | + G_PARAM_CONSTRUCT))); + } static void @@ -203,8 +231,8 @@ gst_decklink_sink_init (GstDecklinkSink * decklinksink, { decklinksink->videosinkpad = - gst_pad_new_from_static_template (&gst_decklink_sink_videosink_template, - "sink"); + gst_pad_new_from_template (gst_element_class_get_pad_template + (GST_ELEMENT_CLASS (decklinksink_class), "videosink"), "videosink"); gst_pad_set_getcaps_function (decklinksink->videosinkpad, GST_DEBUG_FUNCPTR (gst_decklink_sink_videosink_getcaps)); gst_pad_set_setcaps_function (decklinksink->videosinkpad, @@ -272,6 +300,7 @@ gst_decklink_sink_init (GstDecklinkSink * decklinksink, decklinksink->audio_mutex = g_mutex_new (); decklinksink->mode = GST_DECKLINK_MODE_NTSC; + decklinksink->device = 0; decklinksink->callback = new Output; decklinksink->callback->decklinksink = decklinksink; @@ -308,6 +337,9 @@ gst_decklink_sink_set_property (GObject * object, guint property_id, case PROP_MODE: decklinksink->mode = (GstDecklinkModeEnum) g_value_get_enum (value); break; + case PROP_DEVICE: + decklinksink->device = g_value_get_int (value); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; @@ -327,6 +359,9 @@ gst_decklink_sink_get_property (GObject * object, guint property_id, case PROP_MODE: g_value_set_enum (value, decklinksink->mode); break; + case PROP_DEVICE: + g_value_set_int (value, decklinksink->device); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); break; @@ -335,11 +370,11 @@ gst_decklink_sink_get_property (GObject * object, guint property_id, #ifdef _MSC_VER static void -gst_decklink_sink_com_thread (GstDecklinkSink * src) +gst_decklink_sink_com_thread (GstDecklinkSink * sink) { HRESULT res; - g_mutex_lock (src->com_init_lock); + g_mutex_lock (sink->com_init_lock); /* Initialize COM with a MTA for this process. This thread will * be the first one to enter the apartement and the last one to leave @@ -347,29 +382,29 @@ gst_decklink_sink_com_thread (GstDecklinkSink * src) res = CoInitializeEx (0, COINIT_MULTITHREADED); if (res == S_FALSE) - GST_WARNING_OBJECT (src, + GST_WARNING_OBJECT (sink, "COM has been already initialized in the same process"); else if (res == RPC_E_CHANGED_MODE) - GST_WARNING_OBJECT (src, "The concurrency model of COM has changed."); + GST_WARNING_OBJECT (sink, "The concurrency model of COM has changed."); else - GST_INFO_OBJECT (src, "COM intialized succesfully"); + GST_INFO_OBJECT (sink, "COM intialized succesfully"); - src->comInitialized = TRUE; + sink->comInitialized = TRUE; /* Signal other threads waiting on this condition that COM was initialized */ - g_cond_signal (src->com_initialized); + g_cond_signal (sink->com_initialized); - g_mutex_unlock (src->com_init_lock); + g_mutex_unlock (sink->com_init_lock); /* Wait until the unitialize condition is met to leave the COM apartement */ - g_mutex_lock (src->com_deinit_lock); - g_cond_wait (src->com_uninitialize, src->com_deinit_lock); + g_mutex_lock (sink->com_deinit_lock); + g_cond_wait (sink->com_uninitialize, sink->com_deinit_lock); CoUninitialize (); - GST_INFO_OBJECT (src, "COM unintialized succesfully"); - src->comInitialized = FALSE; - g_cond_signal (src->com_uninitialized); - g_mutex_unlock (src->com_deinit_lock); + GST_INFO_OBJECT (sink, "COM unintialized succesfully"); + sink->comInitialized = FALSE; + g_cond_signal (sink->com_uninitialized); + g_mutex_unlock (sink->com_deinit_lock); } #endif /* _MSC_VER */ @@ -421,27 +456,19 @@ gst_decklink_sink_finalize (GObject * object) static gboolean gst_decklink_sink_start (GstDecklinkSink * decklinksink) { - IDeckLinkIterator *iterator; HRESULT ret; const GstDecklinkMode *mode; BMDAudioSampleType sample_depth; - iterator = CreateDeckLinkIteratorInstance (); - if (iterator == NULL) { - GST_ERROR ("no driver"); - return FALSE; - } - - ret = iterator->Next (&decklinksink->decklink); - if (ret != S_OK) { - GST_ERROR ("no card"); + decklinksink->decklink = gst_decklink_get_nth_device (decklinksink->device); + if (decklinksink->decklink) { return FALSE; } ret = decklinksink->decklink->QueryInterface (IID_IDeckLinkOutput, (void **) &decklinksink->output); if (ret != S_OK) { - GST_ERROR ("no output"); + GST_ERROR ("selected device does not have output interface"); return FALSE; } @@ -1135,3 +1162,125 @@ Output::RenderAudioSamples (bool preroll) return S_OK; } + + +static const GList * +gst_decklink_sink_probe_get_properties (GstPropertyProbe * probe) +{ + GObjectClass *klass = G_OBJECT_GET_CLASS (probe); + static GList *list = NULL; + static gsize init = 0; + + if (g_once_init_enter (&init)) { + list = g_list_append (NULL, g_object_class_find_property (klass, "device")); + + g_once_init_leave (&init, 1); + } + + return list; +} + + +static gboolean probed = FALSE; +static int n_devices; + +static void +gst_decklink_sink_class_probe_devices (GstElementClass * klass) +{ + IDeckLinkIterator *iterator; + IDeckLink *decklink; + + n_devices = 0; + iterator = CreateDeckLinkIteratorInstance (); + if (iterator) { + while (iterator->Next (&decklink) == S_OK) { + n_devices++; + } + } + + probed = TRUE; +} + +static void +gst_decklink_sink_probe_probe_property (GstPropertyProbe * probe, + guint prop_id, const GParamSpec * pspec) +{ + GstElementClass *klass = GST_ELEMENT_GET_CLASS (probe); + + switch (prop_id) { + case PROP_DEVICE: + gst_decklink_sink_class_probe_devices (klass); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (probe, prop_id, pspec); + break; + } +} + +static gboolean +gst_decklink_sink_probe_needs_probe (GstPropertyProbe * probe, + guint prop_id, const GParamSpec * pspec) +{ + gboolean ret = FALSE; + + switch (prop_id) { + case PROP_DEVICE: + ret = !probed; + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (probe, prop_id, pspec); + break; + } + return ret; +} + +static GValueArray * +gst_decklink_sink_class_list_devices (GstElementClass * klass) +{ + GValueArray *array; + GValue value = { + 0}; + GList *item; + int i; + + array = g_value_array_new (n_devices); + g_value_init (&value, G_TYPE_INT); + for (i = 0; i < n_devices; i++) { + g_value_set_int (&value, i); + g_value_array_append (array, &value); + + item = item->next; + } + g_value_unset (&value); + + return array; +} + +static GValueArray * +gst_decklink_sink_probe_get_values (GstPropertyProbe * probe, + guint prop_id, const GParamSpec * pspec) +{ + GstElementClass *klass = GST_ELEMENT_GET_CLASS (probe); + GValueArray *array = NULL; + + switch (prop_id) { + case PROP_DEVICE: + array = gst_decklink_sink_class_list_devices (klass); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (probe, prop_id, pspec); + break; + } + + return array; +} + +static void +gst_decklink_sink_property_probe_interface_init (GstPropertyProbeInterface * + iface) +{ + iface->get_properties = gst_decklink_sink_probe_get_properties; + iface->probe_property = gst_decklink_sink_probe_probe_property; + iface->needs_probe = gst_decklink_sink_probe_needs_probe; + iface->get_values = gst_decklink_sink_probe_get_values; +} diff --git a/sys/decklink/gstdecklinksink.h b/sys/decklink/gstdecklinksink.h index 31d70cd785..20c47edc2e 100644 --- a/sys/decklink/gstdecklinksink.h +++ b/sys/decklink/gstdecklinksink.h @@ -75,6 +75,7 @@ struct _GstDecklinkSink /* properties */ GstDecklinkModeEnum mode; + int device; #ifdef _MSC_VER gboolean comInitialized; diff --git a/sys/decklink/gstdecklinksrc.cpp b/sys/decklink/gstdecklinksrc.cpp index 9fa07176a2..710802304b 100644 --- a/sys/decklink/gstdecklinksrc.cpp +++ b/sys/decklink/gstdecklinksrc.cpp @@ -510,7 +510,6 @@ static gboolean gst_decklink_src_start (GstElement * element) { GstDecklinkSrc *decklinksrc = GST_DECKLINK_SRC (element); - IDeckLinkIterator *iterator; DeckLinkCaptureDelegate *delegate; //IDeckLinkDisplayModeIterator *mode_iterator; //IDeckLinkDisplayMode *mode; @@ -521,33 +520,18 @@ gst_decklink_src_start (GstElement * element) IDeckLinkConfiguration *config; BMDVideoConnection conn; BMDAudioConnection aconn; - int i; GST_DEBUG_OBJECT (decklinksrc, "start"); - iterator = CreateDeckLinkIteratorInstance (); - if (iterator == NULL) { - GST_ERROR ("no driver"); + decklinksrc->decklink = gst_decklink_get_nth_device (decklinksrc->device); + if (decklinksrc->decklink == NULL) { return FALSE; } - ret = iterator->Next (&decklinksrc->decklink); - if (ret != S_OK) { - GST_ERROR ("no card"); - return FALSE; - } - for (i = 0; i < decklinksrc->device; i++) { - ret = iterator->Next (&decklinksrc->decklink); - if (ret != S_OK) { - GST_ERROR ("no card"); - return FALSE; - } - } - ret = decklinksrc->decklink->QueryInterface (IID_IDeckLinkInput, (void **) &decklinksrc->input); if (ret != S_OK) { - GST_ERROR ("query interface failed"); + GST_ERROR ("selected device does not have input interface"); return FALSE; } @@ -1401,8 +1385,7 @@ gst_decklinksrc_probe_get_properties (GstPropertyProbe * probe) static gsize init = 0; if (g_once_init_enter (&init)) { - list = - g_list_append (NULL, g_object_class_find_property (klass, "device")); + list = g_list_append (NULL, g_object_class_find_property (klass, "device")); g_once_init_leave (&init, 1); } @@ -1411,7 +1394,7 @@ gst_decklinksrc_probe_get_properties (GstPropertyProbe * probe) } static gboolean probed = FALSE; -int n_devices; +static int n_devices; static void gst_decklinksrc_class_probe_devices (GstElementClass * klass) From 6f3ea8e67bb39e56552e63a11b1de036fc5c1907 Mon Sep 17 00:00:00 2001 From: Carsten Kroll Date: Thu, 15 Mar 2012 22:12:59 +0100 Subject: [PATCH 123/138] d3dvideosink: fix regression setting window handle in pause/play https://bugzilla.gnome.org/show_bug.cgi?id=656905 --- sys/d3dvideosink/d3dvideosink.c | 87 +++++++++++---------------------- 1 file changed, 28 insertions(+), 59 deletions(-) diff --git a/sys/d3dvideosink/d3dvideosink.c b/sys/d3dvideosink/d3dvideosink.c index 504d8104f5..eef480a1ac 100644 --- a/sys/d3dvideosink/d3dvideosink.c +++ b/sys/d3dvideosink/d3dvideosink.c @@ -63,7 +63,6 @@ struct _GstD3DVideoSinkHookData static GstD3DVideoSinkShared shared; /* Define a shared lock to synchronize the creation/destruction of the d3d device */ static GStaticMutex shared_d3d_lock = G_STATIC_MUTEX_INIT; -static G_GNUC_UNUSED GStaticMutex shared_d3d_dev_lock = G_STATIC_MUTEX_INIT; static GStaticMutex shared_d3d_hook_lock = G_STATIC_MUTEX_INIT; /* Hold a reference to our dll's HINSTANCE */ static HINSTANCE g_hinstDll = NULL; @@ -155,12 +154,11 @@ static void gst_d3dvideosink_remove_window_for_renderer (GstD3DVideoSink * sink); static gboolean gst_d3dvideosink_initialize_direct3d (GstD3DVideoSink * sink); static gboolean gst_d3dvideosink_initialize_d3d_device (GstD3DVideoSink * sink); -static gboolean gst_d3dvideosink_resize_swap_chain (GstD3DVideoSink * sink, - gint width, gint height) G_GNUC_UNUSED; + static gboolean gst_d3dvideosink_notify_device_init (GstD3DVideoSink * sink); static gboolean gst_d3dvideosink_notify_device_lost (GstD3DVideoSink * sink); static gboolean gst_d3dvideosink_notify_device_reset (GstD3DVideoSink * sink); -static gboolean gst_d3dvideosink_notify_device_resize (GstD3DVideoSink * sink); +static gboolean gst_d3dvideosink_notify_device_reinit (GstD3DVideoSink * sink); static gboolean gst_d3dvideosink_device_lost (GstD3DVideoSink * sink); static gboolean gst_d3dvideosink_release_d3d_device (GstD3DVideoSink * sink); static gboolean gst_d3dvideosink_release_direct3d (GstD3DVideoSink * sink); @@ -270,8 +268,7 @@ gst_d3dvideosink_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, &sink_template); gst_element_class_set_details_simple (element_class, "Direct3D video sink", "Sink/Video", @@ -531,10 +528,7 @@ gst_d3dvideosink_create_shared_hidden_window (GstD3DVideoSink * sink) goto failed; CloseHandle (shared.hidden_window_created_signal); -/* - if (!shared.d3ddev) - goto failed; -*/ + GST_DEBUG ("Successfully created Direct3D hidden window, handle: %p", shared.hidden_window_handle); @@ -639,7 +633,9 @@ SharedHiddenWndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { shared.device_lost_sink = NULL; GST_DEBUG ("Initializing Direct3D"); + GST_D3DVIDEOSINK_SWAP_CHAIN_LOCK (sink); gst_d3dvideosink_initialize_d3d_device (sink); + GST_D3DVIDEOSINK_SWAP_CHAIN_UNLOCK (sink); GST_DEBUG ("Direct3D initialization complete"); break; @@ -664,9 +660,11 @@ SharedHiddenWndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { /* Did we receive a message to check if the device is available again? */ if (wParam == IDT_DEVICELOST) { + GST_D3DVIDEOSINK_SWAP_CHAIN_LOCK (sink); /* This will synchronously call SharedHiddenWndProc() because this thread is the one that created the window. */ SendMessage (hWnd, WM_DIRECTX_D3D_DEVICELOST, 0, (LPARAM) shared.device_lost_sink); + GST_D3DVIDEOSINK_SWAP_CHAIN_UNLOCK (sink); return 0; } break; @@ -736,6 +734,9 @@ WndProcHook (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) GstD3DVideoSink *sink = (GstD3DVideoSink *) GetProp (hWnd, TEXT ("GstD3DVideoSink")); + if (!sink) + return FALSE; + switch (message) { case WM_ERASEBKGND: return TRUE; @@ -802,6 +803,8 @@ static void gst_d3dvideosink_wnd_proc (GstD3DVideoSink * sink, HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { + if (!sink) + return; switch (message) { case WM_COPYDATA: { @@ -1069,12 +1072,18 @@ gst_d3dvideosink_set_window_handle (GstXOverlay * overlay, guintptr window_id) /* If we're already playing/paused, then we need to lock the swap chain, and recreate it with the new window. */ if (sink->d3ddev != NULL) { + GST_D3DVIDEOSINK_SWAP_CHAIN_LOCK (sink); /* Close our existing window if there is one */ gst_d3dvideosink_close_window (sink); /* Save our window id */ sink->window_handle = hWnd; gst_d3dvideosink_set_window_for_renderer (sink); - gst_d3dvideosink_notify_device_resize (sink); + sink->window_closed = FALSE; + + gst_d3dvideosink_notify_device_reinit (sink); + GST_D3DVIDEOSINK_SWAP_CHAIN_UNLOCK (sink); + //gst_d3dvideosink_notify_device_init(sink); + } else { sink->window_handle = hWnd; } @@ -1314,8 +1323,6 @@ GST_D3DVIDEOSINK_SHARED_D3D_HOOK_UNLOCK GST_D3DVIDEOSINK_SHARED_D3D_UNLOCK} static void gst_d3dvideosink_remove_window_for_renderer (GstD3DVideoSink * sink) { - //GST_D3DVIDEOSINK_SHARED_D3D_LOCK - //GST_D3DVIDEOSINK_SWAP_CHAIN_LOCK(sink); { GST_DEBUG ("Removing custom rendering window procedure"); if (!sink->is_new_window && sink->window_handle) { @@ -1342,8 +1349,6 @@ gst_d3dvideosink_remove_window_for_renderer (GstD3DVideoSink * sink) /* Remove the property associating our sink with the window */ RemoveProp (sink->window_handle, TEXT ("GstD3DVideoSink")); } - //GST_D3DVIDEOSINK_SWAP_CHAIN_UNLOCK(sink); - //GST_D3DVIDEOSINK_SHARED_D3D_UNLOCK } static void @@ -1373,7 +1378,7 @@ gst_d3dvideosink_change_state (GstElement * element, GstStateChange transition) switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: if (!gst_d3dvideosink_initialize_direct3d (sink)) - return GST_STATE_CHANGE_FAILURE; + return GST_STATE_CHANGE_FAILURE; break; case GST_STATE_CHANGE_READY_TO_PAUSED: break; @@ -2034,9 +2039,6 @@ gst_d3dvideosink_initialize_d3d_device (GstD3DVideoSink * sink) /* Get the current size of the window */ gst_d3dvideosink_window_size (sink, &width, &height); - - GST_D3DVIDEOSINK_SWAP_CHAIN_LOCK (sink); - if (!shared.d3d) { GST_WARNING ("Direct3D object has not been initialized"); goto error; @@ -2195,41 +2197,10 @@ gst_d3dvideosink_initialize_d3d_device (GstD3DVideoSink * sink) //} /*success:*/ - GST_D3DVIDEOSINK_SWAP_CHAIN_UNLOCK (sink); + //GST_D3DVIDEOSINK_SWAP_CHAIN_UNLOCK (sink); return TRUE; error: - GST_D3DVIDEOSINK_SWAP_CHAIN_UNLOCK (sink); - return FALSE; -} - - -static gboolean -gst_d3dvideosink_resize_swap_chain (GstD3DVideoSink * sink, gint width, - gint height) -{ - if (width <= 0 || height <= 0 || width > GetSystemMetrics (SM_CXFULLSCREEN) - || height > GetSystemMetrics (SM_CYFULLSCREEN)) { - GST_DEBUG ("Invalid size"); - return FALSE; - } - if (!shared.d3d || !sink->d3ddev) { - GST_DEBUG_OBJECT (sink, "Direct3D device not initialized."); - return TRUE; - } - - GST_LOG_OBJECT (sink, "Resizing Direct3D swap chain for sink %p to %dx%d", - sink, width, height); - /* actually recreates the device + associated surfaces - must be called from thread that created the device */ - if (!gst_d3dvideosink_notify_device_resize (sink)) - goto error; - - -/* success:*/ - GST_LOG_OBJECT (sink, "Direct3D swap chain successfully resized"); - return TRUE; -error: - GST_ERROR_OBJECT (sink, "Error attempting to resize the Direct3D swap chain"); + //GST_D3DVIDEOSINK_SWAP_CHAIN_UNLOCK (sink); return FALSE; } @@ -2244,10 +2215,10 @@ gst_d3dvideosink_notify_device_init (GstD3DVideoSink * sink) } static gboolean -gst_d3dvideosink_notify_device_resize (GstD3DVideoSink * sink) +gst_d3dvideosink_notify_device_reinit (GstD3DVideoSink * sink) { if (sink->window_handle) { - SendMessage (shared.hidden_window_handle, WM_DIRECTX_D3D_RESIZE, 0, + SendMessage (shared.hidden_window_handle, WM_DIRECTX_D3D_DEVICELOST, 0, (LPARAM) sink); } return TRUE; @@ -2295,7 +2266,6 @@ gst_d3dvideosink_device_lost (GstD3DVideoSink * sink) { /* Must be called from hidden window's message loop! */ - GST_D3DVIDEOSINK_SWAP_CHAIN_LOCK (sink); { if (shared.device_lost) GST_DEBUG ("Direct3D device lost"); @@ -2343,18 +2313,15 @@ gst_d3dvideosink_device_lost (GstD3DVideoSink * sink) /*success:*/ GST_DEBUG ("Direct3D device has successfully been reset."); - GST_D3DVIDEOSINK_SWAP_CHAIN_UNLOCK (sink); return TRUE; error: GST_DEBUG ("Unable to successfully reset the Direct3D device."); - GST_D3DVIDEOSINK_SWAP_CHAIN_UNLOCK (sink); return FALSE; } static gboolean gst_d3dvideosink_release_d3d_device (GstD3DVideoSink * sink) { - GST_D3DVIDEOSINK_SWAP_CHAIN_LOCK (sink); if (sink->d3ddev) { int ref_count; ref_count = IDirect3DDevice9_Release (sink->d3ddev); @@ -2369,7 +2336,7 @@ gst_d3dvideosink_release_d3d_device (GstD3DVideoSink * sink) GST_DEBUG_OBJECT (sink, "Direct3D offscreen surface released. Reference count: %d", ref_count); } - GST_D3DVIDEOSINK_SWAP_CHAIN_UNLOCK (sink); + //GST_D3DVIDEOSINK_SWAP_CHAIN_UNLOCK (sink); return TRUE; } @@ -2391,7 +2358,9 @@ gst_d3dvideosink_release_direct3d (GstD3DVideoSink * sink) if (shared.element_count > 0) goto success; + GST_D3DVIDEOSINK_SWAP_CHAIN_LOCK (sink); gst_d3dvideosink_release_d3d_device (sink); + GST_D3DVIDEOSINK_SWAP_CHAIN_UNLOCK (sink); if (shared.d3d) { int ref_count; ref_count = IDirect3D9_Release (shared.d3d); From 0fad58c1231064964229551d555ff000f4702491 Mon Sep 17 00:00:00 2001 From: Nicola Murino Date: Sat, 17 Mar 2012 15:09:21 +0100 Subject: [PATCH 124/138] opencv: fix memory leak https://bugzilla.gnome.org/show_bug.cgi?id=672295 --- ext/opencv/gstopencvvideofilter.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ext/opencv/gstopencvvideofilter.c b/ext/opencv/gstopencvvideofilter.c index 7c42b19569..dcb98c01ab 100644 --- a/ext/opencv/gstopencvvideofilter.c +++ b/ext/opencv/gstopencvvideofilter.c @@ -122,6 +122,8 @@ gst_opencv_video_filter_finalize (GObject * obj) if (transform->cvImage) cvReleaseImage (&transform->cvImage); + if (transform->out_cvImage) + cvReleaseImage (&transform->out_cvImage); G_OBJECT_CLASS (parent_class)->finalize (obj); } From 362727b9f4970233040fe1e72282db26bc0d91d6 Mon Sep 17 00:00:00 2001 From: Nicola Murino Date: Sun, 18 Mar 2012 00:51:32 +0000 Subject: [PATCH 125/138] facedetect: fix structure leak https://bugzilla.gnome.org/show_bug.cgi?id=672294 --- ext/opencv/gstfacedetect.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ext/opencv/gstfacedetect.c b/ext/opencv/gstfacedetect.c index 485e424245..e51eb52c78 100644 --- a/ext/opencv/gstfacedetect.c +++ b/ext/opencv/gstfacedetect.c @@ -616,9 +616,10 @@ gst_face_detect_transform_ip (GstOpencvVideoFilter * base, GstBuffer * buf, } g_value_init (&facedata, GST_TYPE_STRUCTURE); - gst_value_set_structure (&facedata, s); + g_value_take_boxed (&facedata, s); gst_value_list_append_value (&facelist, &facedata); g_value_unset (&facedata); + s = NULL; if (do_display) { CvPoint center; From e54218a648ffc94af41f96ed0de8df8058cf5e45 Mon Sep 17 00:00:00 2001 From: David Schleef Date: Sun, 18 Mar 2012 14:43:16 -0700 Subject: [PATCH 126/138] adpcmdec: Add -lgstbase-0.10 --- gst/adpcmdec/Makefile.am | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/gst/adpcmdec/Makefile.am b/gst/adpcmdec/Makefile.am index 84e1252242..f0d5d9ed62 100644 --- a/gst/adpcmdec/Makefile.am +++ b/gst/adpcmdec/Makefile.am @@ -6,7 +6,9 @@ libgstadpcmdec_la_SOURCES = adpcmdec.c # flags used to compile this plugin # add other _CFLAGS and _LIBS as needed libgstadpcmdec_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) -libgstadpcmdec_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) -lgstaudio-@GST_MAJORMINOR@ \ +libgstadpcmdec_la_LIBADD = \ + $(GST_PLUGINS_BASE_LIBS) -lgstaudio-@GST_MAJORMINOR@ \ + $(GST_BASE_LIBS) -lgstbase-@GST_MAJORMINOR@ \ $(GST_LIBS) libgstadpcmdec_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstadpcmdec_la_LIBTOOLFLAGS = --tag=disable-static From 1cec86253862f863b25aa7bde993da9d231cc266 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Sun, 18 Mar 2012 23:15:23 +0000 Subject: [PATCH 127/138] adpcmdec: GST_BASE_LIBS already contains -lgstbase-0.10 --- gst/adpcmdec/Makefile.am | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/gst/adpcmdec/Makefile.am b/gst/adpcmdec/Makefile.am index f0d5d9ed62..98f84e72a7 100644 --- a/gst/adpcmdec/Makefile.am +++ b/gst/adpcmdec/Makefile.am @@ -8,8 +8,7 @@ libgstadpcmdec_la_SOURCES = adpcmdec.c libgstadpcmdec_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) libgstadpcmdec_la_LIBADD = \ $(GST_PLUGINS_BASE_LIBS) -lgstaudio-@GST_MAJORMINOR@ \ - $(GST_BASE_LIBS) -lgstbase-@GST_MAJORMINOR@ \ - $(GST_LIBS) + $(GST_BASE_LIBS) $(GST_LIBS) libgstadpcmdec_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstadpcmdec_la_LIBTOOLFLAGS = --tag=disable-static From ae471142eb838833b4f2db1c2abdfd45e7b3c579 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Raimo=20J=C3=A4rvi?= Date: Mon, 19 Mar 2012 23:49:17 +0200 Subject: [PATCH 128/138] winscreencap: Integrate into autotools build system https://bugzilla.gnome.org/show_bug.cgi?id=672031 --- sys/Makefile.am | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/sys/Makefile.am b/sys/Makefile.am index a48b0d25b2..3311cca9c6 100644 --- a/sys/Makefile.am +++ b/sys/Makefile.am @@ -120,7 +120,13 @@ else PVR_DIR= endif -SUBDIRS = $(ACM_DIR) $(APPLE_MEDIA_DIR) $(AVC_DIR) $(D3DVIDEOSINK_DIR) $(DECKLINK_DIR) $(DIRECTDRAW_DIR) $(DIRECTSOUND_DIR) $(DVB_DIR) $(FBDEV_DIR) $(LINSYS_DIR) $(OSX_VIDEO_DIR) $(QT_DIR) $(SHM_DIR) $(VCD_DIR) $(VDPAU_DIR) $(WININET_DIR) $(PVR_DIR) +if USE_DIRECT3D9 +WINSCREENCAP_DIR=winscreencap +else +WINSCREENCAP_DIR= +endif + +SUBDIRS = $(ACM_DIR) $(APPLE_MEDIA_DIR) $(AVC_DIR) $(D3DVIDEOSINK_DIR) $(DECKLINK_DIR) $(DIRECTDRAW_DIR) $(DIRECTSOUND_DIR) $(DVB_DIR) $(FBDEV_DIR) $(LINSYS_DIR) $(OSX_VIDEO_DIR) $(QT_DIR) $(SHM_DIR) $(VCD_DIR) $(VDPAU_DIR) $(WININET_DIR) $(PVR_DIR) $(WINSCREENCAP_DIR) DIST_SUBDIRS = acmenc acmmp3dec applemedia avc d3dvideosink decklink directdraw directsound dvb linsys fbdev dshowdecwrapper dshowsrcwrapper dshowvideosink \ osxvideo qtwrapper shm vcd vdpau wasapi wininet winks winscreencap pvr2d From a7c55d3106139e1744a8c9ba1dcfee18b2463ca2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Mon, 19 Mar 2012 22:58:02 +0000 Subject: [PATCH 129/138] sys: sort subdirs in Makefile alphabetically --- sys/Makefile.am | 90 ++++++++++++++++++++++++------------------------- 1 file changed, 44 insertions(+), 46 deletions(-) diff --git a/sys/Makefile.am b/sys/Makefile.am index 3311cca9c6..879f5f00c9 100644 --- a/sys/Makefile.am +++ b/sys/Makefile.am @@ -1,19 +1,19 @@ -# if USE_DXR3 -# DXR3_DIR=dxr3 -# else -# DXR3_DIR= -# endif - -# if USE_QCAM -# QCAM_DIR=qcam -# else -# QCAM_DIR= -# endif - -if USE_VCD -VCD_DIR=vcd +if USE_ACM +ACM_DIR=acmenc acmmp3dec else -VCD_DIR= +ACM_DIR= +endif + +if USE_APPLE_MEDIA +APPLE_MEDIA_DIR=applemedia +else +APPLE_MEDIA_DIR= +endif + +if USE_AVC +AVC_DIR=avc +else +AVC_DIR= endif # if USE_CDROM @@ -58,25 +58,42 @@ else DVB_DIR= endif +# if USE_DXR3 +# DXR3_DIR=dxr3 +# else +# DXR3_DIR= +# endif + if USE_LINSYS LINSYS_DIR=linsys else LINSYS_DIR= endif - -if USE_APPLE_MEDIA -APPLE_MEDIA_DIR=applemedia -else -APPLE_MEDIA_DIR= -endif - if USE_OSX_VIDEO OSX_VIDEO_DIR=osxvideo else OSX_VIDEO_DIR= endif +if USE_PVR +PVR_DIR=pvr2d +else +PVR_DIR= +endif + +if USE_SHM +SHM_DIR=shm +else +SHM_DIR= +endif + +# if USE_QCAM +# QCAM_DIR=qcam +# else +# QCAM_DIR= +# endif + if USE_QUICKTIME QT_DIR=qtwrapper else @@ -89,10 +106,10 @@ else WININET_DIR= endif -if USE_ACM -ACM_DIR=acmenc acmmp3dec +if USE_VCD +VCD_DIR=vcd else -ACM_DIR= +VCD_DIR= endif if USE_VDPAU @@ -101,34 +118,15 @@ else VDPAU_DIR= endif - -if USE_SHM -SHM_DIR=shm -else -SHM_DIR= -endif - -if USE_AVC -AVC_DIR=avc -else -AVC_DIR= -endif - -if USE_PVR -PVR_DIR=pvr2d -else -PVR_DIR= -endif - if USE_DIRECT3D9 WINSCREENCAP_DIR=winscreencap else WINSCREENCAP_DIR= endif -SUBDIRS = $(ACM_DIR) $(APPLE_MEDIA_DIR) $(AVC_DIR) $(D3DVIDEOSINK_DIR) $(DECKLINK_DIR) $(DIRECTDRAW_DIR) $(DIRECTSOUND_DIR) $(DVB_DIR) $(FBDEV_DIR) $(LINSYS_DIR) $(OSX_VIDEO_DIR) $(QT_DIR) $(SHM_DIR) $(VCD_DIR) $(VDPAU_DIR) $(WININET_DIR) $(PVR_DIR) $(WINSCREENCAP_DIR) +SUBDIRS = $(ACM_DIR) $(APPLE_MEDIA_DIR) $(AVC_DIR) $(D3DVIDEOSINK_DIR) $(DECKLINK_DIR) $(DIRECTDRAW_DIR) $(DIRECTSOUND_DIR) $(DVB_DIR) $(FBDEV_DIR) $(LINSYS_DIR) $(OSX_VIDEO_DIR) $(PVR_DIR) $(QT_DIR) $(SHM_DIR) $(VCD_DIR) $(VDPAU_DIR) $(WININET_DIR) $(WINSCREENCAP_DIR) DIST_SUBDIRS = acmenc acmmp3dec applemedia avc d3dvideosink decklink directdraw directsound dvb linsys fbdev dshowdecwrapper dshowsrcwrapper dshowvideosink \ - osxvideo qtwrapper shm vcd vdpau wasapi wininet winks winscreencap pvr2d + osxvideo pvr2d qtwrapper shm vcd vdpau wasapi wininet winks winscreencap include $(top_srcdir)/common/parallel-subdirs.mak From 477aaba6176b7f910defc1245760a5d816cfafe4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Raimo=20J=C3=A4rvi?= Date: Wed, 21 Mar 2012 00:17:47 +0200 Subject: [PATCH 130/138] winscreencap: Fix compiling with mingw https://bugzilla.gnome.org/show_bug.cgi?id=672505 --- sys/winscreencap/gstdx9screencapsrc.c | 31 ++++++++++++++------------- sys/winscreencap/gstgdiscreencapsrc.c | 19 ++++++++-------- 2 files changed, 26 insertions(+), 24 deletions(-) diff --git a/sys/winscreencap/gstdx9screencapsrc.c b/sys/winscreencap/gstdx9screencapsrc.c index 72a04cecd4..029053d0d9 100644 --- a/sys/winscreencap/gstdx9screencapsrc.c +++ b/sys/winscreencap/gstdx9screencapsrc.c @@ -296,14 +296,15 @@ gst_dx9screencapsrc_set_caps (GstBaseSrc * bsrc, GstCaps * caps) src->src_rect.bottom = src->src_rect.top + src->capture_h; } - if (framerate = gst_structure_get_value (structure, "framerate")) { + framerate = gst_structure_get_value (structure, "framerate"); + if (framerate) { src->rate_numerator = gst_value_get_fraction_numerator (framerate); src->rate_denominator = gst_value_get_fraction_denominator (framerate); } GST_DEBUG_OBJECT (src, "size %dx%d, %d/%d fps", - src->src_rect.right - src->src_rect.left, - src->src_rect.bottom - src->src_rect.top, + (gint) (src->src_rect.right - src->src_rect.left), + (gint) (src->src_rect.bottom - src->src_rect.top), src->rate_numerator, src->rate_denominator); return TRUE; @@ -390,26 +391,26 @@ gst_dx9screencapsrc_create_caps_from_format (D3DFORMAT fmt, depth = 15; endianness = G_BYTE_ORDER; alpha = GST_VIDEO_ALPHA_MASK_15_INT; - red = GST_VIDEO_RED_MASK_15_INT; - green = GST_VIDEO_GREEN_MASK_15_INT; - blue = GST_VIDEO_BLUE_MASK_15_INT; + red = GST_VIDEO_COMP1_MASK_15_INT; + green = GST_VIDEO_COMP2_MASK_15_INT; + blue = GST_VIDEO_COMP3_MASK_15_INT; break; case D3DFMT_X1R5G5B5: bpp = 16; depth = 15; endianness = G_BYTE_ORDER; alpha = 0; - red = GST_VIDEO_RED_MASK_15_INT; - green = GST_VIDEO_GREEN_MASK_15_INT; - blue = GST_VIDEO_BLUE_MASK_15_INT; + red = GST_VIDEO_COMP1_MASK_15_INT; + green = GST_VIDEO_COMP2_MASK_15_INT; + blue = GST_VIDEO_COMP3_MASK_15_INT; break; case D3DFMT_R5G6B5: bpp = depth = 16; endianness = G_BYTE_ORDER; alpha = 0; - red = GST_VIDEO_RED_MASK_16_INT; - green = GST_VIDEO_GREEN_MASK_16_INT; - blue = GST_VIDEO_BLUE_MASK_16_INT; + red = GST_VIDEO_COMP1_MASK_15_INT; + green = GST_VIDEO_COMP2_MASK_15_INT; + blue = GST_VIDEO_COMP3_MASK_15_INT; break; default: return NULL; @@ -478,7 +479,6 @@ static void gst_dx9screencapsrc_get_times (GstBaseSrc * basesrc, GstBuffer * buffer, GstClockTime * start, GstClockTime * end) { - GstDX9ScreenCapSrc *src = GST_DX9SCREENCAPSRC (basesrc); GstClockTime timestamp; timestamp = GST_BUFFER_TIMESTAMP (buffer); @@ -501,7 +501,8 @@ gst_dx9screencapsrc_create (GstPushSrc * push_src, GstBuffer ** buf) gint new_buf_size, i; gint width, height, stride; GstClock *clock; - GstClockTime time, buf_time; + GstClockTime time = GST_CLOCK_TIME_NONE; + GstClockTime buf_time; D3DLOCKED_RECT locked_rect; LPBYTE p_dst, p_src; HRESULT hres; @@ -536,7 +537,7 @@ gst_dx9screencapsrc_create (GstPushSrc * push_src, GstBuffer ** buf) } GST_LOG_OBJECT (src, - "creating buffer of %lu bytes with %dx%d image for frame %d", + "creating buffer of %d bytes with %dx%d image for frame %d", new_buf_size, width, height, (gint) src->frames); res = gst_pad_alloc_buffer_and_set_caps (GST_BASE_SRC_PAD (src), diff --git a/sys/winscreencap/gstgdiscreencapsrc.c b/sys/winscreencap/gstgdiscreencapsrc.c index a10a2fc00a..3e0cd6f44a 100644 --- a/sys/winscreencap/gstgdiscreencapsrc.c +++ b/sys/winscreencap/gstgdiscreencapsrc.c @@ -315,7 +315,8 @@ gst_gdiscreencapsrc_set_caps (GstBaseSrc * bsrc, GstCaps * caps) src->src_rect.bottom = src->src_rect.top + src->capture_h; } - if (framerate = gst_structure_get_value (structure, "framerate")) { + framerate = gst_structure_get_value (structure, "framerate"); + if (framerate) { src->rate_numerator = gst_value_get_fraction_numerator (framerate); src->rate_denominator = gst_value_get_fraction_denominator (framerate); } @@ -349,8 +350,8 @@ gst_gdiscreencapsrc_set_caps (GstBaseSrc * bsrc, GstCaps * caps) ReleaseDC (capture, device); GST_DEBUG_OBJECT (src, "size %dx%d, %d/%d fps", - src->info.bmiHeader.biWidth, - -src->info.bmiHeader.biHeight, + (gint) src->info.bmiHeader.biWidth, + (gint) (-src->info.bmiHeader.biHeight), src->rate_numerator, src->rate_denominator); return TRUE; @@ -378,7 +379,8 @@ gst_gdiscreencapsrc_get_caps (GstBaseSrc * bsrc) } GST_DEBUG ("width = %d, height=%d", - rect_dst.right - rect_dst.left, rect_dst.bottom - rect_dst.top); + (gint) (rect_dst.right - rect_dst.left), + (gint) (rect_dst.bottom - rect_dst.top)); return gst_caps_new_simple ("video/x-raw-rgb", "bpp", G_TYPE_INT, 24, @@ -416,7 +418,6 @@ static void gst_gdiscreencapsrc_get_times (GstBaseSrc * basesrc, GstBuffer * buffer, GstClockTime * start, GstClockTime * end) { - GstGDIScreenCapSrc *src = GST_GDISCREENCAPSRC (basesrc); GstClockTime timestamp; timestamp = GST_BUFFER_TIMESTAMP (buffer); @@ -438,7 +439,7 @@ gst_gdiscreencapsrc_create (GstPushSrc * push_src, GstBuffer ** buf) GstFlowReturn res; gint new_buf_size; GstClock *clock; - GstClockTime time; + GstClockTime time = GST_CLOCK_TIME_NONE; GstClockTime base_time; if (G_UNLIKELY (!src->info.bmiHeader.biWidth || @@ -455,9 +456,9 @@ gst_gdiscreencapsrc_create (GstPushSrc * push_src, GstBuffer ** buf) (-src->info.bmiHeader.biHeight); GST_LOG_OBJECT (src, - "creating buffer of %lu bytes with %dx%d image for frame %d", - new_buf_size, src->info.bmiHeader.biWidth, - -src->info.bmiHeader.biHeight, (gint) src->frames); + "creating buffer of %d bytes with %dx%d image for frame %d", + new_buf_size, (gint) src->info.bmiHeader.biWidth, + (gint) (-src->info.bmiHeader.biHeight), (gint) src->frames); res = gst_pad_alloc_buffer_and_set_caps (GST_BASE_SRC_PAD (src), From 79a74089d42508743b14abd8adeff6b9024d44e8 Mon Sep 17 00:00:00 2001 From: "Oleksij Rempel (Alexey Fisher)" Date: Tue, 20 Mar 2012 17:32:00 -0300 Subject: [PATCH 131/138] wrappercamerabinsrc: avoid reseting caps to the same value Reduces capture latency when the new caps are the same as the old one, avoiding resetting the source state for a forced renegotiation. --- gst/camerabin2/gstwrappercamerabinsrc.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/gst/camerabin2/gstwrappercamerabinsrc.c b/gst/camerabin2/gstwrappercamerabinsrc.c index 03f775f92e..5185789b5a 100644 --- a/gst/camerabin2/gstwrappercamerabinsrc.c +++ b/gst/camerabin2/gstwrappercamerabinsrc.c @@ -153,6 +153,18 @@ gst_wrapper_camera_bin_reset_video_src_caps (GstWrapperCameraBinSrc * self, GST_DEBUG_OBJECT (self, "Resetting src caps to %" GST_PTR_FORMAT, caps); if (self->src_vid_src) { + GstCaps *old_caps; + + g_object_get (G_OBJECT (self->src_filter), "caps", &old_caps, NULL); + if (gst_caps_is_equal (caps, old_caps)) { + GST_DEBUG_OBJECT (self, "old and new caps are same, do not reset it"); + if (old_caps) + gst_caps_unref (old_caps); + return; + } + if (old_caps) + gst_caps_unref (old_caps); + clock = gst_element_get_clock (self->src_vid_src); base_time = gst_element_get_base_time (self->src_vid_src); From 74471813eb616d4fa0edaab5c7d71ab303f6ef8c Mon Sep 17 00:00:00 2001 From: Thiago Santos Date: Tue, 20 Mar 2012 19:19:25 -0300 Subject: [PATCH 132/138] geometrictransform: add some more log messages --- gst/geometrictransform/gstgeometrictransform.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/gst/geometrictransform/gstgeometrictransform.c b/gst/geometrictransform/gstgeometrictransform.c index 274d483f21..be651a4778 100644 --- a/gst/geometrictransform/gstgeometrictransform.c +++ b/gst/geometrictransform/gstgeometrictransform.c @@ -113,6 +113,8 @@ gst_geometric_transform_generate_map (GstGeometricTransform * gt) GstGeometricTransformClass *klass; gdouble *ptr; + GST_INFO_OBJECT (gt, "Generating new transform map"); + /* cleanup old map */ g_free (gt->map); gt->map = NULL; @@ -144,6 +146,7 @@ gst_geometric_transform_generate_map (GstGeometricTransform * gt) end: if (!ret) { + GST_WARNING_OBJECT (gt, "Generating transform map failed"); g_free (gt->map); gt->map = NULL; } else @@ -348,6 +351,7 @@ gst_geometric_transform_stop (GstBaseTransform * trans) { GstGeometricTransform *gt = GST_GEOMETRIC_TRANSFORM_CAST (trans); + GST_INFO_OBJECT (gt, "Deleting transform map"); g_free (gt->map); gt->map = NULL; From 7dd5b2002abf516ebdf92696c57a9a7692c166e9 Mon Sep 17 00:00:00 2001 From: Thiago Santos Date: Tue, 20 Mar 2012 20:07:11 -0300 Subject: [PATCH 133/138] geometrictransform: Prevent access to the transform map when it is null Check if the map doesn't exist when receiving a new caps and create a new one. This prevents that the transform functions try to access the map when it doesn't exist. --- gst/geometrictransform/gstgeometrictransform.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/gst/geometrictransform/gstgeometrictransform.c b/gst/geometrictransform/gstgeometrictransform.c index be651a4778..a1ec3ab94e 100644 --- a/gst/geometrictransform/gstgeometrictransform.c +++ b/gst/geometrictransform/gstgeometrictransform.c @@ -178,8 +178,8 @@ gst_geometric_transform_set_caps (GstBaseTransform * btrans, GstCaps * incaps, /* regenerate the map */ GST_OBJECT_LOCK (gt); - if (old_width == 0 || old_height == 0 || gt->width != old_width || - gt->height != old_height) { + if (gt->map == NULL || old_width == 0 || old_height == 0 + || gt->width != old_width || gt->height != old_height) { if (klass->prepare_func) if (!klass->prepare_func (gt)) { GST_OBJECT_UNLOCK (gt); @@ -352,6 +352,10 @@ gst_geometric_transform_stop (GstBaseTransform * trans) GstGeometricTransform *gt = GST_GEOMETRIC_TRANSFORM_CAST (trans); GST_INFO_OBJECT (gt, "Deleting transform map"); + + gt->width = 0; + gt->height = 0; + g_free (gt->map); gt->map = NULL; From d2e1cb6ece0320970f979942ac02d2da04cac9e7 Mon Sep 17 00:00:00 2001 From: David Schleef Date: Wed, 21 Mar 2012 23:04:31 -0700 Subject: [PATCH 134/138] decklink: Add decklink dispatch code for OS/X --- configure.ac | 12 + sys/decklink/Makefile.am | 29 +- sys/decklink/osx/DeckLinkAPI.h | 695 +++++++++++++++++++ sys/decklink/osx/DeckLinkAPIConfiguration.h | 167 +++++ sys/decklink/osx/DeckLinkAPIDeckControl.h | 206 ++++++ sys/decklink/osx/DeckLinkAPIDiscovery.h | 62 ++ sys/decklink/osx/DeckLinkAPIDispatch-osx.cpp | 178 +++++ sys/decklink/osx/DeckLinkAPIModes.h | 155 +++++ sys/decklink/osx/DeckLinkAPIStreaming.h | 366 ++++++++++ sys/decklink/osx/DeckLinkAPITypes.h | 89 +++ sys/decklink/osx/DeckLinkAPIVersion.h | 37 + 11 files changed, 1993 insertions(+), 3 deletions(-) create mode 100644 sys/decklink/osx/DeckLinkAPI.h create mode 100644 sys/decklink/osx/DeckLinkAPIConfiguration.h create mode 100644 sys/decklink/osx/DeckLinkAPIDeckControl.h create mode 100644 sys/decklink/osx/DeckLinkAPIDiscovery.h create mode 100644 sys/decklink/osx/DeckLinkAPIDispatch-osx.cpp create mode 100644 sys/decklink/osx/DeckLinkAPIModes.h create mode 100644 sys/decklink/osx/DeckLinkAPIStreaming.h create mode 100644 sys/decklink/osx/DeckLinkAPITypes.h create mode 100644 sys/decklink/osx/DeckLinkAPIVersion.h diff --git a/configure.ac b/configure.ac index ec821e224c..a2a265bf5a 100644 --- a/configure.ac +++ b/configure.ac @@ -826,11 +826,23 @@ AG_GST_CHECK_FEATURE(DECKLINK, [decklink], decklink, [ ]) fi ;; + *-*darwin*) + if test "x$HAVE_PTHREAD_H" = "xyes"; then + AC_CHECK_LIB(dl, dlopen, + [ + HAVE_DECKLINK=yes + DECKLINK_CXXFLAGS= + DECKLINK_LIBS="-lpthread -ldl" + HAVE_DECKLINK_OSX=yes + ]) + fi + ;; *) HAVE_DECKLINK=no ;; esac + AM_CONDITIONAL(DECKLINK_OSX, test "x$HAVE_DECKLINK_OSX" = xyes) AC_SUBST(DECKLINK_CXXFLAGS) AC_SUBST(DECKLINK_LIBS) ]) diff --git a/sys/decklink/Makefile.am b/sys/decklink/Makefile.am index 23895d79fd..9d12601703 100644 --- a/sys/decklink/Makefile.am +++ b/sys/decklink/Makefile.am @@ -14,15 +14,29 @@ libgstdecklink_la_LIBADD = \ -lgstinterfaces-@GST_MAJORMINOR@ \ $(DECKLINK_LIBS) \ $(LIBM) -libgstdecklink_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstdecklink_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) + +if DECKLINK_OSX +libgstdecklink_la_LDFLAGS += \ + -Wl,-framework,CoreFoundation +endif + libgstdecklink_la_LIBTOOLFLAGS = --tag=disable-static libgstdecklink_la_SOURCES = \ gstdecklinksrc.cpp \ gstdecklinksink.cpp \ gstdecklink.cpp \ - capture.cpp \ + capture.cpp + +if DECKLINK_OSX +libgstdecklink_la_SOURCES += \ + osx/DeckLinkAPIDispatch-osx.cpp +else +libgstdecklink_la_SOURCES += \ linux/DeckLinkAPIDispatch.cpp +endif + noinst_HEADERS = \ gstdecklink.h \ @@ -30,10 +44,19 @@ noinst_HEADERS = \ gstdecklinksink.h \ capture.h \ linux/DeckLinkAPI.h \ - linux/LinuxCOM.h + linux/LinuxCOM.h \ + osx/DeckLinkAPI.h \ + osx/DeckLinkAPIConfiguration.h \ + osx/DeckLinkAPIDeckControl.h \ + osx/DeckLinkAPIDiscovery.h \ + osx/DeckLinkAPIModes.h \ + osx/DeckLinkAPIStreaming.h \ + osx/DeckLinkAPITypes.h \ + osx/DeckLinkAPIVersion.h EXTRA_DIST = \ win/DeckLinkAPI.h \ win/DeckLinkAPIDispatch.cpp \ win/DeckLinkAPI_i.c + diff --git a/sys/decklink/osx/DeckLinkAPI.h b/sys/decklink/osx/DeckLinkAPI.h new file mode 100644 index 0000000000..b629369a7b --- /dev/null +++ b/sys/decklink/osx/DeckLinkAPI.h @@ -0,0 +1,695 @@ +/* -LICENSE-START- +** Copyright (c) 2011 Blackmagic Design +** +** Permission is hereby granted, free of charge, to any person or organization +** obtaining a copy of the software and accompanying documentation covered by +** this license (the "Software") to use, reproduce, display, distribute, +** execute, and transmit the Software, and to prepare derivative works of the +** Software, and to permit third-parties to whom the Software is furnished to +** do so, all subject to the following: +** +** The copyright notices in the Software and this entire statement, including +** the above license grant, this restriction and the following disclaimer, +** must be included in all copies of the Software, in whole or in part, and +** all derivative works of the Software, unless such copies or derivative +** works are solely in the form of machine-executable object code generated by +** a source language processor. +** +** 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, TITLE AND NON-INFRINGEMENT. IN NO EVENT +** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +** DEALINGS IN THE SOFTWARE. +** -LICENSE-END- +*/ + +#ifndef BMD_DECKLINKAPI_H +#define BMD_DECKLINKAPI_H + +/* DeckLink API */ + +#include +#include +#include + +#include "DeckLinkAPITypes.h" +#include "DeckLinkAPIModes.h" +#include "DeckLinkAPIDiscovery.h" +#include "DeckLinkAPIConfiguration.h" +#include "DeckLinkAPIDeckControl.h" + +#include "DeckLinkAPIStreaming.h" + +#define BLACKMAGIC_DECKLINK_API_MAGIC 1 + +// Type Declarations + + +// Interface ID Declarations + +#define IID_IDeckLinkVideoOutputCallback /* 20AA5225-1958-47CB-820B-80A8D521A6EE */ (REFIID){0x20,0xAA,0x52,0x25,0x19,0x58,0x47,0xCB,0x82,0x0B,0x80,0xA8,0xD5,0x21,0xA6,0xEE} +#define IID_IDeckLinkInputCallback /* DD04E5EC-7415-42AB-AE4A-E80C4DFC044A */ (REFIID){0xDD,0x04,0xE5,0xEC,0x74,0x15,0x42,0xAB,0xAE,0x4A,0xE8,0x0C,0x4D,0xFC,0x04,0x4A} +#define IID_IDeckLinkMemoryAllocator /* B36EB6E7-9D29-4AA8-92EF-843B87A289E8 */ (REFIID){0xB3,0x6E,0xB6,0xE7,0x9D,0x29,0x4A,0xA8,0x92,0xEF,0x84,0x3B,0x87,0xA2,0x89,0xE8} +#define IID_IDeckLinkAudioOutputCallback /* 403C681B-7F46-4A12-B993-2BB127084EE6 */ (REFIID){0x40,0x3C,0x68,0x1B,0x7F,0x46,0x4A,0x12,0xB9,0x93,0x2B,0xB1,0x27,0x08,0x4E,0xE6} +#define IID_IDeckLinkIterator /* 50FB36CD-3063-4B73-BDBB-958087F2D8BA */ (REFIID){0x50,0xFB,0x36,0xCD,0x30,0x63,0x4B,0x73,0xBD,0xBB,0x95,0x80,0x87,0xF2,0xD8,0xBA} +#define IID_IDeckLinkAPIInformation /* 7BEA3C68-730D-4322-AF34-8A7152B532A4 */ (REFIID){0x7B,0xEA,0x3C,0x68,0x73,0x0D,0x43,0x22,0xAF,0x34,0x8A,0x71,0x52,0xB5,0x32,0xA4} +#define IID_IDeckLinkOutput /* A3EF0963-0862-44ED-92A9-EE89ABF431C7 */ (REFIID){0xA3,0xEF,0x09,0x63,0x08,0x62,0x44,0xED,0x92,0xA9,0xEE,0x89,0xAB,0xF4,0x31,0xC7} +#define IID_IDeckLinkInput /* 6D40EF78-28B9-4E21-990D-95BB7750A04F */ (REFIID){0x6D,0x40,0xEF,0x78,0x28,0xB9,0x4E,0x21,0x99,0x0D,0x95,0xBB,0x77,0x50,0xA0,0x4F} +#define IID_IDeckLinkVideoFrame /* 3F716FE0-F023-4111-BE5D-EF4414C05B17 */ (REFIID){0x3F,0x71,0x6F,0xE0,0xF0,0x23,0x41,0x11,0xBE,0x5D,0xEF,0x44,0x14,0xC0,0x5B,0x17} +#define IID_IDeckLinkMutableVideoFrame /* 69E2639F-40DA-4E19-B6F2-20ACE815C390 */ (REFIID){0x69,0xE2,0x63,0x9F,0x40,0xDA,0x4E,0x19,0xB6,0xF2,0x20,0xAC,0xE8,0x15,0xC3,0x90} +#define IID_IDeckLinkVideoFrame3DExtensions /* DA0F7E4A-EDC7-48A8-9CDD-2DB51C729CD7 */ (REFIID){0xDA,0x0F,0x7E,0x4A,0xED,0xC7,0x48,0xA8,0x9C,0xDD,0x2D,0xB5,0x1C,0x72,0x9C,0xD7} +#define IID_IDeckLinkVideoInputFrame /* 05CFE374-537C-4094-9A57-680525118F44 */ (REFIID){0x05,0xCF,0xE3,0x74,0x53,0x7C,0x40,0x94,0x9A,0x57,0x68,0x05,0x25,0x11,0x8F,0x44} +#define IID_IDeckLinkVideoFrameAncillary /* 732E723C-D1A4-4E29-9E8E-4A88797A0004 */ (REFIID){0x73,0x2E,0x72,0x3C,0xD1,0xA4,0x4E,0x29,0x9E,0x8E,0x4A,0x88,0x79,0x7A,0x00,0x04} +#define IID_IDeckLinkAudioInputPacket /* E43D5870-2894-11DE-8C30-0800200C9A66 */ (REFIID){0xE4,0x3D,0x58,0x70,0x28,0x94,0x11,0xDE,0x8C,0x30,0x08,0x00,0x20,0x0C,0x9A,0x66} +#define IID_IDeckLinkScreenPreviewCallback /* B1D3F49A-85FE-4C5D-95C8-0B5D5DCCD438 */ (REFIID){0xB1,0xD3,0xF4,0x9A,0x85,0xFE,0x4C,0x5D,0x95,0xC8,0x0B,0x5D,0x5D,0xCC,0xD4,0x38} +#define IID_IDeckLinkCocoaScreenPreviewCallback /* D174152F-8F96-4C07-83A5-DD5F5AF0A2AA */ (REFIID){0xD1,0x74,0x15,0x2F,0x8F,0x96,0x4C,0x07,0x83,0xA5,0xDD,0x5F,0x5A,0xF0,0xA2,0xAA} +#define IID_IDeckLinkGLScreenPreviewHelper /* 504E2209-CAC7-4C1A-9FB4-C5BB6274D22F */ (REFIID){0x50,0x4E,0x22,0x09,0xCA,0xC7,0x4C,0x1A,0x9F,0xB4,0xC5,0xBB,0x62,0x74,0xD2,0x2F} +#define IID_IDeckLinkAttributes /* ABC11843-D966-44CB-96E2-A1CB5D3135C4 */ (REFIID){0xAB,0xC1,0x18,0x43,0xD9,0x66,0x44,0xCB,0x96,0xE2,0xA1,0xCB,0x5D,0x31,0x35,0xC4} +#define IID_IDeckLinkKeyer /* 89AFCAF5-65F8-421E-98F7-96FE5F5BFBA3 */ (REFIID){0x89,0xAF,0xCA,0xF5,0x65,0xF8,0x42,0x1E,0x98,0xF7,0x96,0xFE,0x5F,0x5B,0xFB,0xA3} +#define IID_IDeckLinkVideoConversion /* 3BBCB8A2-DA2C-42D9-B5D8-88083644E99A */ (REFIID){0x3B,0xBC,0xB8,0xA2,0xDA,0x2C,0x42,0xD9,0xB5,0xD8,0x88,0x08,0x36,0x44,0xE9,0x9A} + +/* Enum BMDVideoOutputFlags - Flags to control the output of ancillary data along with video. */ + +typedef uint32_t BMDVideoOutputFlags; +enum _BMDVideoOutputFlags { + bmdVideoOutputFlagDefault = 0, + bmdVideoOutputVANC = 1 << 0, + bmdVideoOutputVITC = 1 << 1, + bmdVideoOutputRP188 = 1 << 2, + bmdVideoOutputDualStream3D = 1 << 4 +}; + +/* Enum BMDFrameFlags - Frame flags */ + +typedef uint32_t BMDFrameFlags; +enum _BMDFrameFlags { + bmdFrameFlagDefault = 0, + bmdFrameFlagFlipVertical = 1 << 0, + + /* Flags that are applicable only to instances of IDeckLinkVideoInputFrame */ + + bmdFrameHasNoInputSource = 1 << 31 +}; + +/* Enum BMDVideoInputFlags - Flags applicable to video input */ + +typedef uint32_t BMDVideoInputFlags; +enum _BMDVideoInputFlags { + bmdVideoInputFlagDefault = 0, + bmdVideoInputEnableFormatDetection = 1 << 0, + bmdVideoInputDualStream3D = 1 << 1 +}; + +/* Enum BMDVideoInputFormatChangedEvents - Bitmask passed to the VideoInputFormatChanged notification to identify the properties of the input signal that have changed */ + +typedef uint32_t BMDVideoInputFormatChangedEvents; +enum _BMDVideoInputFormatChangedEvents { + bmdVideoInputDisplayModeChanged = 1 << 0, + bmdVideoInputFieldDominanceChanged = 1 << 1, + bmdVideoInputColorspaceChanged = 1 << 2 +}; + +/* Enum BMDDetectedVideoInputFormatFlags - Flags passed to the VideoInputFormatChanged notification to describe the detected video input signal */ + +typedef uint32_t BMDDetectedVideoInputFormatFlags; +enum _BMDDetectedVideoInputFormatFlags { + bmdDetectedVideoInputYCbCr422 = 1 << 0, + bmdDetectedVideoInputRGB444 = 1 << 1 +}; + +/* Enum BMDOutputFrameCompletionResult - Frame Completion Callback */ + +typedef uint32_t BMDOutputFrameCompletionResult; +enum _BMDOutputFrameCompletionResult { + bmdOutputFrameCompleted, + bmdOutputFrameDisplayedLate, + bmdOutputFrameDropped, + bmdOutputFrameFlushed +}; + +/* Enum BMDReferenceStatus - GenLock input status */ + +typedef uint32_t BMDReferenceStatus; +enum _BMDReferenceStatus { + bmdReferenceNotSupportedByHardware = 1 << 0, + bmdReferenceLocked = 1 << 1 +}; + +/* Enum BMDAudioSampleRate - Audio sample rates supported for output/input */ + +typedef uint32_t BMDAudioSampleRate; +enum _BMDAudioSampleRate { + bmdAudioSampleRate48kHz = 48000 +}; + +/* Enum BMDAudioSampleType - Audio sample sizes supported for output/input */ + +typedef uint32_t BMDAudioSampleType; +enum _BMDAudioSampleType { + bmdAudioSampleType16bitInteger = 16, + bmdAudioSampleType32bitInteger = 32 +}; + +/* Enum BMDAudioOutputStreamType - Audio output stream type */ + +typedef uint32_t BMDAudioOutputStreamType; +enum _BMDAudioOutputStreamType { + bmdAudioOutputStreamContinuous, + bmdAudioOutputStreamContinuousDontResample, + bmdAudioOutputStreamTimestamped +}; + +/* Enum BMDDisplayModeSupport - Output mode supported flags */ + +typedef uint32_t BMDDisplayModeSupport; +enum _BMDDisplayModeSupport { + bmdDisplayModeNotSupported = 0, + bmdDisplayModeSupported, + bmdDisplayModeSupportedWithConversion +}; + +/* Enum BMDTimecodeFormat - Timecode formats for frame metadata */ + +typedef uint32_t BMDTimecodeFormat; +enum _BMDTimecodeFormat { + bmdTimecodeRP188VITC1 = 'rpv1', // RP188 timecode where DBB1 equals VITC1 (line 9) + bmdTimecodeRP188VITC2 = 'rp12', // RP188 timecode where DBB1 equals VITC2 (line 571) + bmdTimecodeRP188LTC = 'rplt', // RP188 timecode where DBB1 equals LTC (line 10) + bmdTimecodeRP188Any = 'rp18', // For capture: return the first valid timecode in {VITC1, LTC ,VITC2} - For playback: set the timecode as VITC1 + bmdTimecodeVITC = 'vitc', + bmdTimecodeVITCField2 = 'vit2', + bmdTimecodeSerial = 'seri' +}; + +/* Enum BMDAnalogVideoFlags - Analog video display flags */ + +typedef uint32_t BMDAnalogVideoFlags; +enum _BMDAnalogVideoFlags { + bmdAnalogVideoFlagCompositeSetup75 = 1 << 0, + bmdAnalogVideoFlagComponentBetacamLevels = 1 << 1 +}; + +/* Enum BMDAudioConnection - Audio connection types */ + +typedef uint32_t BMDAudioConnection; +enum _BMDAudioConnection { + bmdAudioConnectionEmbedded = 'embd', + bmdAudioConnectionAESEBU = 'aes ', + bmdAudioConnectionAnalog = 'anlg' +}; + +/* Enum BMDAudioOutputAnalogAESSwitch - Audio output Analog/AESEBU switch */ + +typedef uint32_t BMDAudioOutputAnalogAESSwitch; +enum _BMDAudioOutputAnalogAESSwitch { + bmdAudioOutputSwitchAESEBU = 'aes ', + bmdAudioOutputSwitchAnalog = 'anlg' +}; + +/* Enum BMDVideoOutputConversionMode - Video/audio conversion mode */ + +typedef uint32_t BMDVideoOutputConversionMode; +enum _BMDVideoOutputConversionMode { + bmdNoVideoOutputConversion = 'none', + bmdVideoOutputLetterboxDownconversion = 'ltbx', + bmdVideoOutputAnamorphicDownconversion = 'amph', + bmdVideoOutputHD720toHD1080Conversion = '720c', + bmdVideoOutputHardwareLetterboxDownconversion = 'HWlb', + bmdVideoOutputHardwareAnamorphicDownconversion = 'HWam', + bmdVideoOutputHardwareCenterCutDownconversion = 'HWcc', + bmdVideoOutputHardware720p1080pCrossconversion = 'xcap', + bmdVideoOutputHardwareAnamorphic720pUpconversion = 'ua7p', + bmdVideoOutputHardwareAnamorphic1080iUpconversion = 'ua1i', + bmdVideoOutputHardwareAnamorphic149To720pUpconversion = 'u47p', + bmdVideoOutputHardwareAnamorphic149To1080iUpconversion = 'u41i', + bmdVideoOutputHardwarePillarbox720pUpconversion = 'up7p', + bmdVideoOutputHardwarePillarbox1080iUpconversion = 'up1i' +}; + +/* Enum BMDVideoInputConversionMode - Video input conversion mode */ + +typedef uint32_t BMDVideoInputConversionMode; +enum _BMDVideoInputConversionMode { + bmdNoVideoInputConversion = 'none', + bmdVideoInputLetterboxDownconversionFromHD1080 = '10lb', + bmdVideoInputAnamorphicDownconversionFromHD1080 = '10am', + bmdVideoInputLetterboxDownconversionFromHD720 = '72lb', + bmdVideoInputAnamorphicDownconversionFromHD720 = '72am', + bmdVideoInputLetterboxUpconversion = 'lbup', + bmdVideoInputAnamorphicUpconversion = 'amup' +}; + +/* Enum BMDVideo3DPackingFormat - Video 3D packing format */ + +typedef uint32_t BMDVideo3DPackingFormat; +enum _BMDVideo3DPackingFormat { + bmdVideo3DPackingSidebySideHalf = 'sbsh', + bmdVideo3DPackingLinebyLine = 'lbyl', + bmdVideo3DPackingTopAndBottom = 'tabo', + bmdVideo3DPackingFramePacking = 'frpk', + bmdVideo3DPackingLeftOnly = 'left', + bmdVideo3DPackingRightOnly = 'righ' +}; + +/* Enum BMDIdleVideoOutputOperation - Video output operation when not playing video */ + +typedef uint32_t BMDIdleVideoOutputOperation; +enum _BMDIdleVideoOutputOperation { + bmdIdleVideoOutputBlack = 'blac', + bmdIdleVideoOutputLastFrame = 'lafa', + bmdIdleVideoOutputDesktop = 'desk' +}; + +/* Enum BMDDeckLinkAttributeID - DeckLink Attribute ID */ + +typedef uint32_t BMDDeckLinkAttributeID; +enum _BMDDeckLinkAttributeID { + + /* Flags */ + + BMDDeckLinkSupportsInternalKeying = 'keyi', + BMDDeckLinkSupportsExternalKeying = 'keye', + BMDDeckLinkSupportsHDKeying = 'keyh', + BMDDeckLinkSupportsInputFormatDetection = 'infd', + BMDDeckLinkHasReferenceInput = 'hrin', + BMDDeckLinkHasSerialPort = 'hspt', + BMDDeckLinkHasAnalogVideoOutputGain = 'avog', + BMDDeckLinkCanOnlyAdjustOverallVideoOutputGain = 'ovog', + BMDDeckLinkHasVideoInputAntiAliasingFilter = 'aafl', + BMDDeckLinkHasBypass = 'byps', + BMDDeckLinkSupportsDesktopDisplay = 'extd', + + /* Integers */ + + BMDDeckLinkMaximumAudioChannels = 'mach', + BMDDeckLinkNumberOfSubDevices = 'nsbd', + BMDDeckLinkSubDeviceIndex = 'subi', + BMDDeckLinkVideoOutputConnections = 'vocn', + BMDDeckLinkVideoInputConnections = 'vicn', + BMDDeckLinkDeviceBusyState = 'dbst', + + /* Floats */ + + BMDDeckLinkVideoInputGainMinimum = 'vigm', + BMDDeckLinkVideoInputGainMaximum = 'vigx', + BMDDeckLinkVideoOutputGainMinimum = 'vogm', + BMDDeckLinkVideoOutputGainMaximum = 'vogx', + + /* Strings */ + + BMDDeckLinkSerialPortDeviceName = 'slpn' +}; + +/* Enum BMDDeckLinkAPIInformationID - DeckLinkAPI information ID */ + +typedef uint32_t BMDDeckLinkAPIInformationID; +enum _BMDDeckLinkAPIInformationID { + BMDDeckLinkAPIVersion = 'vers' +}; + +/* Enum BMDDeviceBusyState - Current device busy state */ + +typedef uint32_t BMDDeviceBusyState; +enum _BMDDeviceBusyState { + bmdDeviceCaptureBusy = 1 << 0, + bmdDevicePlaybackBusy = 1 << 1, + bmdDeviceSerialPortBusy = 1 << 2 +}; + +/* Enum BMD3DPreviewFormat - Linked Frame preview format */ + +typedef uint32_t BMD3DPreviewFormat; +enum _BMD3DPreviewFormat { + bmd3DPreviewFormatDefault = 'defa', + bmd3DPreviewFormatLeftOnly = 'left', + bmd3DPreviewFormatRightOnly = 'righ', + bmd3DPreviewFormatSideBySide = 'side', + bmd3DPreviewFormatTopBottom = 'topb' +}; + +#if defined(__cplusplus) + +// Forward Declarations + +class IDeckLinkVideoOutputCallback; +class IDeckLinkInputCallback; +class IDeckLinkMemoryAllocator; +class IDeckLinkAudioOutputCallback; +class IDeckLinkIterator; +class IDeckLinkAPIInformation; +class IDeckLinkOutput; +class IDeckLinkInput; +class IDeckLinkVideoFrame; +class IDeckLinkMutableVideoFrame; +class IDeckLinkVideoFrame3DExtensions; +class IDeckLinkVideoInputFrame; +class IDeckLinkVideoFrameAncillary; +class IDeckLinkAudioInputPacket; +class IDeckLinkScreenPreviewCallback; +class IDeckLinkCocoaScreenPreviewCallback; +class IDeckLinkGLScreenPreviewHelper; +class IDeckLinkAttributes; +class IDeckLinkKeyer; +class IDeckLinkVideoConversion; + +/* Interface IDeckLinkVideoOutputCallback - Frame completion callback. */ + +class IDeckLinkVideoOutputCallback : public IUnknown +{ +public: + virtual HRESULT ScheduledFrameCompleted (/* in */ IDeckLinkVideoFrame *completedFrame, /* in */ BMDOutputFrameCompletionResult result) = 0; + virtual HRESULT ScheduledPlaybackHasStopped (void) = 0; + +protected: + virtual ~IDeckLinkVideoOutputCallback () {}; // call Release method to drop reference count +}; + +/* Interface IDeckLinkInputCallback - Frame arrival callback. */ + +class IDeckLinkInputCallback : public IUnknown +{ +public: + virtual HRESULT VideoInputFormatChanged (/* in */ BMDVideoInputFormatChangedEvents notificationEvents, /* in */ IDeckLinkDisplayMode *newDisplayMode, /* in */ BMDDetectedVideoInputFormatFlags detectedSignalFlags) = 0; + virtual HRESULT VideoInputFrameArrived (/* in */ IDeckLinkVideoInputFrame* videoFrame, /* in */ IDeckLinkAudioInputPacket* audioPacket) = 0; + +protected: + virtual ~IDeckLinkInputCallback () {}; // call Release method to drop reference count +}; + +/* Interface IDeckLinkMemoryAllocator - Memory allocator for video frames. */ + +class IDeckLinkMemoryAllocator : public IUnknown +{ +public: + virtual HRESULT AllocateBuffer (/* in */ uint32_t bufferSize, /* out */ void **allocatedBuffer) = 0; + virtual HRESULT ReleaseBuffer (/* in */ void *buffer) = 0; + + virtual HRESULT Commit (void) = 0; + virtual HRESULT Decommit (void) = 0; +}; + +/* Interface IDeckLinkAudioOutputCallback - Optional callback to allow audio samples to be pulled as required. */ + +class IDeckLinkAudioOutputCallback : public IUnknown +{ +public: + virtual HRESULT RenderAudioSamples (/* in */ bool preroll) = 0; +}; + +/* Interface IDeckLinkIterator - enumerates installed DeckLink hardware */ + +class IDeckLinkIterator : public IUnknown +{ +public: + virtual HRESULT Next (/* out */ IDeckLink **deckLinkInstance) = 0; +}; + +/* Interface IDeckLinkAPIInformation - DeckLinkAPI attribute interface */ + +class IDeckLinkAPIInformation : public IUnknown +{ +public: + virtual HRESULT GetFlag (/* in */ BMDDeckLinkAPIInformationID cfgID, /* out */ bool *value) = 0; + virtual HRESULT GetInt (/* in */ BMDDeckLinkAPIInformationID cfgID, /* out */ int64_t *value) = 0; + virtual HRESULT GetFloat (/* in */ BMDDeckLinkAPIInformationID cfgID, /* out */ double *value) = 0; + virtual HRESULT GetString (/* in */ BMDDeckLinkAPIInformationID cfgID, /* out */ CFStringRef *value) = 0; + +protected: + virtual ~IDeckLinkAPIInformation () {}; // call Release method to drop reference count +}; + +/* Interface IDeckLinkOutput - Created by QueryInterface from IDeckLink. */ + +class IDeckLinkOutput : public IUnknown +{ +public: + virtual HRESULT DoesSupportVideoMode (/* in */ BMDDisplayMode displayMode, /* in */ BMDPixelFormat pixelFormat, /* in */ BMDVideoOutputFlags flags, /* out */ BMDDisplayModeSupport *result, /* out */ IDeckLinkDisplayMode **resultDisplayMode) = 0; + virtual HRESULT GetDisplayModeIterator (/* out */ IDeckLinkDisplayModeIterator **iterator) = 0; + + virtual HRESULT SetScreenPreviewCallback (/* in */ IDeckLinkScreenPreviewCallback *previewCallback) = 0; + + /* Video Output */ + + virtual HRESULT EnableVideoOutput (/* in */ BMDDisplayMode displayMode, /* in */ BMDVideoOutputFlags flags) = 0; + virtual HRESULT DisableVideoOutput (void) = 0; + + virtual HRESULT SetVideoOutputFrameMemoryAllocator (/* in */ IDeckLinkMemoryAllocator *theAllocator) = 0; + virtual HRESULT CreateVideoFrame (/* in */ int32_t width, /* in */ int32_t height, /* in */ int32_t rowBytes, /* in */ BMDPixelFormat pixelFormat, /* in */ BMDFrameFlags flags, /* out */ IDeckLinkMutableVideoFrame **outFrame) = 0; + virtual HRESULT CreateAncillaryData (/* in */ BMDPixelFormat pixelFormat, /* out */ IDeckLinkVideoFrameAncillary **outBuffer) = 0; + + virtual HRESULT DisplayVideoFrameSync (/* in */ IDeckLinkVideoFrame *theFrame) = 0; + virtual HRESULT ScheduleVideoFrame (/* in */ IDeckLinkVideoFrame *theFrame, /* in */ BMDTimeValue displayTime, /* in */ BMDTimeValue displayDuration, /* in */ BMDTimeScale timeScale) = 0; + virtual HRESULT SetScheduledFrameCompletionCallback (/* in */ IDeckLinkVideoOutputCallback *theCallback) = 0; + virtual HRESULT GetBufferedVideoFrameCount (/* out */ uint32_t *bufferedFrameCount) = 0; + + /* Audio Output */ + + virtual HRESULT EnableAudioOutput (/* in */ BMDAudioSampleRate sampleRate, /* in */ BMDAudioSampleType sampleType, /* in */ uint32_t channelCount, /* in */ BMDAudioOutputStreamType streamType) = 0; + virtual HRESULT DisableAudioOutput (void) = 0; + + virtual HRESULT WriteAudioSamplesSync (/* in */ void *buffer, /* in */ uint32_t sampleFrameCount, /* out */ uint32_t *sampleFramesWritten) = 0; + + virtual HRESULT BeginAudioPreroll (void) = 0; + virtual HRESULT EndAudioPreroll (void) = 0; + virtual HRESULT ScheduleAudioSamples (/* in */ void *buffer, /* in */ uint32_t sampleFrameCount, /* in */ BMDTimeValue streamTime, /* in */ BMDTimeScale timeScale, /* out */ uint32_t *sampleFramesWritten) = 0; + + virtual HRESULT GetBufferedAudioSampleFrameCount (/* out */ uint32_t *bufferedSampleFrameCount) = 0; + virtual HRESULT FlushBufferedAudioSamples (void) = 0; + + virtual HRESULT SetAudioCallback (/* in */ IDeckLinkAudioOutputCallback *theCallback) = 0; + + /* Output Control */ + + virtual HRESULT StartScheduledPlayback (/* in */ BMDTimeValue playbackStartTime, /* in */ BMDTimeScale timeScale, /* in */ double playbackSpeed) = 0; + virtual HRESULT StopScheduledPlayback (/* in */ BMDTimeValue stopPlaybackAtTime, /* out */ BMDTimeValue *actualStopTime, /* in */ BMDTimeScale timeScale) = 0; + virtual HRESULT IsScheduledPlaybackRunning (/* out */ bool *active) = 0; + virtual HRESULT GetScheduledStreamTime (/* in */ BMDTimeScale desiredTimeScale, /* out */ BMDTimeValue *streamTime, /* out */ double *playbackSpeed) = 0; + virtual HRESULT GetReferenceStatus (/* out */ BMDReferenceStatus *referenceStatus) = 0; + + /* Hardware Timing */ + + virtual HRESULT GetHardwareReferenceClock (/* in */ BMDTimeScale desiredTimeScale, /* out */ BMDTimeValue *hardwareTime, /* out */ BMDTimeValue *timeInFrame, /* out */ BMDTimeValue *ticksPerFrame) = 0; + +protected: + virtual ~IDeckLinkOutput () {}; // call Release method to drop reference count +}; + +/* Interface IDeckLinkInput - Created by QueryInterface from IDeckLink. */ + +class IDeckLinkInput : public IUnknown +{ +public: + virtual HRESULT DoesSupportVideoMode (/* in */ BMDDisplayMode displayMode, /* in */ BMDPixelFormat pixelFormat, /* in */ BMDVideoInputFlags flags, /* out */ BMDDisplayModeSupport *result, /* out */ IDeckLinkDisplayMode **resultDisplayMode) = 0; + virtual HRESULT GetDisplayModeIterator (/* out */ IDeckLinkDisplayModeIterator **iterator) = 0; + + virtual HRESULT SetScreenPreviewCallback (/* in */ IDeckLinkScreenPreviewCallback *previewCallback) = 0; + + /* Video Input */ + + virtual HRESULT EnableVideoInput (/* in */ BMDDisplayMode displayMode, /* in */ BMDPixelFormat pixelFormat, /* in */ BMDVideoInputFlags flags) = 0; + virtual HRESULT DisableVideoInput (void) = 0; + virtual HRESULT GetAvailableVideoFrameCount (/* out */ uint32_t *availableFrameCount) = 0; + + /* Audio Input */ + + virtual HRESULT EnableAudioInput (/* in */ BMDAudioSampleRate sampleRate, /* in */ BMDAudioSampleType sampleType, /* in */ uint32_t channelCount) = 0; + virtual HRESULT DisableAudioInput (void) = 0; + virtual HRESULT GetAvailableAudioSampleFrameCount (/* out */ uint32_t *availableSampleFrameCount) = 0; + + /* Input Control */ + + virtual HRESULT StartStreams (void) = 0; + virtual HRESULT StopStreams (void) = 0; + virtual HRESULT PauseStreams (void) = 0; + virtual HRESULT FlushStreams (void) = 0; + virtual HRESULT SetCallback (/* in */ IDeckLinkInputCallback *theCallback) = 0; + + /* Hardware Timing */ + + virtual HRESULT GetHardwareReferenceClock (/* in */ BMDTimeScale desiredTimeScale, /* out */ BMDTimeValue *hardwareTime, /* out */ BMDTimeValue *timeInFrame, /* out */ BMDTimeValue *ticksPerFrame) = 0; + +protected: + virtual ~IDeckLinkInput () {}; // call Release method to drop reference count +}; + +/* Interface IDeckLinkVideoFrame - Interface to encapsulate a video frame; can be caller-implemented. */ + +class IDeckLinkVideoFrame : public IUnknown +{ +public: + virtual long GetWidth (void) = 0; + virtual long GetHeight (void) = 0; + virtual long GetRowBytes (void) = 0; + virtual BMDPixelFormat GetPixelFormat (void) = 0; + virtual BMDFrameFlags GetFlags (void) = 0; + virtual HRESULT GetBytes (/* out */ void **buffer) = 0; + + virtual HRESULT GetTimecode (/* in */ BMDTimecodeFormat format, /* out */ IDeckLinkTimecode **timecode) = 0; + virtual HRESULT GetAncillaryData (/* out */ IDeckLinkVideoFrameAncillary **ancillary) = 0; + +protected: + virtual ~IDeckLinkVideoFrame () {}; // call Release method to drop reference count +}; + +/* Interface IDeckLinkMutableVideoFrame - Created by IDeckLinkOutput::CreateVideoFrame. */ + +class IDeckLinkMutableVideoFrame : public IDeckLinkVideoFrame +{ +public: + virtual HRESULT SetFlags (/* in */ BMDFrameFlags newFlags) = 0; + + virtual HRESULT SetTimecode (/* in */ BMDTimecodeFormat format, /* in */ IDeckLinkTimecode *timecode) = 0; + virtual HRESULT SetTimecodeFromComponents (/* in */ BMDTimecodeFormat format, /* in */ uint8_t hours, /* in */ uint8_t minutes, /* in */ uint8_t seconds, /* in */ uint8_t frames, /* in */ BMDTimecodeFlags flags) = 0; + virtual HRESULT SetAncillaryData (/* in */ IDeckLinkVideoFrameAncillary *ancillary) = 0; + virtual HRESULT SetTimecodeUserBits (/* in */ BMDTimecodeFormat format, /* in */ BMDTimecodeUserBits userBits) = 0; + +protected: + virtual ~IDeckLinkMutableVideoFrame () {}; // call Release method to drop reference count +}; + +/* Interface IDeckLinkVideoFrame3DExtensions - Optional interface implemented on IDeckLinkVideoFrame to support 3D frames */ + +class IDeckLinkVideoFrame3DExtensions : public IUnknown +{ +public: + virtual BMDVideo3DPackingFormat Get3DPackingFormat (void) = 0; + virtual HRESULT GetFrameForRightEye (/* out */ IDeckLinkVideoFrame* *rightEyeFrame) = 0; + +protected: + virtual ~IDeckLinkVideoFrame3DExtensions () {}; // call Release method to drop reference count +}; + +/* Interface IDeckLinkVideoInputFrame - Provided by the IDeckLinkVideoInput frame arrival callback. */ + +class IDeckLinkVideoInputFrame : public IDeckLinkVideoFrame +{ +public: + virtual HRESULT GetStreamTime (/* out */ BMDTimeValue *frameTime, /* out */ BMDTimeValue *frameDuration, /* in */ BMDTimeScale timeScale) = 0; + virtual HRESULT GetHardwareReferenceTimestamp (/* in */ BMDTimeScale timeScale, /* out */ BMDTimeValue *frameTime, /* out */ BMDTimeValue *frameDuration) = 0; + +protected: + virtual ~IDeckLinkVideoInputFrame () {}; // call Release method to drop reference count +}; + +/* Interface IDeckLinkVideoFrameAncillary - Obtained through QueryInterface() on an IDeckLinkVideoFrame object. */ + +class IDeckLinkVideoFrameAncillary : public IUnknown +{ +public: + + virtual HRESULT GetBufferForVerticalBlankingLine (/* in */ uint32_t lineNumber, /* out */ void **buffer) = 0; + virtual BMDPixelFormat GetPixelFormat (void) = 0; + virtual BMDDisplayMode GetDisplayMode (void) = 0; + +protected: + virtual ~IDeckLinkVideoFrameAncillary () {}; // call Release method to drop reference count +}; + +/* Interface IDeckLinkAudioInputPacket - Provided by the IDeckLinkInput callback. */ + +class IDeckLinkAudioInputPacket : public IUnknown +{ +public: + virtual long GetSampleFrameCount (void) = 0; + virtual HRESULT GetBytes (/* out */ void **buffer) = 0; + virtual HRESULT GetPacketTime (/* out */ BMDTimeValue *packetTime, /* in */ BMDTimeScale timeScale) = 0; + +protected: + virtual ~IDeckLinkAudioInputPacket () {}; // call Release method to drop reference count +}; + +/* Interface IDeckLinkScreenPreviewCallback - Screen preview callback */ + +class IDeckLinkScreenPreviewCallback : public IUnknown +{ +public: + virtual HRESULT DrawFrame (/* in */ IDeckLinkVideoFrame *theFrame) = 0; + +protected: + virtual ~IDeckLinkScreenPreviewCallback () {}; // call Release method to drop reference count +}; + +/* Interface IDeckLinkCocoaScreenPreviewCallback - Screen preview callback for Cocoa-based applications */ + +class IDeckLinkCocoaScreenPreviewCallback : public IDeckLinkScreenPreviewCallback +{ +public: + +protected: + virtual ~IDeckLinkCocoaScreenPreviewCallback () {}; // call Release method to drop reference count +}; + +/* Interface IDeckLinkGLScreenPreviewHelper - Created with CoCreateInstance(). */ + +class IDeckLinkGLScreenPreviewHelper : public IUnknown +{ +public: + + /* Methods must be called with OpenGL context set */ + + virtual HRESULT InitializeGL (void) = 0; + virtual HRESULT PaintGL (void) = 0; + virtual HRESULT SetFrame (/* in */ IDeckLinkVideoFrame *theFrame) = 0; + virtual HRESULT Set3DPreviewFormat (/* in */ BMD3DPreviewFormat previewFormat) = 0; + +protected: + virtual ~IDeckLinkGLScreenPreviewHelper () {}; // call Release method to drop reference count +}; + +/* Interface IDeckLinkAttributes - DeckLink Attribute interface */ + +class IDeckLinkAttributes : public IUnknown +{ +public: + virtual HRESULT GetFlag (/* in */ BMDDeckLinkAttributeID cfgID, /* out */ bool *value) = 0; + virtual HRESULT GetInt (/* in */ BMDDeckLinkAttributeID cfgID, /* out */ int64_t *value) = 0; + virtual HRESULT GetFloat (/* in */ BMDDeckLinkAttributeID cfgID, /* out */ double *value) = 0; + virtual HRESULT GetString (/* in */ BMDDeckLinkAttributeID cfgID, /* out */ CFStringRef *value) = 0; + +protected: + virtual ~IDeckLinkAttributes () {}; // call Release method to drop reference count +}; + +/* Interface IDeckLinkKeyer - DeckLink Keyer interface */ + +class IDeckLinkKeyer : public IUnknown +{ +public: + virtual HRESULT Enable (/* in */ bool isExternal) = 0; + virtual HRESULT SetLevel (/* in */ uint8_t level) = 0; + virtual HRESULT RampUp (/* in */ uint32_t numberOfFrames) = 0; + virtual HRESULT RampDown (/* in */ uint32_t numberOfFrames) = 0; + virtual HRESULT Disable (void) = 0; + +protected: + virtual ~IDeckLinkKeyer () {}; // call Release method to drop reference count +}; + +/* Interface IDeckLinkVideoConversion - Created with CoCreateInstance(). */ + +class IDeckLinkVideoConversion : public IUnknown +{ +public: + virtual HRESULT ConvertFrame (/* in */ IDeckLinkVideoFrame* srcFrame, /* in */ IDeckLinkVideoFrame* dstFrame) = 0; + +protected: + virtual ~IDeckLinkVideoConversion () {}; // call Release method to drop reference count +}; + +/* Functions */ + +extern "C" { + + IDeckLinkIterator* CreateDeckLinkIteratorInstance (void); + IDeckLinkAPIInformation* CreateDeckLinkAPIInformationInstance (void); + IDeckLinkGLScreenPreviewHelper* CreateOpenGLScreenPreviewHelper (void); + IDeckLinkCocoaScreenPreviewCallback* CreateCocoaScreenPreview (void* /* (NSView*) */ parentView); + IDeckLinkVideoConversion* CreateVideoConversionInstance (void); + +}; + + +#endif // defined(__cplusplus) +#endif /* defined(BMD_DECKLINKAPI_H) */ diff --git a/sys/decklink/osx/DeckLinkAPIConfiguration.h b/sys/decklink/osx/DeckLinkAPIConfiguration.h new file mode 100644 index 0000000000..f026e73344 --- /dev/null +++ b/sys/decklink/osx/DeckLinkAPIConfiguration.h @@ -0,0 +1,167 @@ +/* -LICENSE-START- +** Copyright (c) 2011 Blackmagic Design +** +** Permission is hereby granted, free of charge, to any person or organization +** obtaining a copy of the software and accompanying documentation covered by +** this license (the "Software") to use, reproduce, display, distribute, +** execute, and transmit the Software, and to prepare derivative works of the +** Software, and to permit third-parties to whom the Software is furnished to +** do so, all subject to the following: +** +** The copyright notices in the Software and this entire statement, including +** the above license grant, this restriction and the following disclaimer, +** must be included in all copies of the Software, in whole or in part, and +** all derivative works of the Software, unless such copies or derivative +** works are solely in the form of machine-executable object code generated by +** a source language processor. +** +** 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, TITLE AND NON-INFRINGEMENT. IN NO EVENT +** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +** DEALINGS IN THE SOFTWARE. +** -LICENSE-END- +*/ + +#ifndef BMD_DECKLINKAPICONFIGURATION_H +#define BMD_DECKLINKAPICONFIGURATION_H + +// Type Declarations + + +// Interface ID Declarations + +#define IID_IDeckLinkConfiguration /* C679A35B-610C-4D09-B748-1D0478100FC0 */ (REFIID){0xC6,0x79,0xA3,0x5B,0x61,0x0C,0x4D,0x09,0xB7,0x48,0x1D,0x04,0x78,0x10,0x0F,0xC0} + +/* Enum BMDDeckLinkConfigurationID - DeckLink Configuration ID */ + +typedef uint32_t BMDDeckLinkConfigurationID; +enum _BMDDeckLinkConfigurationID { + + /* Serial port Flags */ + + bmdDeckLinkConfigSwapSerialRxTx = 'ssrt', + + /* Video Input/Output Flags */ + + bmdDeckLinkConfigUse1080pNotPsF = 'fpro', + + /* Video Input/Output Integers */ + + bmdDeckLinkConfigHDMI3DPackingFormat = '3dpf', + bmdDeckLinkConfigBypass = 'byps', + + /* Audio Input/Output Flags */ + + bmdDeckLinkConfigAnalogAudioConsumerLevels = 'aacl', + + /* Video output flags */ + + bmdDeckLinkConfigFieldFlickerRemoval = 'fdfr', + bmdDeckLinkConfigHD1080p24ToHD1080i5994Conversion = 'to59', + bmdDeckLinkConfig444SDIVideoOutput = '444o', + bmdDeckLinkConfig3GBpsVideoOutput = '3gbs', + bmdDeckLinkConfigBlackVideoOutputDuringCapture = 'bvoc', + bmdDeckLinkConfigLowLatencyVideoOutput = 'llvo', + + /* Video Output Integers */ + + bmdDeckLinkConfigVideoOutputConnection = 'vocn', + bmdDeckLinkConfigVideoOutputConversionMode = 'vocm', + bmdDeckLinkConfigAnalogVideoOutputFlags = 'avof', + bmdDeckLinkConfigReferenceInputTimingOffset = 'glot', + bmdDeckLinkConfigVideoOutputIdleOperation = 'voio', + + /* Video Output Floats */ + + bmdDeckLinkConfigVideoOutputComponentLumaGain = 'oclg', + bmdDeckLinkConfigVideoOutputComponentChromaBlueGain = 'occb', + bmdDeckLinkConfigVideoOutputComponentChromaRedGain = 'occr', + bmdDeckLinkConfigVideoOutputCompositeLumaGain = 'oilg', + bmdDeckLinkConfigVideoOutputCompositeChromaGain = 'oicg', + bmdDeckLinkConfigVideoOutputSVideoLumaGain = 'oslg', + bmdDeckLinkConfigVideoOutputSVideoChromaGain = 'oscg', + + /* Video Input Flags */ + + bmdDeckLinkConfigVideoInputScanning = 'visc', // Applicable to H264 Pro Recorder only + + /* Video Input Integers */ + + bmdDeckLinkConfigVideoInputConnection = 'vicn', + bmdDeckLinkConfigAnalogVideoInputFlags = 'avif', + bmdDeckLinkConfigVideoInputConversionMode = 'vicm', + bmdDeckLinkConfig32PulldownSequenceInitialTimecodeFrame = 'pdif', + bmdDeckLinkConfigVANCSourceLine1Mapping = 'vsl1', + bmdDeckLinkConfigVANCSourceLine2Mapping = 'vsl2', + bmdDeckLinkConfigVANCSourceLine3Mapping = 'vsl3', + + /* Video Input Floats */ + + bmdDeckLinkConfigVideoInputComponentLumaGain = 'iclg', + bmdDeckLinkConfigVideoInputComponentChromaBlueGain = 'iccb', + bmdDeckLinkConfigVideoInputComponentChromaRedGain = 'iccr', + bmdDeckLinkConfigVideoInputCompositeLumaGain = 'iilg', + bmdDeckLinkConfigVideoInputCompositeChromaGain = 'iicg', + bmdDeckLinkConfigVideoInputSVideoLumaGain = 'islg', + bmdDeckLinkConfigVideoInputSVideoChromaGain = 'iscg', + + /* Audio Input Integers */ + + bmdDeckLinkConfigAudioInputConnection = 'aicn', + + /* Audio Input Floats */ + + bmdDeckLinkConfigAnalogAudioInputScaleChannel1 = 'ais1', + bmdDeckLinkConfigAnalogAudioInputScaleChannel2 = 'ais2', + bmdDeckLinkConfigAnalogAudioInputScaleChannel3 = 'ais3', + bmdDeckLinkConfigAnalogAudioInputScaleChannel4 = 'ais4', + bmdDeckLinkConfigDigitalAudioInputScale = 'dais', + + /* Audio Output Integers */ + + bmdDeckLinkConfigAudioOutputAESAnalogSwitch = 'aoaa', + + /* Audio Output Floats */ + + bmdDeckLinkConfigAnalogAudioOutputScaleChannel1 = 'aos1', + bmdDeckLinkConfigAnalogAudioOutputScaleChannel2 = 'aos2', + bmdDeckLinkConfigAnalogAudioOutputScaleChannel3 = 'aos3', + bmdDeckLinkConfigAnalogAudioOutputScaleChannel4 = 'aos4', + bmdDeckLinkConfigDigitalAudioOutputScale = 'daos' +}; + +// Forward Declarations + +class IDeckLinkConfiguration; + +/* Interface IDeckLinkConfiguration - DeckLink Configuration interface */ + +class IDeckLinkConfiguration : public IUnknown +{ +public: + virtual HRESULT SetFlag (/* in */ BMDDeckLinkConfigurationID cfgID, /* in */ bool value) = 0; + virtual HRESULT GetFlag (/* in */ BMDDeckLinkConfigurationID cfgID, /* out */ bool *value) = 0; + virtual HRESULT SetInt (/* in */ BMDDeckLinkConfigurationID cfgID, /* in */ int64_t value) = 0; + virtual HRESULT GetInt (/* in */ BMDDeckLinkConfigurationID cfgID, /* out */ int64_t *value) = 0; + virtual HRESULT SetFloat (/* in */ BMDDeckLinkConfigurationID cfgID, /* in */ double value) = 0; + virtual HRESULT GetFloat (/* in */ BMDDeckLinkConfigurationID cfgID, /* out */ double *value) = 0; + virtual HRESULT SetString (/* in */ BMDDeckLinkConfigurationID cfgID, /* in */ CFStringRef value) = 0; + virtual HRESULT GetString (/* in */ BMDDeckLinkConfigurationID cfgID, /* out */ CFStringRef *value) = 0; + virtual HRESULT WriteConfigurationToPreferences (void) = 0; + +protected: + virtual ~IDeckLinkConfiguration () {}; // call Release method to drop reference count +}; + +/* Functions */ + +extern "C" { + + +}; + + +#endif /* defined(BMD_DECKLINKAPICONFIGURATION_H) */ diff --git a/sys/decklink/osx/DeckLinkAPIDeckControl.h b/sys/decklink/osx/DeckLinkAPIDeckControl.h new file mode 100644 index 0000000000..ea32657d81 --- /dev/null +++ b/sys/decklink/osx/DeckLinkAPIDeckControl.h @@ -0,0 +1,206 @@ +/* -LICENSE-START- +** Copyright (c) 2011 Blackmagic Design +** +** Permission is hereby granted, free of charge, to any person or organization +** obtaining a copy of the software and accompanying documentation covered by +** this license (the "Software") to use, reproduce, display, distribute, +** execute, and transmit the Software, and to prepare derivative works of the +** Software, and to permit third-parties to whom the Software is furnished to +** do so, all subject to the following: +** +** The copyright notices in the Software and this entire statement, including +** the above license grant, this restriction and the following disclaimer, +** must be included in all copies of the Software, in whole or in part, and +** all derivative works of the Software, unless such copies or derivative +** works are solely in the form of machine-executable object code generated by +** a source language processor. +** +** 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, TITLE AND NON-INFRINGEMENT. IN NO EVENT +** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +** DEALINGS IN THE SOFTWARE. +** -LICENSE-END- +*/ + +#ifndef BMD_DECKLINKAPIDECKCONTROL_H +#define BMD_DECKLINKAPIDECKCONTROL_H + +// Type Declarations + + +// Interface ID Declarations + +#define IID_IDeckLinkDeckControlStatusCallback /* 53436FFB-B434-4906-BADC-AE3060FFE8EF */ (REFIID){0x53,0x43,0x6F,0xFB,0xB4,0x34,0x49,0x06,0xBA,0xDC,0xAE,0x30,0x60,0xFF,0xE8,0xEF} +#define IID_IDeckLinkDeckControl /* 8E1C3ACE-19C7-4E00-8B92-D80431D958BE */ (REFIID){0x8E,0x1C,0x3A,0xCE,0x19,0xC7,0x4E,0x00,0x8B,0x92,0xD8,0x04,0x31,0xD9,0x58,0xBE} + +/* Enum BMDDeckControlMode - DeckControl mode */ + +typedef uint32_t BMDDeckControlMode; +enum _BMDDeckControlMode { + bmdDeckControlNotOpened = 'ntop', + bmdDeckControlVTRControlMode = 'vtrc', + bmdDeckControlExportMode = 'expm', + bmdDeckControlCaptureMode = 'capm' +}; + +/* Enum BMDDeckControlEvent - DeckControl event */ + +typedef uint32_t BMDDeckControlEvent; +enum _BMDDeckControlEvent { + bmdDeckControlAbortedEvent = 'abte', // This event is triggered when a capture or edit-to-tape operation is aborted. + + /* Export-To-Tape events */ + + bmdDeckControlPrepareForExportEvent = 'pfee', // This event is triggered a few frames before reaching the in-point. IDeckLinkInput::StartScheduledPlayback() should be called at this point. + bmdDeckControlExportCompleteEvent = 'exce', // This event is triggered a few frames after reaching the out-point. At this point, it is safe to stop playback. + + /* Capture events */ + + bmdDeckControlPrepareForCaptureEvent = 'pfce', // This event is triggered a few frames before reaching the in-point. The serial timecode attached to IDeckLinkVideoInputFrames is now valid. + bmdDeckControlCaptureCompleteEvent = 'ccev' // This event is triggered a few frames after reaching the out-point. +}; + +/* Enum BMDDeckControlVTRControlState - VTR Control state */ + +typedef uint32_t BMDDeckControlVTRControlState; +enum _BMDDeckControlVTRControlState { + bmdDeckControlNotInVTRControlMode = 'nvcm', + bmdDeckControlVTRControlPlaying = 'vtrp', + bmdDeckControlVTRControlRecording = 'vtrr', + bmdDeckControlVTRControlStill = 'vtra', + bmdDeckControlVTRControlShuttleForward = 'vtsf', + bmdDeckControlVTRControlShuttleReverse = 'vtsr', + bmdDeckControlVTRControlJogForward = 'vtjf', + bmdDeckControlVTRControlJogReverse = 'vtjr', + bmdDeckControlVTRControlStopped = 'vtro' +}; + +/* Enum BMDDeckControlStatusFlags - Deck Control status flags */ + +typedef uint32_t BMDDeckControlStatusFlags; +enum _BMDDeckControlStatusFlags { + bmdDeckControlStatusDeckConnected = 1 << 0, + bmdDeckControlStatusRemoteMode = 1 << 1, + bmdDeckControlStatusRecordInhibited = 1 << 2, + bmdDeckControlStatusCassetteOut = 1 << 3 +}; + +/* Enum BMDDeckControlExportModeOpsFlags - Export mode flags */ + +typedef uint32_t BMDDeckControlExportModeOpsFlags; +enum _BMDDeckControlExportModeOpsFlags { + bmdDeckControlExportModeInsertVideo = 1 << 0, + bmdDeckControlExportModeInsertAudio1 = 1 << 1, + bmdDeckControlExportModeInsertAudio2 = 1 << 2, + bmdDeckControlExportModeInsertAudio3 = 1 << 3, + bmdDeckControlExportModeInsertAudio4 = 1 << 4, + bmdDeckControlExportModeInsertAudio5 = 1 << 5, + bmdDeckControlExportModeInsertAudio6 = 1 << 6, + bmdDeckControlExportModeInsertAudio7 = 1 << 7, + bmdDeckControlExportModeInsertAudio8 = 1 << 8, + bmdDeckControlExportModeInsertAudio9 = 1 << 9, + bmdDeckControlExportModeInsertAudio10 = 1 << 10, + bmdDeckControlExportModeInsertAudio11 = 1 << 11, + bmdDeckControlExportModeInsertAudio12 = 1 << 12, + bmdDeckControlExportModeInsertTimeCode = 1 << 13, + bmdDeckControlExportModeInsertAssemble = 1 << 14, + bmdDeckControlExportModeInsertPreview = 1 << 15, + bmdDeckControlUseManualExport = 1 << 16 +}; + +/* Enum BMDDeckControlError - Deck Control error */ + +typedef uint32_t BMDDeckControlError; +enum _BMDDeckControlError { + bmdDeckControlNoError = 'noer', + bmdDeckControlModeError = 'moer', + bmdDeckControlMissedInPointError = 'mier', + bmdDeckControlDeckTimeoutError = 'dter', + bmdDeckControlCommandFailedError = 'cfer', + bmdDeckControlDeviceAlreadyOpenedError = 'dalo', + bmdDeckControlFailedToOpenDeviceError = 'fder', + bmdDeckControlInLocalModeError = 'lmer', + bmdDeckControlEndOfTapeError = 'eter', + bmdDeckControlUserAbortError = 'uaer', + bmdDeckControlNoTapeInDeckError = 'nter', + bmdDeckControlNoVideoFromCardError = 'nvfc', + bmdDeckControlNoCommunicationError = 'ncom', + bmdDeckControlBufferTooSmallError = 'btsm', + bmdDeckControlBadChecksumError = 'chks', + bmdDeckControlUnknownError = 'uner' +}; + +// Forward Declarations + +class IDeckLinkDeckControlStatusCallback; +class IDeckLinkDeckControl; + +/* Interface IDeckLinkDeckControlStatusCallback - Deck control state change callback. */ + +class IDeckLinkDeckControlStatusCallback : public IUnknown +{ +public: + virtual HRESULT TimecodeUpdate (/* in */ BMDTimecodeBCD currentTimecode) = 0; + virtual HRESULT VTRControlStateChanged (/* in */ BMDDeckControlVTRControlState newState, /* in */ BMDDeckControlError error) = 0; + virtual HRESULT DeckControlEventReceived (/* in */ BMDDeckControlEvent event, /* in */ BMDDeckControlError error) = 0; + virtual HRESULT DeckControlStatusChanged (/* in */ BMDDeckControlStatusFlags flags, /* in */ uint32_t mask) = 0; + +protected: + virtual ~IDeckLinkDeckControlStatusCallback () {}; // call Release method to drop reference count +}; + +/* Interface IDeckLinkDeckControl - Deck Control main interface */ + +class IDeckLinkDeckControl : public IUnknown +{ +public: + virtual HRESULT Open (/* in */ BMDTimeScale timeScale, /* in */ BMDTimeValue timeValue, /* in */ bool timecodeIsDropFrame, /* out */ BMDDeckControlError *error) = 0; + virtual HRESULT Close (/* in */ bool standbyOn) = 0; + virtual HRESULT GetCurrentState (/* out */ BMDDeckControlMode *mode, /* out */ BMDDeckControlVTRControlState *vtrControlState, /* out */ BMDDeckControlStatusFlags *flags) = 0; + virtual HRESULT SetStandby (/* in */ bool standbyOn) = 0; + virtual HRESULT SendCommand (/* in */ uint8_t *inBuffer, /* in */ uint32_t inBufferSize, /* out */ uint8_t *outBuffer, /* out */ uint32_t *outDataSize, /* in */ uint32_t outBufferSize, /* out */ BMDDeckControlError *error) = 0; + virtual HRESULT Play (/* out */ BMDDeckControlError *error) = 0; + virtual HRESULT Stop (/* out */ BMDDeckControlError *error) = 0; + virtual HRESULT TogglePlayStop (/* out */ BMDDeckControlError *error) = 0; + virtual HRESULT Eject (/* out */ BMDDeckControlError *error) = 0; + virtual HRESULT GoToTimecode (/* in */ BMDTimecodeBCD timecode, /* out */ BMDDeckControlError *error) = 0; + virtual HRESULT FastForward (/* in */ bool viewTape, /* out */ BMDDeckControlError *error) = 0; + virtual HRESULT Rewind (/* in */ bool viewTape, /* out */ BMDDeckControlError *error) = 0; + virtual HRESULT StepForward (/* out */ BMDDeckControlError *error) = 0; + virtual HRESULT StepBack (/* out */ BMDDeckControlError *error) = 0; + virtual HRESULT Jog (/* in */ double rate, /* out */ BMDDeckControlError *error) = 0; + virtual HRESULT Shuttle (/* in */ double rate, /* out */ BMDDeckControlError *error) = 0; + virtual HRESULT GetTimecodeString (/* out */ CFStringRef *currentTimeCode, /* out */ BMDDeckControlError *error) = 0; + virtual HRESULT GetTimecode (/* out */ IDeckLinkTimecode **currentTimecode, /* out */ BMDDeckControlError *error) = 0; + virtual HRESULT GetTimecodeBCD (/* out */ BMDTimecodeBCD *currentTimecode, /* out */ BMDDeckControlError *error) = 0; + virtual HRESULT SetPreroll (/* in */ uint32_t prerollSeconds) = 0; + virtual HRESULT GetPreroll (/* out */ uint32_t *prerollSeconds) = 0; + virtual HRESULT SetExportOffset (/* in */ int32_t exportOffsetFields) = 0; + virtual HRESULT GetExportOffset (/* out */ int32_t *exportOffsetFields) = 0; + virtual HRESULT GetManualExportOffset (/* out */ int32_t *deckManualExportOffsetFields) = 0; + virtual HRESULT SetCaptureOffset (/* in */ int32_t captureOffsetFields) = 0; + virtual HRESULT GetCaptureOffset (/* out */ int32_t *captureOffsetFields) = 0; + virtual HRESULT StartExport (/* in */ BMDTimecodeBCD inTimecode, /* in */ BMDTimecodeBCD outTimecode, /* in */ BMDDeckControlExportModeOpsFlags exportModeOps, /* out */ BMDDeckControlError *error) = 0; + virtual HRESULT StartCapture (/* in */ bool useVITC, /* in */ BMDTimecodeBCD inTimecode, /* in */ BMDTimecodeBCD outTimecode, /* out */ BMDDeckControlError *error) = 0; + virtual HRESULT GetDeviceID (/* out */ uint16_t *deviceId, /* out */ BMDDeckControlError *error) = 0; + virtual HRESULT Abort (void) = 0; + virtual HRESULT CrashRecordStart (/* out */ BMDDeckControlError *error) = 0; + virtual HRESULT CrashRecordStop (/* out */ BMDDeckControlError *error) = 0; + virtual HRESULT SetCallback (/* in */ IDeckLinkDeckControlStatusCallback *callback) = 0; + +protected: + virtual ~IDeckLinkDeckControl () {}; // call Release method to drop reference count +}; + +/* Functions */ + +extern "C" { + + +}; + + +#endif /* defined(BMD_DECKLINKAPIDECKCONTROL_H) */ diff --git a/sys/decklink/osx/DeckLinkAPIDiscovery.h b/sys/decklink/osx/DeckLinkAPIDiscovery.h new file mode 100644 index 0000000000..99fc0feb97 --- /dev/null +++ b/sys/decklink/osx/DeckLinkAPIDiscovery.h @@ -0,0 +1,62 @@ +/* -LICENSE-START- +** Copyright (c) 2011 Blackmagic Design +** +** Permission is hereby granted, free of charge, to any person or organization +** obtaining a copy of the software and accompanying documentation covered by +** this license (the "Software") to use, reproduce, display, distribute, +** execute, and transmit the Software, and to prepare derivative works of the +** Software, and to permit third-parties to whom the Software is furnished to +** do so, all subject to the following: +** +** The copyright notices in the Software and this entire statement, including +** the above license grant, this restriction and the following disclaimer, +** must be included in all copies of the Software, in whole or in part, and +** all derivative works of the Software, unless such copies or derivative +** works are solely in the form of machine-executable object code generated by +** a source language processor. +** +** 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, TITLE AND NON-INFRINGEMENT. IN NO EVENT +** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +** DEALINGS IN THE SOFTWARE. +** -LICENSE-END- +*/ + +#ifndef BMD_DECKLINKAPIDISCOVERY_H +#define BMD_DECKLINKAPIDISCOVERY_H + +// Type Declarations + + +// Interface ID Declarations + +#define IID_IDeckLink /* C418FBDD-0587-48ED-8FE5-640F0A14AF91 */ (REFIID){0xC4,0x18,0xFB,0xDD,0x05,0x87,0x48,0xED,0x8F,0xE5,0x64,0x0F,0x0A,0x14,0xAF,0x91} + +// Forward Declarations + +class IDeckLink; + +/* Interface IDeckLink - represents a DeckLink device */ + +class IDeckLink : public IUnknown +{ +public: + virtual HRESULT GetModelName (/* out */ CFStringRef *modelName) = 0; + virtual HRESULT GetDisplayName (/* out */ CFStringRef *displayName) = 0; + +protected: + virtual ~IDeckLink () {}; // call Release method to drop reference count +}; + +/* Functions */ + +extern "C" { + + +}; + + +#endif /* defined(BMD_DECKLINKAPIDISCOVERY_H) */ diff --git a/sys/decklink/osx/DeckLinkAPIDispatch-osx.cpp b/sys/decklink/osx/DeckLinkAPIDispatch-osx.cpp new file mode 100644 index 0000000000..18b0122fa2 --- /dev/null +++ b/sys/decklink/osx/DeckLinkAPIDispatch-osx.cpp @@ -0,0 +1,178 @@ +/* -LICENSE-START- +** Copyright (c) 2009 Blackmagic Design +** +** Permission is hereby granted, free of charge, to any person or organization +** obtaining a copy of the software and accompanying documentation covered by +** this license (the "Software") to use, reproduce, display, distribute, +** execute, and transmit the Software, and to prepare derivative works of the +** Software, and to permit third-parties to whom the Software is furnished to +** do so, all subject to the following: +** +** The copyright notices in the Software and this entire statement, including +** the above license grant, this restriction and the following disclaimer, +** must be included in all copies of the Software, in whole or in part, and +** all derivative works of the Software, unless such copies or derivative +** works are solely in the form of machine-executable object code generated by +** a source language processor. +** +** 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, TITLE AND NON-INFRINGEMENT. IN NO EVENT +** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +** DEALINGS IN THE SOFTWARE. +** -LICENSE-END- +*/ +/* DeckLinkAPIDispatch.cpp */ + +#include "DeckLinkAPI.h" +#include + +#if BLACKMAGIC_DECKLINK_API_MAGIC != 1 + #error The DeckLink API version of DeckLinkAPIDispatch.cpp is not the same version as DeckLinkAPI.h +#endif + +#define kDeckLinkAPI_BundlePath "/Library/Application Support/Blackmagic Design/Blackmagic DeckLink/DeckLinkAPI.bundle" + +typedef IDeckLinkIterator* (*CreateIteratorFunc)(void); +typedef IDeckLinkAPIInformation* (*CreateAPIInformationFunc)(void); +typedef IDeckLinkGLScreenPreviewHelper* (*CreateOpenGLScreenPreviewHelperFunc)(void); +typedef IDeckLinkCocoaScreenPreviewCallback* (*CreateCocoaScreenPreviewFunc)(void*); +typedef IDeckLinkVideoConversion* (*CreateVideoConversionInstanceFunc)(void); + +static pthread_once_t gDeckLinkOnceControl = PTHREAD_ONCE_INIT; +static CFBundleRef gDeckLinkAPIBundleRef = NULL; +static CreateIteratorFunc gCreateIteratorFunc = NULL; +static CreateAPIInformationFunc gCreateAPIInformationFunc = NULL; +static CreateOpenGLScreenPreviewHelperFunc gCreateOpenGLPreviewFunc = NULL; +static CreateCocoaScreenPreviewFunc gCreateCocoaPreviewFunc = NULL; +static CreateVideoConversionInstanceFunc gCreateVideoConversionFunc = NULL; + + +void InitDeckLinkAPI (void) +{ + CFURLRef bundleURL; + + bundleURL = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, CFSTR(kDeckLinkAPI_BundlePath), kCFURLPOSIXPathStyle, true); + if (bundleURL != NULL) + { + gDeckLinkAPIBundleRef = CFBundleCreate(kCFAllocatorDefault, bundleURL); + if (gDeckLinkAPIBundleRef != NULL) + { + gCreateIteratorFunc = (CreateIteratorFunc)CFBundleGetFunctionPointerForName(gDeckLinkAPIBundleRef, CFSTR("CreateDeckLinkIteratorInstance_0002")); + gCreateAPIInformationFunc = (CreateAPIInformationFunc)CFBundleGetFunctionPointerForName(gDeckLinkAPIBundleRef, CFSTR("CreateDeckLinkAPIInformationInstance_0001")); + gCreateOpenGLPreviewFunc = (CreateOpenGLScreenPreviewHelperFunc)CFBundleGetFunctionPointerForName(gDeckLinkAPIBundleRef, CFSTR("CreateOpenGLScreenPreviewHelper_0001")); + gCreateCocoaPreviewFunc = (CreateCocoaScreenPreviewFunc)CFBundleGetFunctionPointerForName(gDeckLinkAPIBundleRef, CFSTR("CreateCocoaScreenPreview_0001")); + gCreateVideoConversionFunc = (CreateVideoConversionInstanceFunc)CFBundleGetFunctionPointerForName(gDeckLinkAPIBundleRef, CFSTR("CreateVideoConversionInstance_0001")); + } + CFRelease(bundleURL); + } +} + +bool IsDeckLinkAPIPresent (void) +{ + // If the DeckLink API bundle was successfully loaded, return this knowledge to the caller + if (gDeckLinkAPIBundleRef != NULL) + return true; + + return false; +} + +IDeckLinkIterator* CreateDeckLinkIteratorInstance (void) +{ + pthread_once(&gDeckLinkOnceControl, InitDeckLinkAPI); + + if (gCreateIteratorFunc == NULL) + return NULL; + + return gCreateIteratorFunc(); +} + +IDeckLinkAPIInformation* CreateDeckLinkAPIInformationInstance (void) +{ + pthread_once(&gDeckLinkOnceControl, InitDeckLinkAPI); + + if (gCreateAPIInformationFunc == NULL) + return NULL; + + return gCreateAPIInformationFunc(); +} + +IDeckLinkGLScreenPreviewHelper* CreateOpenGLScreenPreviewHelper (void) +{ + pthread_once(&gDeckLinkOnceControl, InitDeckLinkAPI); + + if (gCreateOpenGLPreviewFunc == NULL) + return NULL; + + return gCreateOpenGLPreviewFunc(); +} + +IDeckLinkCocoaScreenPreviewCallback* CreateCocoaScreenPreview (void* parentView) +{ + pthread_once(&gDeckLinkOnceControl, InitDeckLinkAPI); + + if (gCreateCocoaPreviewFunc == NULL) + return NULL; + + return gCreateCocoaPreviewFunc(parentView); +} + +IDeckLinkVideoConversion* CreateVideoConversionInstance (void) +{ + pthread_once(&gDeckLinkOnceControl, InitDeckLinkAPI); + + if (gCreateVideoConversionFunc == NULL) + return NULL; + + return gCreateVideoConversionFunc(); +} + +#define kBMDStreamingAPI_BundlePath "/Library/Application Support/Blackmagic Design/Streaming/BMDStreamingAPI.bundle" + +typedef IBMDStreamingDiscovery* (*CreateDiscoveryFunc)(void); +typedef IBMDStreamingH264NALParser* (*CreateNALParserFunc)(void); + +static pthread_once_t gBMDStreamingOnceControl = PTHREAD_ONCE_INIT; +static CFBundleRef gBMDStreamingAPIBundleRef = NULL; +static CreateDiscoveryFunc gCreateDiscoveryFunc = NULL; +static CreateNALParserFunc gCreateNALParserFunc = NULL; + +void InitBMDStreamingAPI(void) +{ + CFURLRef bundleURL; + + bundleURL = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, CFSTR(kBMDStreamingAPI_BundlePath), kCFURLPOSIXPathStyle, true); + if (bundleURL != NULL) + { + gBMDStreamingAPIBundleRef = CFBundleCreate(kCFAllocatorDefault, bundleURL); + if (gBMDStreamingAPIBundleRef != NULL) + { + gCreateDiscoveryFunc = (CreateDiscoveryFunc)CFBundleGetFunctionPointerForName(gBMDStreamingAPIBundleRef, CFSTR("CreateBMDStreamingDiscoveryInstance_0001")); + gCreateNALParserFunc = (CreateNALParserFunc)CFBundleGetFunctionPointerForName(gBMDStreamingAPIBundleRef, CFSTR("CreateBMDStreamingH264NALParser_0001")); + } + + CFRelease(bundleURL); + } +} + +IBMDStreamingDiscovery* CreateBMDStreamingDiscoveryInstance() +{ + pthread_once(&gBMDStreamingOnceControl, InitBMDStreamingAPI); + + if (gCreateDiscoveryFunc == NULL) + return NULL; + + return gCreateDiscoveryFunc(); +} + +IBMDStreamingH264NALParser* CreateBMDStreamingH264NALParser() +{ + pthread_once(&gBMDStreamingOnceControl, InitBMDStreamingAPI); + + if (gCreateNALParserFunc == NULL) + return NULL; + + return gCreateNALParserFunc(); +} diff --git a/sys/decklink/osx/DeckLinkAPIModes.h b/sys/decklink/osx/DeckLinkAPIModes.h new file mode 100644 index 0000000000..8b07592365 --- /dev/null +++ b/sys/decklink/osx/DeckLinkAPIModes.h @@ -0,0 +1,155 @@ +/* -LICENSE-START- +** Copyright (c) 2011 Blackmagic Design +** +** Permission is hereby granted, free of charge, to any person or organization +** obtaining a copy of the software and accompanying documentation covered by +** this license (the "Software") to use, reproduce, display, distribute, +** execute, and transmit the Software, and to prepare derivative works of the +** Software, and to permit third-parties to whom the Software is furnished to +** do so, all subject to the following: +** +** The copyright notices in the Software and this entire statement, including +** the above license grant, this restriction and the following disclaimer, +** must be included in all copies of the Software, in whole or in part, and +** all derivative works of the Software, unless such copies or derivative +** works are solely in the form of machine-executable object code generated by +** a source language processor. +** +** 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, TITLE AND NON-INFRINGEMENT. IN NO EVENT +** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +** DEALINGS IN THE SOFTWARE. +** -LICENSE-END- +*/ + +#ifndef BMD_DECKLINKAPIMODES_H +#define BMD_DECKLINKAPIMODES_H + +// Type Declarations + + +// Interface ID Declarations + +#define IID_IDeckLinkDisplayModeIterator /* 9C88499F-F601-4021-B80B-032E4EB41C35 */ (REFIID){0x9C,0x88,0x49,0x9F,0xF6,0x01,0x40,0x21,0xB8,0x0B,0x03,0x2E,0x4E,0xB4,0x1C,0x35} +#define IID_IDeckLinkDisplayMode /* 3EB2C1AB-0A3D-4523-A3AD-F40D7FB14E78 */ (REFIID){0x3E,0xB2,0xC1,0xAB,0x0A,0x3D,0x45,0x23,0xA3,0xAD,0xF4,0x0D,0x7F,0xB1,0x4E,0x78} + +/* Enum BMDDisplayMode - Video display modes */ + +typedef uint32_t BMDDisplayMode; +enum _BMDDisplayMode { + + /* SD Modes */ + + bmdModeNTSC = 'ntsc', + bmdModeNTSC2398 = 'nt23', // 3:2 pulldown + bmdModePAL = 'pal ', + bmdModeNTSCp = 'ntsp', + bmdModePALp = 'palp', + + /* HD 1080 Modes */ + + bmdModeHD1080p2398 = '23ps', + bmdModeHD1080p24 = '24ps', + bmdModeHD1080p25 = 'Hp25', + bmdModeHD1080p2997 = 'Hp29', + bmdModeHD1080p30 = 'Hp30', + bmdModeHD1080i50 = 'Hi50', + bmdModeHD1080i5994 = 'Hi59', + bmdModeHD1080i6000 = 'Hi60', // N.B. This _really_ is 60.00 Hz. + bmdModeHD1080p50 = 'Hp50', + bmdModeHD1080p5994 = 'Hp59', + bmdModeHD1080p6000 = 'Hp60', // N.B. This _really_ is 60.00 Hz. + + /* HD 720 Modes */ + + bmdModeHD720p50 = 'hp50', + bmdModeHD720p5994 = 'hp59', + bmdModeHD720p60 = 'hp60', + + /* 2k Modes */ + + bmdMode2k2398 = '2k23', + bmdMode2k24 = '2k24', + bmdMode2k25 = '2k25', + + /* Special Modes */ + + bmdModeUnknown = 'iunk' +}; + +/* Enum BMDFieldDominance - Video field dominance */ + +typedef uint32_t BMDFieldDominance; +enum _BMDFieldDominance { + bmdUnknownFieldDominance = 0, + bmdLowerFieldFirst = 'lowr', + bmdUpperFieldFirst = 'uppr', + bmdProgressiveFrame = 'prog', + bmdProgressiveSegmentedFrame = 'psf ' +}; + +/* Enum BMDPixelFormat - Video pixel formats supported for output/input */ + +typedef uint32_t BMDPixelFormat; +enum _BMDPixelFormat { + bmdFormat8BitYUV = '2vuy', + bmdFormat10BitYUV = 'v210', + bmdFormat8BitARGB = 32, + bmdFormat8BitBGRA = 'BGRA', + bmdFormat10BitRGB = 'r210' // Big-endian RGB 10-bit per component with SMPTE video levels (64-960). Packed as 2:10:10:10 +}; + +/* Enum BMDDisplayModeFlags - Flags to describe the characteristics of an IDeckLinkDisplayMode. */ + +typedef uint32_t BMDDisplayModeFlags; +enum _BMDDisplayModeFlags { + bmdDisplayModeSupports3D = 1 << 0, + bmdDisplayModeColorspaceRec601 = 1 << 1, + bmdDisplayModeColorspaceRec709 = 1 << 2 +}; + +// Forward Declarations + +class IDeckLinkDisplayModeIterator; +class IDeckLinkDisplayMode; + +/* Interface IDeckLinkDisplayModeIterator - enumerates over supported input/output display modes. */ + +class IDeckLinkDisplayModeIterator : public IUnknown +{ +public: + virtual HRESULT Next (/* out */ IDeckLinkDisplayMode **deckLinkDisplayMode) = 0; + +protected: + virtual ~IDeckLinkDisplayModeIterator () {}; // call Release method to drop reference count +}; + +/* Interface IDeckLinkDisplayMode - represents a display mode */ + +class IDeckLinkDisplayMode : public IUnknown +{ +public: + virtual HRESULT GetName (/* out */ CFStringRef *name) = 0; + virtual BMDDisplayMode GetDisplayMode (void) = 0; + virtual long GetWidth (void) = 0; + virtual long GetHeight (void) = 0; + virtual HRESULT GetFrameRate (/* out */ BMDTimeValue *frameDuration, /* out */ BMDTimeScale *timeScale) = 0; + virtual BMDFieldDominance GetFieldDominance (void) = 0; + virtual BMDDisplayModeFlags GetFlags (void) = 0; + +protected: + virtual ~IDeckLinkDisplayMode () {}; // call Release method to drop reference count +}; + +/* Functions */ + +extern "C" { + + +}; + + +#endif /* defined(BMD_DECKLINKAPIMODES_H) */ diff --git a/sys/decklink/osx/DeckLinkAPIStreaming.h b/sys/decklink/osx/DeckLinkAPIStreaming.h new file mode 100644 index 0000000000..ecffb8def9 --- /dev/null +++ b/sys/decklink/osx/DeckLinkAPIStreaming.h @@ -0,0 +1,366 @@ +/* -LICENSE-START- +** Copyright (c) 2011 Blackmagic Design +** +** Permission is hereby granted, free of charge, to any person or organization +** obtaining a copy of the software and accompanying documentation covered by +** this license (the "Software") to use, reproduce, display, distribute, +** execute, and transmit the Software, and to prepare derivative works of the +** Software, and to permit third-parties to whom the Software is furnished to +** do so, all subject to the following: +** +** The copyright notices in the Software and this entire statement, including +** the above license grant, this restriction and the following disclaimer, +** must be included in all copies of the Software, in whole or in part, and +** all derivative works of the Software, unless such copies or derivative +** works are solely in the form of machine-executable object code generated by +** a source language processor. +** +** 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, TITLE AND NON-INFRINGEMENT. IN NO EVENT +** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +** DEALINGS IN THE SOFTWARE. +** -LICENSE-END- +*/ + +#ifndef BMD_DECKLINKAPISTREAMING_H +#define BMD_DECKLINKAPISTREAMING_H + +// Type Declarations + + +// Interface ID Declarations + +#define IID_IBMDStreamingDeviceNotificationCallback /* F9531D64-3305-4B29-A387-7F74BB0D0E84 */ (REFIID){0xF9,0x53,0x1D,0x64,0x33,0x05,0x4B,0x29,0xA3,0x87,0x7F,0x74,0xBB,0x0D,0x0E,0x84} +#define IID_IBMDStreamingH264InputCallback /* 823C475F-55AE-46F9-890C-537CC5CEDCCA */ (REFIID){0x82,0x3C,0x47,0x5F,0x55,0xAE,0x46,0xF9,0x89,0x0C,0x53,0x7C,0xC5,0xCE,0xDC,0xCA} +#define IID_IBMDStreamingDiscovery /* 2C837444-F989-4D87-901A-47C8A36D096D */ (REFIID){0x2C,0x83,0x74,0x44,0xF9,0x89,0x4D,0x87,0x90,0x1A,0x47,0xC8,0xA3,0x6D,0x09,0x6D} +#define IID_IBMDStreamingVideoEncodingMode /* 1AB8035B-CD13-458D-B6DF-5E8F7C2141D9 */ (REFIID){0x1A,0xB8,0x03,0x5B,0xCD,0x13,0x45,0x8D,0xB6,0xDF,0x5E,0x8F,0x7C,0x21,0x41,0xD9} +#define IID_IBMDStreamingMutableVideoEncodingMode /* 19BF7D90-1E0A-400D-B2C6-FFC4E78AD49D */ (REFIID){0x19,0xBF,0x7D,0x90,0x1E,0x0A,0x40,0x0D,0xB2,0xC6,0xFF,0xC4,0xE7,0x8A,0xD4,0x9D} +#define IID_IBMDStreamingVideoEncodingModePresetIterator /* 7AC731A3-C950-4AD0-804A-8377AA51C6C4 */ (REFIID){0x7A,0xC7,0x31,0xA3,0xC9,0x50,0x4A,0xD0,0x80,0x4A,0x83,0x77,0xAA,0x51,0xC6,0xC4} +#define IID_IBMDStreamingDeviceInput /* 24B6B6EC-1727-44BB-9818-34FF086ACF98 */ (REFIID){0x24,0xB6,0xB6,0xEC,0x17,0x27,0x44,0xBB,0x98,0x18,0x34,0xFF,0x08,0x6A,0xCF,0x98} +#define IID_IBMDStreamingH264NALPacket /* E260E955-14BE-4395-9775-9F02CC0A9D89 */ (REFIID){0xE2,0x60,0xE9,0x55,0x14,0xBE,0x43,0x95,0x97,0x75,0x9F,0x02,0xCC,0x0A,0x9D,0x89} +#define IID_IBMDStreamingAudioPacket /* D9EB5902-1AD2-43F4-9E2C-3CFA50B5EE19 */ (REFIID){0xD9,0xEB,0x59,0x02,0x1A,0xD2,0x43,0xF4,0x9E,0x2C,0x3C,0xFA,0x50,0xB5,0xEE,0x19} +#define IID_IBMDStreamingMPEG2TSPacket /* 91810D1C-4FB3-4AAA-AE56-FA301D3DFA4C */ (REFIID){0x91,0x81,0x0D,0x1C,0x4F,0xB3,0x4A,0xAA,0xAE,0x56,0xFA,0x30,0x1D,0x3D,0xFA,0x4C} +#define IID_IBMDStreamingH264NALParser /* 5867F18C-5BFA-4CCC-B2A7-9DFD140417D2 */ (REFIID){0x58,0x67,0xF1,0x8C,0x5B,0xFA,0x4C,0xCC,0xB2,0xA7,0x9D,0xFD,0x14,0x04,0x17,0xD2} + +/* Enum BMDStreamingDeviceMode - Device modes */ + +typedef uint32_t BMDStreamingDeviceMode; +enum _BMDStreamingDeviceMode { + bmdStreamingDeviceIdle = 'idle', + bmdStreamingDeviceEncoding = 'enco', + bmdStreamingDeviceStopping = 'stop', + bmdStreamingDeviceUnknown = 'munk' +}; + +/* Enum BMDStreamingEncodingFrameRate - Encoded frame rates */ + +typedef uint32_t BMDStreamingEncodingFrameRate; +enum _BMDStreamingEncodingFrameRate { + + /* Interlaced rates */ + + bmdStreamingEncodedFrameRate50i = 'e50i', + bmdStreamingEncodedFrameRate5994i = 'e59i', + bmdStreamingEncodedFrameRate60i = 'e60i', + + /* Progressive rates */ + + bmdStreamingEncodedFrameRate2398p = 'e23p', + bmdStreamingEncodedFrameRate24p = 'e24p', + bmdStreamingEncodedFrameRate25p = 'e25p', + bmdStreamingEncodedFrameRate2997p = 'e29p', + bmdStreamingEncodedFrameRate30p = 'e30p', + bmdStreamingEncodedFrameRate50p = 'e50p', + bmdStreamingEncodedFrameRate5994p = 'e59p', + bmdStreamingEncodedFrameRate60p = 'e60p' +}; + +/* Enum BMDStreamingEncodingSupport - Output encoding mode supported flag */ + +typedef uint32_t BMDStreamingEncodingSupport; +enum _BMDStreamingEncodingSupport { + bmdStreamingEncodingModeNotSupported = 0, + bmdStreamingEncodingModeSupported, + bmdStreamingEncodingModeSupportedWithChanges +}; + +/* Enum BMDStreamingVideoCodec - Video codecs */ + +typedef uint32_t BMDStreamingVideoCodec; +enum _BMDStreamingVideoCodec { + bmdStreamingVideoCodecH264 = 'H264' +}; + +/* Enum BMDStreamingH264Profile - H264 encoding profile */ + +typedef uint32_t BMDStreamingH264Profile; +enum _BMDStreamingH264Profile { + bmdStreamingH264ProfileHigh = 'high', + bmdStreamingH264ProfileMain = 'main', + bmdStreamingH264ProfileBaseline = 'base' +}; + +/* Enum BMDStreamingH264Level - H264 encoding level */ + +typedef uint32_t BMDStreamingH264Level; +enum _BMDStreamingH264Level { + bmdStreamingH264Level12 = 'lv12', + bmdStreamingH264Level13 = 'lv13', + bmdStreamingH264Level2 = 'lv2 ', + bmdStreamingH264Level21 = 'lv21', + bmdStreamingH264Level22 = 'lv22', + bmdStreamingH264Level3 = 'lv3 ', + bmdStreamingH264Level31 = 'lv31', + bmdStreamingH264Level32 = 'lv32', + bmdStreamingH264Level4 = 'lv4 ', + bmdStreamingH264Level41 = 'lv41', + bmdStreamingH264Level42 = 'lv42' +}; + +/* Enum BMDStreamingH264EntropyCoding - H264 entropy coding */ + +typedef uint32_t BMDStreamingH264EntropyCoding; +enum _BMDStreamingH264EntropyCoding { + bmdStreamingH264EntropyCodingCAVLC = 'EVLC', + bmdStreamingH264EntropyCodingCABAC = 'EBAC' +}; + +/* Enum BMDStreamingAudioCodec - Audio codecs */ + +typedef uint32_t BMDStreamingAudioCodec; +enum _BMDStreamingAudioCodec { + bmdStreamingAudioCodecAAC = 'AAC ' +}; + +/* Enum BMDStreamingEncodingModePropertyID - Encoding mode properties */ + +typedef uint32_t BMDStreamingEncodingModePropertyID; +enum _BMDStreamingEncodingModePropertyID { + + /* Integers, Video Properties */ + + bmdStreamingEncodingPropertyVideoFrameRate = 'vfrt', // Uses values of type BMDStreamingEncodingFrameRate + bmdStreamingEncodingPropertyVideoBitRateKbps = 'vbrt', + + /* Integers, H264 Properties */ + + bmdStreamingEncodingPropertyH264Profile = 'hprf', + bmdStreamingEncodingPropertyH264Level = 'hlvl', + bmdStreamingEncodingPropertyH264EntropyCoding = 'hent', + + /* Flags, H264 Properties */ + + bmdStreamingEncodingPropertyH264HasBFrames = 'hBfr', + + /* Integers, Audio Properties */ + + bmdStreamingEncodingPropertyAudioCodec = 'acdc', + bmdStreamingEncodingPropertyAudioSampleRate = 'asrt', + bmdStreamingEncodingPropertyAudioChannelCount = 'achc', + bmdStreamingEncodingPropertyAudioBitRateKbps = 'abrt' +}; + +// Forward Declarations + +class IBMDStreamingDeviceNotificationCallback; +class IBMDStreamingH264InputCallback; +class IBMDStreamingDiscovery; +class IBMDStreamingVideoEncodingMode; +class IBMDStreamingMutableVideoEncodingMode; +class IBMDStreamingVideoEncodingModePresetIterator; +class IBMDStreamingDeviceInput; +class IBMDStreamingH264NALPacket; +class IBMDStreamingAudioPacket; +class IBMDStreamingMPEG2TSPacket; +class IBMDStreamingH264NALParser; + +/* Interface IBMDStreamingDeviceNotificationCallback - Device notification callbacks. */ + +class IBMDStreamingDeviceNotificationCallback : public IUnknown +{ +public: + virtual HRESULT StreamingDeviceArrived (/* in */ IDeckLink* device) = 0; + virtual HRESULT StreamingDeviceRemoved (/* in */ IDeckLink* device) = 0; + virtual HRESULT StreamingDeviceModeChanged (/* in */ IDeckLink* device, /* in */ BMDStreamingDeviceMode mode) = 0; + +protected: + virtual ~IBMDStreamingDeviceNotificationCallback () {}; // call Release method to drop reference count +}; + +/* Interface IBMDStreamingH264InputCallback - H264 input callbacks. */ + +class IBMDStreamingH264InputCallback : public IUnknown +{ +public: + virtual HRESULT H264NALPacketArrived (/* in */ IBMDStreamingH264NALPacket* nalPacket) = 0; + virtual HRESULT H264AudioPacketArrived (/* in */ IBMDStreamingAudioPacket* audioPacket) = 0; + virtual HRESULT MPEG2TSPacketArrived (/* in */ IBMDStreamingMPEG2TSPacket* tsPacket) = 0; + virtual HRESULT H264VideoInputConnectorScanningChanged (void) = 0; + virtual HRESULT H264VideoInputConnectorChanged (void) = 0; + virtual HRESULT H264VideoInputModeChanged (void) = 0; + +protected: + virtual ~IBMDStreamingH264InputCallback () {}; // call Release method to drop reference count +}; + +/* Interface IBMDStreamingDiscovery - Installs device notifications */ + +class IBMDStreamingDiscovery : public IUnknown +{ +public: + virtual HRESULT InstallDeviceNotifications (/* in */ IBMDStreamingDeviceNotificationCallback* theCallback) = 0; + virtual HRESULT UninstallDeviceNotifications (void) = 0; + +protected: + virtual ~IBMDStreamingDiscovery () {}; // call Release method to drop reference count +}; + +/* Interface IBMDStreamingVideoEncodingMode - Represents an encoded video mode. */ + +class IBMDStreamingVideoEncodingMode : public IUnknown +{ +public: + virtual HRESULT GetName (/* out */ CFStringRef *name) = 0; + virtual unsigned int GetPresetID (void) = 0; + virtual unsigned int GetSourcePositionX (void) = 0; + virtual unsigned int GetSourcePositionY (void) = 0; + virtual unsigned int GetSourceWidth (void) = 0; + virtual unsigned int GetSourceHeight (void) = 0; + virtual unsigned int GetDestWidth (void) = 0; + virtual unsigned int GetDestHeight (void) = 0; + virtual HRESULT GetFlag (/* in */ BMDStreamingEncodingModePropertyID cfgID, /* out */ bool* value) = 0; + virtual HRESULT GetInt (/* in */ BMDStreamingEncodingModePropertyID cfgID, /* out */ int64_t* value) = 0; + virtual HRESULT GetFloat (/* in */ BMDStreamingEncodingModePropertyID cfgID, /* out */ double* value) = 0; + virtual HRESULT GetString (/* in */ BMDStreamingEncodingModePropertyID cfgID, /* out */ CFStringRef *value) = 0; + virtual HRESULT CreateMutableVideoEncodingMode (/* out */ IBMDStreamingMutableVideoEncodingMode** newEncodingMode) = 0; // Creates a mutable copy of the encoding mode + +protected: + virtual ~IBMDStreamingVideoEncodingMode () {}; // call Release method to drop reference count +}; + +/* Interface IBMDStreamingMutableVideoEncodingMode - Represents a mutable encoded video mode. */ + +class IBMDStreamingMutableVideoEncodingMode : public IBMDStreamingVideoEncodingMode +{ +public: + virtual HRESULT SetSourceRect (/* in */ uint32_t posX, /* in */ uint32_t posY, /* in */ uint32_t width, /* in */ uint32_t height) = 0; + virtual HRESULT SetDestSize (/* in */ uint32_t width, /* in */ uint32_t height) = 0; + virtual HRESULT SetFlag (/* in */ BMDStreamingEncodingModePropertyID cfgID, /* in */ bool value) = 0; + virtual HRESULT SetInt (/* in */ BMDStreamingEncodingModePropertyID cfgID, /* in */ int64_t value) = 0; + virtual HRESULT SetFloat (/* in */ BMDStreamingEncodingModePropertyID cfgID, /* in */ double value) = 0; + virtual HRESULT SetString (/* in */ BMDStreamingEncodingModePropertyID cfgID, /* in */ CFStringRef value) = 0; + +protected: + virtual ~IBMDStreamingMutableVideoEncodingMode () {}; // call Release method to drop reference count +}; + +/* Interface IBMDStreamingVideoEncodingModePresetIterator - Enumerates encoding mode presets */ + +class IBMDStreamingVideoEncodingModePresetIterator : public IUnknown +{ +public: + virtual HRESULT Next (/* out */ IBMDStreamingVideoEncodingMode** videoEncodingMode) = 0; + +protected: + virtual ~IBMDStreamingVideoEncodingModePresetIterator () {}; // call Release method to drop reference count +}; + +/* Interface IBMDStreamingDeviceInput - Created by QueryInterface from IDeckLink */ + +class IBMDStreamingDeviceInput : public IUnknown +{ +public: + + /* Input modes */ + + virtual HRESULT DoesSupportVideoInputMode (/* in */ BMDDisplayMode inputMode, /* out */ bool* result) = 0; + virtual HRESULT GetVideoInputModeIterator (/* out */ IDeckLinkDisplayModeIterator** iterator) = 0; + virtual HRESULT SetVideoInputMode (/* in */ BMDDisplayMode inputMode) = 0; + virtual HRESULT GetCurrentDetectedVideoInputMode (/* out */ BMDDisplayMode* detectedMode) = 0; + + /* Capture modes */ + + virtual HRESULT GetVideoEncodingMode (/* out */ IBMDStreamingVideoEncodingMode** encodingMode) = 0; + virtual HRESULT GetVideoEncodingModePresetIterator (/* in */ BMDDisplayMode inputMode, /* out */ IBMDStreamingVideoEncodingModePresetIterator** iterator) = 0; + virtual HRESULT DoesSupportVideoEncodingMode (/* in */ BMDDisplayMode inputMode, /* in */ IBMDStreamingVideoEncodingMode* encodingMode, /* out */ BMDStreamingEncodingSupport* result, /* out */ IBMDStreamingVideoEncodingMode** changedEncodingMode) = 0; + virtual HRESULT SetVideoEncodingMode (/* in */ IBMDStreamingVideoEncodingMode* encodingMode) = 0; + + /* Input control */ + + virtual HRESULT StartCapture (void) = 0; + virtual HRESULT StopCapture (void) = 0; + virtual HRESULT SetCallback (/* in */ IUnknown* theCallback) = 0; + +protected: + virtual ~IBMDStreamingDeviceInput () {}; // call Release method to drop reference count +}; + +/* Interface IBMDStreamingH264NALPacket - Represent an H.264 NAL packet */ + +class IBMDStreamingH264NALPacket : public IUnknown +{ +public: + virtual long GetPayloadSize (void) = 0; + virtual HRESULT GetBytes (/* out */ void** buffer) = 0; + virtual HRESULT GetBytesWithSizePrefix (/* out */ void** buffer) = 0; // Contains a 32-bit unsigned big endian size prefix + virtual HRESULT GetDisplayTime (/* in */ uint64_t requestedTimeScale, /* out */ uint64_t* displayTime) = 0; + virtual HRESULT GetPacketIndex (/* out */ uint32_t* packetIndex) = 0; + +protected: + virtual ~IBMDStreamingH264NALPacket () {}; // call Release method to drop reference count +}; + +/* Interface IBMDStreamingAudioPacket - Represents a chunk of audio data */ + +class IBMDStreamingAudioPacket : public IUnknown +{ +public: + virtual BMDStreamingAudioCodec GetCodec (void) = 0; + virtual long GetPayloadSize (void) = 0; + virtual HRESULT GetBytes (/* out */ void** buffer) = 0; + virtual HRESULT GetPlayTime (/* in */ uint64_t requestedTimeScale, /* out */ uint64_t* playTime) = 0; + virtual HRESULT GetPacketIndex (/* out */ uint32_t* packetIndex) = 0; + +protected: + virtual ~IBMDStreamingAudioPacket () {}; // call Release method to drop reference count +}; + +/* Interface IBMDStreamingMPEG2TSPacket - Represent an MPEG2 Transport Stream packet */ + +class IBMDStreamingMPEG2TSPacket : public IUnknown +{ +public: + virtual long GetPayloadSize (void) = 0; + virtual HRESULT GetBytes (/* out */ void** buffer) = 0; + +protected: + virtual ~IBMDStreamingMPEG2TSPacket () {}; // call Release method to drop reference count +}; + +/* Interface IBMDStreamingH264NALParser - For basic NAL parsing */ + +class IBMDStreamingH264NALParser : public IUnknown +{ +public: + virtual HRESULT IsNALSequenceParameterSet (/* in */ IBMDStreamingH264NALPacket* nal) = 0; + virtual HRESULT IsNALPictureParameterSet (/* in */ IBMDStreamingH264NALPacket* nal) = 0; + virtual HRESULT GetProfileAndLevelFromSPS (/* in */ IBMDStreamingH264NALPacket* nal, /* out */ uint32_t* profileIdc, /* out */ uint32_t* profileCompatability, /* out */ uint32_t* levelIdc) = 0; + +protected: + virtual ~IBMDStreamingH264NALParser () {}; // call Release method to drop reference count +}; + +/* Functions */ + +extern "C" { + + IBMDStreamingDiscovery* CreateBMDStreamingDiscoveryInstance (void); + IBMDStreamingH264NALParser* CreateBMDStreamingH264NALParser (void); + +}; + + +#endif /* defined(BMD_DECKLINKAPISTREAMING_H) */ diff --git a/sys/decklink/osx/DeckLinkAPITypes.h b/sys/decklink/osx/DeckLinkAPITypes.h new file mode 100644 index 0000000000..ed54d8e819 --- /dev/null +++ b/sys/decklink/osx/DeckLinkAPITypes.h @@ -0,0 +1,89 @@ +/* -LICENSE-START- +** Copyright (c) 2011 Blackmagic Design +** +** Permission is hereby granted, free of charge, to any person or organization +** obtaining a copy of the software and accompanying documentation covered by +** this license (the "Software") to use, reproduce, display, distribute, +** execute, and transmit the Software, and to prepare derivative works of the +** Software, and to permit third-parties to whom the Software is furnished to +** do so, all subject to the following: +** +** The copyright notices in the Software and this entire statement, including +** the above license grant, this restriction and the following disclaimer, +** must be included in all copies of the Software, in whole or in part, and +** all derivative works of the Software, unless such copies or derivative +** works are solely in the form of machine-executable object code generated by +** a source language processor. +** +** 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, TITLE AND NON-INFRINGEMENT. IN NO EVENT +** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +** DEALINGS IN THE SOFTWARE. +** -LICENSE-END- +*/ + +#ifndef BMD_DECKLINKAPITYPES_H +#define BMD_DECKLINKAPITYPES_H + +// Type Declarations + +typedef int64_t BMDTimeValue; +typedef int64_t BMDTimeScale; +typedef uint32_t BMDTimecodeBCD; +typedef uint32_t BMDTimecodeUserBits; + +// Interface ID Declarations + +#define IID_IDeckLinkTimecode /* BC6CFBD3-8317-4325-AC1C-1216391E9340 */ (REFIID){0xBC,0x6C,0xFB,0xD3,0x83,0x17,0x43,0x25,0xAC,0x1C,0x12,0x16,0x39,0x1E,0x93,0x40} + +/* Enum BMDTimecodeFlags - Timecode flags */ + +typedef uint32_t BMDTimecodeFlags; +enum _BMDTimecodeFlags { + bmdTimecodeFlagDefault = 0, + bmdTimecodeIsDropFrame = 1 << 0 +}; + +/* Enum BMDVideoConnection - Video connection types */ + +typedef uint32_t BMDVideoConnection; +enum _BMDVideoConnection { + bmdVideoConnectionSDI = 1 << 0, + bmdVideoConnectionHDMI = 1 << 1, + bmdVideoConnectionOpticalSDI = 1 << 2, + bmdVideoConnectionComponent = 1 << 3, + bmdVideoConnectionComposite = 1 << 4, + bmdVideoConnectionSVideo = 1 << 5 +}; + +// Forward Declarations + +class IDeckLinkTimecode; + +/* Interface IDeckLinkTimecode - Used for video frame timecode representation. */ + +class IDeckLinkTimecode : public IUnknown +{ +public: + virtual BMDTimecodeBCD GetBCD (void) = 0; + virtual HRESULT GetComponents (/* out */ uint8_t *hours, /* out */ uint8_t *minutes, /* out */ uint8_t *seconds, /* out */ uint8_t *frames) = 0; + virtual HRESULT GetString (/* out */ CFStringRef *timecode) = 0; + virtual BMDTimecodeFlags GetFlags (void) = 0; + virtual HRESULT GetTimecodeUserBits (/* out */ BMDTimecodeUserBits *userBits) = 0; + +protected: + virtual ~IDeckLinkTimecode () {}; // call Release method to drop reference count +}; + +/* Functions */ + +extern "C" { + + +}; + + +#endif /* defined(BMD_DECKLINKAPITYPES_H) */ diff --git a/sys/decklink/osx/DeckLinkAPIVersion.h b/sys/decklink/osx/DeckLinkAPIVersion.h new file mode 100644 index 0000000000..2681ed0a0a --- /dev/null +++ b/sys/decklink/osx/DeckLinkAPIVersion.h @@ -0,0 +1,37 @@ +/* -LICENSE-START- + * ** Copyright (c) 2011 Blackmagic Design + * ** + * ** Permission is hereby granted, free of charge, to any person or organization + * ** obtaining a copy of the software and accompanying documentation covered by + * ** this license (the "Software") to use, reproduce, display, distribute, + * ** execute, and transmit the Software, and to prepare derivative works of the + * ** Software, and to permit third-parties to whom the Software is furnished to + * ** do so, all subject to the following: + * ** + * ** The copyright notices in the Software and this entire statement, including + * ** the above license grant, this restriction and the following disclaimer, + * ** must be included in all copies of the Software, in whole or in part, and + * ** all derivative works of the Software, unless such copies or derivative + * ** works are solely in the form of machine-executable object code generated by + * ** a source language processor. + * ** + * ** 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, TITLE AND NON-INFRINGEMENT. IN NO EVENT + * ** SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE + * ** FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, + * ** ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * ** DEALINGS IN THE SOFTWARE. + * ** -LICENSE-END- + * */ + +/* DeckLinkAPIVersion.h */ + +#ifndef __DeckLink_API_Verison_h__ +#define __DeckLink_API_Version_h__ + +#define BLACKMAGIC_DECKLINK_API_VERSION 0x09000000 +#define BLACKMAGIC_DECKLINK_API_VERSION_STRING "9.0" + +#endif // __DeckLink_API_Version_h__ + From 2712ab62168403d7b8dcd4cadbab227da1cb4ae4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Olivier=20Cr=C3=AAte?= Date: Fri, 23 Mar 2012 13:06:12 -0400 Subject: [PATCH 135/138] shmsink: Make buffer-time signed to deal with backward jumps in timestamps --- sys/shm/gstshmsink.c | 8 ++++---- sys/shm/gstshmsink.h | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/sys/shm/gstshmsink.c b/sys/shm/gstshmsink.c index ec2a4c3e5f..3ebbc47521 100644 --- a/sys/shm/gstshmsink.c +++ b/sys/shm/gstshmsink.c @@ -174,10 +174,10 @@ gst_shm_sink_class_init (GstShmSinkClass * klass) G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property (gobject_class, PROP_BUFFER_TIME, - g_param_spec_uint64 ("buffer-time", + g_param_spec_int64 ("buffer-time", "Buffer Time of the shm buffer", "Maximum Size of the shm buffer in nanoseconds (-1 to disable)", - 0, G_MAXUINT64, GST_CLOCK_TIME_NONE, + -1, G_MAXINT64, -1, G_PARAM_CONSTRUCT | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); signals[SIGNAL_CLIENT_CONNECTED] = g_signal_new ("client-connected", @@ -249,7 +249,7 @@ gst_shm_sink_set_property (GObject * object, guint prop_id, break; case PROP_BUFFER_TIME: GST_OBJECT_LOCK (object); - self->buffer_time = g_value_get_uint64 (value); + self->buffer_time = g_value_get_int64 (value); GST_OBJECT_UNLOCK (object); g_cond_broadcast (self->cond); break; @@ -288,7 +288,7 @@ gst_shm_sink_get_property (GObject * object, guint prop_id, g_value_set_boolean (value, self->wait_for_connection); break; case PROP_BUFFER_TIME: - g_value_set_uint64 (value, self->buffer_time); + g_value_set_int64 (value, self->buffer_time); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); diff --git a/sys/shm/gstshmsink.h b/sys/shm/gstshmsink.h index 83dad393e5..d0db5309fb 100644 --- a/sys/shm/gstshmsink.h +++ b/sys/shm/gstshmsink.h @@ -61,7 +61,7 @@ struct _GstShmSink gboolean wait_for_connection; gboolean stop; gboolean unlock; - GstClockTime buffer_time; + GstClockTimeDiff buffer_time; GCond *cond; }; From bece1c97f2ad1e7e132af1eb3dffdad52d8cbed7 Mon Sep 17 00:00:00 2001 From: Stefan Sauer Date: Fri, 23 Mar 2012 18:16:08 +0100 Subject: [PATCH 136/138] modplug: work around memory trashing in libmodplug (0.8.7) Allocate double sized buffers. Also add more debug logging. --- ext/modplug/gstmodplug.cc | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/ext/modplug/gstmodplug.cc b/ext/modplug/gstmodplug.cc index 9344cf9c02..8b42a52bda 100644 --- a/ext/modplug/gstmodplug.cc +++ b/ext/modplug/gstmodplug.cc @@ -467,6 +467,8 @@ static void gst_modplug_fixate (GstPad * pad, GstCaps * caps) { GstStructure *structure; + + GST_DEBUG_OBJECT (pad, "Fixating caps: %"GST_PTR_FORMAT, caps); structure = gst_caps_get_structure (caps, 0); if (!gst_structure_fixate_field_nearest_int (structure, "rate", 44100)) @@ -500,6 +502,10 @@ gst_modplug_load_song (GstModPlug * modplug) gst_structure_get_int (structure, "depth", &modplug->bits); gst_structure_get_int (structure, "channels", &modplug->channel); gst_structure_get_int (structure, "rate", &modplug->frequency); + + GST_DEBUG_OBJECT (modplug, + "Audio settings: %d bits, %d channel(s), %d Hz sampling rate", + modplug->bits, modplug->channel, modplug->frequency); gst_pad_set_caps (modplug->srcpad, newcaps); gst_caps_unref (newcaps); @@ -667,7 +673,6 @@ gst_modplug_loop (GstModPlug * modplug) GST_TAG_COMMENT, comment, NULL); } - gst_element_found_tags (GST_ELEMENT (modplug), tags); } else { /* not fully loaded yet */ @@ -682,7 +687,7 @@ gst_modplug_loop (GstModPlug * modplug) gfloat temp; temp = (gfloat) modplug->song_length / modplug->seek_at; - seek_to_pos = (int) (modplug->mSoundFile->GetMaxPosition () / temp); + seek_to_pos = (gint) (modplug->mSoundFile->GetMaxPosition () / temp); GST_DEBUG_OBJECT (modplug, "Seeking to row %d", seek_to_pos); @@ -691,9 +696,12 @@ gst_modplug_loop (GstModPlug * modplug) } /* read and output a buffer */ + GST_LOG_OBJECT (modplug, "Read %d bytes", (gint)modplug->read_bytes); + /* libmodplug 0.8.7 trashes memory */ flow = gst_pad_alloc_buffer_and_set_caps (modplug->srcpad, - GST_BUFFER_OFFSET_NONE, modplug->read_bytes, + GST_BUFFER_OFFSET_NONE, modplug->read_bytes * 2, GST_PAD_CAPS (modplug->srcpad), &out); + GST_BUFFER_SIZE (out) = modplug->read_bytes; if (flow != GST_FLOW_OK) { GST_LOG_OBJECT (modplug, "pad alloc flow: %s", gst_flow_get_name (flow)); From 4f1bcb55a40603f2d6bc94c16befd8fa9989cb3b Mon Sep 17 00:00:00 2001 From: Stefan Sauer Date: Fri, 23 Mar 2012 18:18:06 +0100 Subject: [PATCH 137/138] flte: comment cleanup Remove commented out code for a flitesynth that we don't have in git anyway. Add a comment regarding the flite voices. --- ext/flite/gstflite.c | 3 --- ext/flite/gstflitetestsrc.c | 3 +-- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/ext/flite/gstflite.c b/ext/flite/gstflite.c index 2995d9f3e6..d75bd2ffe0 100644 --- a/ext/flite/gstflite.c +++ b/ext/flite/gstflite.c @@ -24,7 +24,6 @@ #include #include -GType gst_flite_synth_get_type (void); GType gst_flite_test_src_get_type (void); @@ -33,8 +32,6 @@ plugin_init (GstPlugin * plugin) { flite_init (); -// gst_element_register (plugin, "flitesynth", GST_RANK_NONE, -// gst_flite_synth_get_type ()); gst_element_register (plugin, "flitetestsrc", GST_RANK_NONE, gst_flite_test_src_get_type ()); diff --git a/ext/flite/gstflitetestsrc.c b/ext/flite/gstflitetestsrc.c index a8e595c035..97c2acf960 100644 --- a/ext/flite/gstflitetestsrc.c +++ b/ext/flite/gstflitetestsrc.c @@ -298,10 +298,9 @@ gst_flite_test_src_get_times (GstBaseSrc * basesrc, GstBuffer * buffer, } #endif +/* there is no header for libflite_cmu_us_kal */ cst_voice *register_cmu_us_kal (); - - static gboolean gst_flite_test_src_start (GstBaseSrc * basesrc) { From d84d98943af42ce645ee022207bcf04e747d2d4a Mon Sep 17 00:00:00 2001 From: Stefan Sauer Date: Fri, 23 Mar 2012 18:36:21 +0100 Subject: [PATCH 138/138] modplug: memory handling cleanup Don't leak the CSoundFile. Use define for comment buffer size and ensure it is 0 terminated. --- ext/modplug/gstmodplug.cc | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/ext/modplug/gstmodplug.cc b/ext/modplug/gstmodplug.cc index 8b42a52bda..346809971b 100644 --- a/ext/modplug/gstmodplug.cc +++ b/ext/modplug/gstmodplug.cc @@ -646,7 +646,8 @@ gst_modplug_loop (GstModPlug * modplug) GstEvent *newsegment; GstTagList *tags; gboolean ok; - gchar comment[16384]; + #define COMMENT_SIZE 16384 + gchar comment[COMMENT_SIZE]; ok = gst_modplug_load_song (modplug); gst_buffer_unref (modplug->buffer); @@ -668,7 +669,9 @@ gst_modplug_loop (GstModPlug * modplug) GST_TAG_BEATS_PER_MINUTE, (gdouble) modplug->mSoundFile->GetMusicTempo (), NULL); - if (modplug->mSoundFile->GetSongComments ((gchar *) & comment, 16384, 32)) { + if (modplug->mSoundFile->GetSongComments ((gchar *) & comment, + COMMENT_SIZE, 32)) { + comment[COMMENT_SIZE - 1] = '\0'; gst_tag_list_add (tags, GST_TAG_MERGE_APPEND, GST_TAG_COMMENT, comment, NULL); } @@ -777,6 +780,7 @@ gst_modplug_change_state (GstElement * element, GstStateChange transition) } if (modplug->mSoundFile) { modplug->mSoundFile->Destroy (); + delete modplug->mSoundFile; modplug->mSoundFile = NULL; } break;