aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Dröge <sebastian@centricular.com>2014-05-21 12:35:11 +0200
committerSebastian Dröge <sebastian@centricular.com>2014-05-21 12:35:11 +0200
commit26c075e6a77c34b6e4017133a895b3473e9d1265 (patch)
tree1602e18d402aa5d63226ff3b84d946f5e4bcd8e0
parenta4b66f99ebf25d41b581942d220a2e03b5ff49a2 (diff)
Imported Upstream version 1.3.2
-rw-r--r--ChangeLog1260
-rw-r--r--Makefile.in1
-rw-r--r--NEWS18
-rw-r--r--RELEASE177
-rw-r--r--aclocal.m41
-rw-r--r--common/Makefile.in1
-rw-r--r--common/m4/Makefile.in1
-rwxr-xr-xconfigure58
-rw-r--r--configure.ac32
-rw-r--r--docs/Makefile.in1
-rw-r--r--docs/plugins/Makefile.in1
-rw-r--r--docs/plugins/gst-plugins-good-plugins.hierarchy2
-rw-r--r--docs/plugins/html/gst-plugins-good-plugins-plugin-1394.html2
-rw-r--r--docs/plugins/html/gst-plugins-good-plugins-plugin-aasink.html2
-rw-r--r--docs/plugins/html/gst-plugins-good-plugins-plugin-alaw.html2
-rw-r--r--docs/plugins/html/gst-plugins-good-plugins-plugin-alpha.html2
-rw-r--r--docs/plugins/html/gst-plugins-good-plugins-plugin-alphacolor.html2
-rw-r--r--docs/plugins/html/gst-plugins-good-plugins-plugin-apetag.html2
-rw-r--r--docs/plugins/html/gst-plugins-good-plugins-plugin-audiofx.html2
-rw-r--r--docs/plugins/html/gst-plugins-good-plugins-plugin-auparse.html2
-rw-r--r--docs/plugins/html/gst-plugins-good-plugins-plugin-autodetect.html2
-rw-r--r--docs/plugins/html/gst-plugins-good-plugins-plugin-avi.html2
-rw-r--r--docs/plugins/html/gst-plugins-good-plugins-plugin-cacasink.html2
-rw-r--r--docs/plugins/html/gst-plugins-good-plugins-plugin-cairo.html2
-rw-r--r--docs/plugins/html/gst-plugins-good-plugins-plugin-cutter.html2
-rw-r--r--docs/plugins/html/gst-plugins-good-plugins-plugin-debug.html2
-rw-r--r--docs/plugins/html/gst-plugins-good-plugins-plugin-deinterlace.html2
-rw-r--r--docs/plugins/html/gst-plugins-good-plugins-plugin-dtmf.html2
-rw-r--r--docs/plugins/html/gst-plugins-good-plugins-plugin-dv.html2
-rw-r--r--docs/plugins/html/gst-plugins-good-plugins-plugin-effectv.html2
-rw-r--r--docs/plugins/html/gst-plugins-good-plugins-plugin-equalizer.html2
-rw-r--r--docs/plugins/html/gst-plugins-good-plugins-plugin-flac.html2
-rw-r--r--docs/plugins/html/gst-plugins-good-plugins-plugin-flv.html2
-rw-r--r--docs/plugins/html/gst-plugins-good-plugins-plugin-flxdec.html2
-rw-r--r--docs/plugins/html/gst-plugins-good-plugins-plugin-gdkpixbuf.html2
-rw-r--r--docs/plugins/html/gst-plugins-good-plugins-plugin-goom.html2
-rw-r--r--docs/plugins/html/gst-plugins-good-plugins-plugin-goom2k1.html2
-rw-r--r--docs/plugins/html/gst-plugins-good-plugins-plugin-icydemux.html2
-rw-r--r--docs/plugins/html/gst-plugins-good-plugins-plugin-id3demux.html2
-rw-r--r--docs/plugins/html/gst-plugins-good-plugins-plugin-imagefreeze.html2
-rw-r--r--docs/plugins/html/gst-plugins-good-plugins-plugin-interleave.html2
-rw-r--r--docs/plugins/html/gst-plugins-good-plugins-plugin-isomp4.html2
-rw-r--r--docs/plugins/html/gst-plugins-good-plugins-plugin-jack.html2
-rw-r--r--docs/plugins/html/gst-plugins-good-plugins-plugin-jpeg.html2
-rw-r--r--docs/plugins/html/gst-plugins-good-plugins-plugin-level.html2
-rw-r--r--docs/plugins/html/gst-plugins-good-plugins-plugin-matroska.html2
-rw-r--r--docs/plugins/html/gst-plugins-good-plugins-plugin-mulaw.html2
-rw-r--r--docs/plugins/html/gst-plugins-good-plugins-plugin-multifile.html2
-rw-r--r--docs/plugins/html/gst-plugins-good-plugins-plugin-multipart.html2
-rw-r--r--docs/plugins/html/gst-plugins-good-plugins-plugin-navigationtest.html2
-rw-r--r--docs/plugins/html/gst-plugins-good-plugins-plugin-oss4.html2
-rw-r--r--docs/plugins/html/gst-plugins-good-plugins-plugin-ossaudio.html2
-rw-r--r--docs/plugins/html/gst-plugins-good-plugins-plugin-png.html2
-rw-r--r--docs/plugins/html/gst-plugins-good-plugins-plugin-pulseaudio.html2
-rw-r--r--docs/plugins/html/gst-plugins-good-plugins-plugin-replaygain.html2
-rw-r--r--docs/plugins/html/gst-plugins-good-plugins-plugin-rtp.html2
-rw-r--r--docs/plugins/html/gst-plugins-good-plugins-plugin-rtpmanager.html2
-rw-r--r--docs/plugins/html/gst-plugins-good-plugins-plugin-rtsp.html2
-rw-r--r--docs/plugins/html/gst-plugins-good-plugins-plugin-shapewipe.html2
-rw-r--r--docs/plugins/html/gst-plugins-good-plugins-plugin-shout2send.html2
-rw-r--r--docs/plugins/html/gst-plugins-good-plugins-plugin-smpte.html2
-rw-r--r--docs/plugins/html/gst-plugins-good-plugins-plugin-soup.html2
-rw-r--r--docs/plugins/html/gst-plugins-good-plugins-plugin-spectrum.html2
-rw-r--r--docs/plugins/html/gst-plugins-good-plugins-plugin-speex.html2
-rw-r--r--docs/plugins/html/gst-plugins-good-plugins-plugin-taglib.html2
-rw-r--r--docs/plugins/html/gst-plugins-good-plugins-plugin-udp.html2
-rw-r--r--docs/plugins/html/gst-plugins-good-plugins-plugin-video4linux2.html2
-rw-r--r--docs/plugins/html/gst-plugins-good-plugins-plugin-videobox.html2
-rw-r--r--docs/plugins/html/gst-plugins-good-plugins-plugin-videocrop.html2
-rw-r--r--docs/plugins/html/gst-plugins-good-plugins-plugin-videofilter.html2
-rw-r--r--docs/plugins/html/gst-plugins-good-plugins-plugin-videomixer.html2
-rw-r--r--docs/plugins/html/gst-plugins-good-plugins-plugin-vpx.html2
-rw-r--r--docs/plugins/html/gst-plugins-good-plugins-plugin-wavenc.html2
-rw-r--r--docs/plugins/html/gst-plugins-good-plugins-plugin-wavpack.html2
-rw-r--r--docs/plugins/html/gst-plugins-good-plugins-plugin-wavparse.html2
-rw-r--r--docs/plugins/html/gst-plugins-good-plugins-plugin-ximagesrc.html2
-rw-r--r--docs/plugins/html/gst-plugins-good-plugins-plugin-y4menc.html2
-rw-r--r--docs/plugins/html/gst-plugins-good-plugins-rtpbin.html2
-rw-r--r--docs/plugins/html/gst-plugins-good-plugins-v4l2sink.html2
-rw-r--r--docs/plugins/html/gst-plugins-good-plugins-v4l2src.html2
-rw-r--r--docs/plugins/html/index.html2
-rw-r--r--docs/plugins/inspect/plugin-1394.xml2
-rw-r--r--docs/plugins/inspect/plugin-aasink.xml2
-rw-r--r--docs/plugins/inspect/plugin-alaw.xml2
-rw-r--r--docs/plugins/inspect/plugin-alpha.xml2
-rw-r--r--docs/plugins/inspect/plugin-alphacolor.xml2
-rw-r--r--docs/plugins/inspect/plugin-apetag.xml2
-rw-r--r--docs/plugins/inspect/plugin-audiofx.xml2
-rw-r--r--docs/plugins/inspect/plugin-audioparsers.xml2
-rw-r--r--docs/plugins/inspect/plugin-auparse.xml2
-rw-r--r--docs/plugins/inspect/plugin-autodetect.xml2
-rw-r--r--docs/plugins/inspect/plugin-avi.xml2
-rw-r--r--docs/plugins/inspect/plugin-cacasink.xml2
-rw-r--r--docs/plugins/inspect/plugin-cairo.xml2
-rw-r--r--docs/plugins/inspect/plugin-cutter.xml2
-rw-r--r--docs/plugins/inspect/plugin-debug.xml2
-rw-r--r--docs/plugins/inspect/plugin-deinterlace.xml2
-rw-r--r--docs/plugins/inspect/plugin-dtmf.xml2
-rw-r--r--docs/plugins/inspect/plugin-dv.xml2
-rw-r--r--docs/plugins/inspect/plugin-effectv.xml2
-rw-r--r--docs/plugins/inspect/plugin-equalizer.xml2
-rw-r--r--docs/plugins/inspect/plugin-flac.xml2
-rw-r--r--docs/plugins/inspect/plugin-flv.xml2
-rw-r--r--docs/plugins/inspect/plugin-flxdec.xml2
-rw-r--r--docs/plugins/inspect/plugin-gdkpixbuf.xml2
-rw-r--r--docs/plugins/inspect/plugin-goom.xml2
-rw-r--r--docs/plugins/inspect/plugin-goom2k1.xml2
-rw-r--r--docs/plugins/inspect/plugin-icydemux.xml2
-rw-r--r--docs/plugins/inspect/plugin-id3demux.xml2
-rw-r--r--docs/plugins/inspect/plugin-imagefreeze.xml2
-rw-r--r--docs/plugins/inspect/plugin-interleave.xml2
-rw-r--r--docs/plugins/inspect/plugin-isomp4.xml2
-rw-r--r--docs/plugins/inspect/plugin-jack.xml2
-rw-r--r--docs/plugins/inspect/plugin-jpeg.xml2
-rw-r--r--docs/plugins/inspect/plugin-level.xml2
-rw-r--r--docs/plugins/inspect/plugin-matroska.xml2
-rw-r--r--docs/plugins/inspect/plugin-mulaw.xml2
-rw-r--r--docs/plugins/inspect/plugin-multifile.xml2
-rw-r--r--docs/plugins/inspect/plugin-multipart.xml2
-rw-r--r--docs/plugins/inspect/plugin-navigationtest.xml2
-rw-r--r--docs/plugins/inspect/plugin-oss4.xml2
-rw-r--r--docs/plugins/inspect/plugin-ossaudio.xml2
-rw-r--r--docs/plugins/inspect/plugin-png.xml2
-rw-r--r--docs/plugins/inspect/plugin-pulseaudio.xml2
-rw-r--r--docs/plugins/inspect/plugin-replaygain.xml2
-rw-r--r--docs/plugins/inspect/plugin-rtp.xml2
-rw-r--r--docs/plugins/inspect/plugin-rtpmanager.xml2
-rw-r--r--docs/plugins/inspect/plugin-rtsp.xml2
-rw-r--r--docs/plugins/inspect/plugin-shapewipe.xml2
-rw-r--r--docs/plugins/inspect/plugin-shout2send.xml2
-rw-r--r--docs/plugins/inspect/plugin-smpte.xml2
-rw-r--r--docs/plugins/inspect/plugin-soup.xml2
-rw-r--r--docs/plugins/inspect/plugin-spectrum.xml2
-rw-r--r--docs/plugins/inspect/plugin-speex.xml2
-rw-r--r--docs/plugins/inspect/plugin-taglib.xml2
-rw-r--r--docs/plugins/inspect/plugin-udp.xml2
-rw-r--r--docs/plugins/inspect/plugin-video4linux2.xml6
-rw-r--r--docs/plugins/inspect/plugin-videobox.xml2
-rw-r--r--docs/plugins/inspect/plugin-videocrop.xml2
-rw-r--r--docs/plugins/inspect/plugin-videofilter.xml2
-rw-r--r--docs/plugins/inspect/plugin-videomixer.xml2
-rw-r--r--docs/plugins/inspect/plugin-vpx.xml2
-rw-r--r--docs/plugins/inspect/plugin-wavenc.xml2
-rw-r--r--docs/plugins/inspect/plugin-wavpack.xml2
-rw-r--r--docs/plugins/inspect/plugin-wavparse.xml2
-rw-r--r--docs/plugins/inspect/plugin-ximagesrc.xml2
-rw-r--r--docs/plugins/inspect/plugin-y4menc.xml2
-rw-r--r--ext/Makefile.in1
-rw-r--r--ext/aalib/Makefile.in1
-rw-r--r--ext/cairo/Makefile.in1
-rw-r--r--ext/dv/Makefile.in1
-rw-r--r--ext/flac/Makefile.in1
-rw-r--r--ext/flac/gstflacdec.c45
-rw-r--r--ext/gdk_pixbuf/Makefile.in1
-rw-r--r--ext/jack/Makefile.in1
-rw-r--r--ext/jpeg/Makefile.in1
-rw-r--r--ext/libcaca/Makefile.in1
-rw-r--r--ext/libpng/Makefile.in1
-rw-r--r--ext/pulse/Makefile.in1
-rw-r--r--ext/pulse/pulsedevicemonitor.c25
-rw-r--r--ext/pulse/pulsedevicemonitor.h1
-rw-r--r--ext/raw1394/Makefile.in1
-rw-r--r--ext/shout2/Makefile.in1
-rw-r--r--ext/soup/Makefile.in1
-rw-r--r--ext/soup/gstsouphttpsrc.c50
-rw-r--r--ext/speex/Makefile.in1
-rw-r--r--ext/taglib/Makefile.in1
-rw-r--r--ext/vpx/Makefile.in1
-rw-r--r--ext/vpx/gstvp8enc.c8
-rw-r--r--ext/vpx/gstvp9enc.c26
-rw-r--r--ext/wavpack/Makefile.in1
-rw-r--r--gst-plugins-good.doap10
-rw-r--r--gst-plugins-good.spec2
-rw-r--r--gst/Makefile.in1
-rw-r--r--gst/alpha/Makefile.in1
-rw-r--r--gst/apetag/Makefile.in1
-rw-r--r--gst/audiofx/Makefile.in1
-rw-r--r--gst/audiofx/audiopanoramaorc-dist.c36
-rw-r--r--gst/audioparsers/Makefile.in1
-rw-r--r--gst/audioparsers/gstflacparse.c7
-rw-r--r--gst/auparse/Makefile.in1
-rw-r--r--gst/autodetect/Makefile.in1
-rw-r--r--gst/avi/Makefile.in1
-rw-r--r--gst/cutter/Makefile.in1
-rw-r--r--gst/debugutils/Makefile.in1
-rw-r--r--gst/debugutils/tests.c3
-rw-r--r--gst/deinterlace/Makefile.in1
-rw-r--r--gst/deinterlace/tvtime-dist.c2
-rw-r--r--gst/dtmf/Makefile.in1
-rw-r--r--gst/effectv/Makefile.in1
-rw-r--r--gst/equalizer/Makefile.in1
-rw-r--r--gst/flv/Makefile.in1
-rw-r--r--gst/flv/gstflvdemux.c49
-rw-r--r--gst/flv/gstflvdemux.h1
-rw-r--r--gst/flx/Makefile.in1
-rw-r--r--gst/goom/Makefile.in1
-rw-r--r--gst/goom/tentacle3d.c5
-rw-r--r--gst/goom2k1/Makefile.in1
-rw-r--r--gst/icydemux/Makefile.in1
-rw-r--r--gst/id3demux/Makefile.in1
-rw-r--r--gst/imagefreeze/Makefile.in1
-rw-r--r--gst/interleave/Makefile.in1
-rw-r--r--gst/isomp4/Makefile.in1
-rw-r--r--gst/isomp4/gstqtmux.c1
-rw-r--r--gst/isomp4/qtdemux.c13
-rw-r--r--gst/law/Makefile.in1
-rw-r--r--gst/level/Makefile.in1
-rw-r--r--gst/matroska/Makefile.in1
-rw-r--r--gst/matroska/ebml-write.c4
-rw-r--r--gst/matroska/matroska-mux.c19
-rw-r--r--gst/matroska/matroska-read-common.c22
-rw-r--r--gst/monoscope/Makefile.in1
-rw-r--r--gst/multifile/Makefile.in1
-rw-r--r--gst/multipart/Makefile.in1
-rw-r--r--gst/replaygain/Makefile.in1
-rw-r--r--gst/rtp/Makefile.in1
-rw-r--r--gst/rtp/README16
-rw-r--r--gst/rtpmanager/Makefile.in1
-rw-r--r--gst/rtpmanager/gstrtpbin.c2
-rw-r--r--gst/rtpmanager/gstrtpjitterbuffer.c18
-rw-r--r--gst/rtpmanager/gstrtpmux.c7
-rw-r--r--gst/rtpmanager/gstrtprtxreceive.c104
-rw-r--r--gst/rtpmanager/gstrtprtxreceive.h2
-rw-r--r--gst/rtpmanager/rtpjitterbuffer.c21
-rw-r--r--gst/rtpmanager/rtpsession.c140
-rw-r--r--gst/rtpmanager/rtpsession.h3
-rw-r--r--gst/rtpmanager/rtpsource.c120
-rw-r--r--gst/rtpmanager/rtpsource.h13
-rw-r--r--gst/rtsp/Makefile.in1
-rw-r--r--gst/rtsp/gstrtspsrc.c2
-rw-r--r--gst/shapewipe/Makefile.in1
-rw-r--r--gst/smpte/Makefile.in1
-rw-r--r--gst/spectrum/Makefile.in1
-rw-r--r--gst/udp/Makefile.in1
-rw-r--r--gst/videobox/Makefile.in1
-rw-r--r--gst/videocrop/Makefile.in1
-rw-r--r--gst/videofilter/Makefile.in1
-rw-r--r--gst/videomixer/Makefile.in1
-rw-r--r--gst/videomixer/videomixerorc-dist.c206
-rw-r--r--gst/wavenc/Makefile.in1
-rw-r--r--gst/wavparse/Makefile.in1
-rw-r--r--gst/y4m/Makefile.in1
-rw-r--r--m4/Makefile.in1
-rw-r--r--pkgconfig/Makefile.in1
-rw-r--r--po/af.gmobin666 -> 666 bytes
-rw-r--r--po/af.po14
-rw-r--r--po/az.gmobin723 -> 723 bytes
-rw-r--r--po/az.po14
-rw-r--r--po/bg.gmobin11149 -> 11149 bytes
-rw-r--r--po/bg.po16
-rw-r--r--po/ca.gmobin9124 -> 9124 bytes
-rw-r--r--po/ca.po17
-rw-r--r--po/cs.gmobin11134 -> 11000 bytes
-rw-r--r--po/cs.po16
-rw-r--r--po/da.gmobin10193 -> 10088 bytes
-rw-r--r--po/da.po16
-rw-r--r--po/de.gmobin11230 -> 11119 bytes
-rw-r--r--po/de.po16
-rw-r--r--po/el.gmobin11597 -> 11597 bytes
-rw-r--r--po/el.po15
-rw-r--r--po/en_GB.gmobin671 -> 671 bytes
-rw-r--r--po/en_GB.po14
-rw-r--r--po/eo.gmobin1328 -> 1328 bytes
-rw-r--r--po/eo.po14
-rw-r--r--po/es.gmobin9369 -> 9369 bytes
-rw-r--r--po/es.po17
-rw-r--r--po/eu.gmobin7626 -> 7626 bytes
-rw-r--r--po/eu.po17
-rw-r--r--po/fi.gmobin8041 -> 8041 bytes
-rw-r--r--po/fi.po15
-rw-r--r--po/fr.gmobin9222 -> 9222 bytes
-rw-r--r--po/fr.po17
-rw-r--r--po/gl.gmobin11055 -> 10938 bytes
-rw-r--r--po/gl.po16
-rw-r--r--po/gst-plugins-good-1.0.pot126
-rw-r--r--po/hr.gmobin8525 -> 8525 bytes
-rw-r--r--po/hr.po15
-rw-r--r--po/hu.gmobin11142 -> 11028 bytes
-rw-r--r--po/hu.po16
-rw-r--r--po/id.gmobin10210 -> 10106 bytes
-rw-r--r--po/id.po16
-rw-r--r--po/it.gmobin8539 -> 8539 bytes
-rw-r--r--po/it.po16
-rw-r--r--po/ja.gmobin12193 -> 12052 bytes
-rw-r--r--po/ja.po16
-rw-r--r--po/lt.gmobin7460 -> 7460 bytes
-rw-r--r--po/lt.po15
-rw-r--r--po/lv.gmobin10633 -> 10527 bytes
-rw-r--r--po/lv.po16
-rw-r--r--po/mt.gmobin5942 -> 5942 bytes
-rw-r--r--po/mt.po16
-rw-r--r--po/nb.gmobin10145 -> 10047 bytes
-rw-r--r--po/nb.po16
-rw-r--r--po/nl.gmobin10595 -> 10492 bytes
-rw-r--r--po/nl.po16
-rw-r--r--po/or.gmobin832 -> 832 bytes
-rw-r--r--po/or.po14
-rw-r--r--po/pl.gmobin11035 -> 10921 bytes
-rw-r--r--po/pl.po16
-rw-r--r--po/pt_BR.gmobin11035 -> 10921 bytes
-rw-r--r--po/pt_BR.po16
-rw-r--r--po/ro.gmobin8001 -> 8001 bytes
-rw-r--r--po/ro.po16
-rw-r--r--po/ru.gmobin14112 -> 13965 bytes
-rw-r--r--po/ru.po16
-rw-r--r--po/sk.gmobin10893 -> 10768 bytes
-rw-r--r--po/sk.po16
-rw-r--r--po/sl.gmobin10519 -> 10412 bytes
-rw-r--r--po/sl.po16
-rw-r--r--po/sq.gmobin685 -> 685 bytes
-rw-r--r--po/sq.po14
-rw-r--r--po/sr.gmobin13866 -> 13708 bytes
-rw-r--r--po/sr.po16
-rw-r--r--po/sv.gmobin8861 -> 8861 bytes
-rw-r--r--po/sv.po15
-rw-r--r--po/tr.gmobin9917 -> 9816 bytes
-rw-r--r--po/tr.po16
-rw-r--r--po/uk.gmobin14097 -> 13920 bytes
-rw-r--r--po/uk.po16
-rw-r--r--po/vi.gmobin12220 -> 12111 bytes
-rw-r--r--po/vi.po16
-rw-r--r--po/zh_CN.gmobin6295 -> 6295 bytes
-rw-r--r--po/zh_CN.po15
-rw-r--r--po/zh_HK.gmobin1571 -> 1571 bytes
-rw-r--r--po/zh_HK.po14
-rw-r--r--po/zh_TW.gmobin1570 -> 1570 bytes
-rw-r--r--po/zh_TW.po14
-rw-r--r--sys/Makefile.in1
-rw-r--r--sys/directsound/Makefile.in1
-rw-r--r--sys/oss/Makefile.in1
-rw-r--r--sys/oss4/Makefile.in1
-rw-r--r--sys/osxaudio/Makefile.in1
-rw-r--r--sys/osxvideo/Makefile.in1
-rw-r--r--sys/sunaudio/Makefile.in1
-rw-r--r--sys/v4l2/Makefile.am6
-rw-r--r--sys/v4l2/Makefile.in34
-rw-r--r--sys/v4l2/gstv4l2.c162
-rw-r--r--sys/v4l2/gstv4l2allocator.c1396
-rw-r--r--sys/v4l2/gstv4l2allocator.h156
-rw-r--r--sys/v4l2/gstv4l2bufferpool.c1591
-rw-r--r--sys/v4l2/gstv4l2bufferpool.h54
-rw-r--r--sys/v4l2/gstv4l2devicemonitor.c32
-rw-r--r--sys/v4l2/gstv4l2object.c1290
-rw-r--r--sys/v4l2/gstv4l2object.h43
-rw-r--r--sys/v4l2/gstv4l2sink.c83
-rw-r--r--sys/v4l2/gstv4l2src.c30
-rw-r--r--sys/v4l2/gstv4l2transform.c773
-rw-r--r--sys/v4l2/gstv4l2transform.h84
-rw-r--r--sys/v4l2/gstv4l2videodec.c371
-rw-r--r--sys/v4l2/gstv4l2videodec.h10
-rw-r--r--sys/v4l2/v4l2-utils.c166
-rw-r--r--sys/v4l2/v4l2-utils.h50
-rw-r--r--sys/v4l2/v4l2_calls.c3
-rw-r--r--sys/v4l2/v4l2_calls.h4
-rw-r--r--sys/waveform/Makefile.in1
-rw-r--r--sys/ximage/Makefile.in1
-rw-r--r--tests/Makefile.in1
-rw-r--r--tests/check/Makefile.in1
-rw-r--r--tests/check/elements/rtpaux.c22
-rw-r--r--tests/check/elements/rtpcollision.c8
-rw-r--r--tests/check/elements/rtpjitterbuffer.c177
-rw-r--r--tests/check/elements/rtpmux.c4
-rw-r--r--tests/check/elements/rtprtx.c190
-rw-r--r--tests/check/elements/rtpsession.c156
-rw-r--r--tests/check/elements/shapewipe.c3
-rw-r--r--tests/check/elements/souphttpsrc.c11
-rw-r--r--tests/examples/Makefile.in1
-rw-r--r--tests/examples/audiofx/Makefile.in1
-rw-r--r--tests/examples/cairo/Makefile.in1
-rw-r--r--tests/examples/equalizer/Makefile.in1
-rw-r--r--tests/examples/jack/Makefile.in1
-rw-r--r--tests/examples/level/Makefile.in1
-rw-r--r--tests/examples/pulse/Makefile.in1
-rw-r--r--tests/examples/rtp/Makefile.in1
-rw-r--r--tests/examples/shapewipe/Makefile.in1
-rw-r--r--tests/examples/spectrum/Makefile.in1
-rw-r--r--tests/examples/v4l2/Makefile.in1
-rw-r--r--tests/files/Makefile.in1
-rw-r--r--tests/icles/Makefile.in1
-rw-r--r--win32/common/config.h8
380 files changed, 7957 insertions, 2622 deletions
diff --git a/ChangeLog b/ChangeLog
index 136ab103..f9997d84 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,9 +1,1265 @@
+=== release 1.3.2 ===
+
+2014-05-21 Sebastian Dröge <slomo@coaxion.net>
+
+ * configure.ac:
+ releasing 1.3.2
+
+2014-05-21 10:51:10 +0200 Sebastian Dröge <sebastian@centricular.com>
+
+ * common:
+ Automatic update of common submodule
+ From 211fa5f to 1f5d3c3
+
+2014-05-20 08:23:06 +0200 Edward Hervey <edward@collabora.com>
+
+ * ext/vpx/gstvp8enc.c:
+ vp8enc: Don't dereference NULL variable
+ CID #1139838
+
+2014-05-20 08:20:42 +0200 Edward Hervey <edward@collabora.com>
+
+ * ext/vpx/gstvp9enc.c:
+ vp9enc: Don't dereference NULL checks
+ CID #1197703
+
+2014-05-19 11:26:46 +0200 Sebastian Dröge <sebastian@centricular.com>
+
+ * sys/v4l2/gstv4l2bufferpool.c:
+ v4l2bufferpool: Explicitly cast enum "subtype" to its "supertype"
+ gstv4l2bufferpool.c:608:18: error: implicit conversion from enumeration type
+ 'enum _GstV4l2BufferPoolAcquireFlags' to different enumeration type
+ 'GstBufferPoolAcquireFlags' [-Werror,-Wenum-conversion]
+ params.flags = GST_V4L2_POOL_ACQUIRE_FLAG_RESURECT;
+ ~ ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+2014-05-19 11:24:06 +0200 Sebastian Dröge <sebastian@centricular.com>
+
+ * gst/goom/tentacle3d.c:
+ goom: Use fabs() instead of abs() to calculate the floating point absolute value
+ tentacle3d.c:268:7: error: using integer absolute value function 'abs' when
+ argument is of floating point type [-Werror,-Wabsolute-value]
+ if (abs (tmp - fx_data->rot) > abs (tmp - (fx_data->rot + 2.0 * G_PI))) {
+ ^
+
+2014-05-19 11:21:36 +0200 Sebastian Dröge <sebastian@centricular.com>
+
+ * gst/debugutils/tests.c:
+ debugutils: Properly calculate the difference with unsigned types
+ tests.c:161:16: error: taking the absolute value of unsigned type
+ 'unsigned long' has no effect [-Werror,-Wabsolute-value]
+ t->diff += labs (GST_BUFFER_TIMESTAMP (buffer) - t->expected);
+
+2014-05-16 17:46:30 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2videodec.c:
+ v4l2videodec: Handle flush while in start_streaming
+ We need to handle the case where a flush occure while the streaming
+ thread is being brought up. In this case, the flushing state of the poll
+ object is cleared. To solve this, we simply set the capture poll to flushing
+ again, this way we know the thread will exit. The decoder streamlock
+ is used to synchronize with handle frame.
+
+2014-05-16 16:44:37 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2allocator.c:
+ v4l2allocator: Don't trace twice the same message
+
+2014-05-15 11:25:50 -0700 Aleix Conchillo Flaqué <aleix@oblong.com>
+
+ * gst/rtsp/gstrtspsrc.c:
+ rtspsrc: always use a random ssrc for the internal session
+ Use a random SSRC different than 0 for the internal session SSRC.
+ https://bugzilla.gnome.org/show_bug.cgi?id=730212
+
+2014-05-16 16:52:25 +0200 Wim Taymans <wtaymans@redhat.com>
+
+ * gst/rtpmanager/rtpsession.c:
+ rtpsession: update last_activity when sending RTP
+ Also update last_activity when doing something with the internal
+ source to make sure don't timeout early.
+ See https://bugzilla.gnome.org/show_bug.cgi?id=730217
+
+2014-05-15 18:08:53 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2object.c:
+ * sys/v4l2/gstv4l2object.h:
+ * sys/v4l2/gstv4l2transform.c:
+ * sys/v4l2/gstv4l2videodec.c:
+ v4l2: Cleanup M2M properties
+ M2M devices were sharing the same properties as src and sink. Most of
+ these made no sense. This patch reduces the number of propeties and
+ makes io-mode clearer by having capture-io-mode and output-io-mode. This
+ also accidently fixed a bug in gstv4l2transform io-mode code, where the
+ capture io-mode could not be set.
+ https://bugzilla.gnome.org/show_bug.cgi?id=729591
+
+2014-05-15 17:39:39 +0200 Benjamin Gaignard <benjamin.gaignard@linaro.org>
+
+ * sys/v4l2/gstv4l2bufferpool.c:
+ v4l2bufferpool: Update pool limit with hardware requiremenst
+ If the driver need more buffers than requested by the config,
+ update the pool min/max values. The minimum value for the pool
+ could be provided either by the driver or by the pool. This is
+ best effort for drivers that don't support
+ CID V4L2_CID_MIN_BUFFERS_FOR_CAPTURE.
+ https://bugzilla.gnome.org/show_bug.cgi?id=730200
+
+2014-05-15 10:44:29 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2videodec.c:
+ v4l2videodec: Handle start_streaming error
+ https://bugzilla.gnome.org/show_bug.cgi?id=730207
+
+2014-05-15 10:39:40 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2videodec.c:
+ v4l2videodec: Print the flow return causing the loop to leave
+ https://bugzilla.gnome.org/show_bug.cgi?id=730207
+
+2014-05-15 10:31:40 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2videodec.c:
+ v4l2videodec: Don't lock the decoder when stopping task
+ That src pad task may need to take the lock when being pulled
+ down. takeing that lock can lead to a deadlock.
+ https://bugzilla.gnome.org/show_bug.cgi?id=730207
+
+2014-05-14 17:18:52 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2transform.c:
+ v4l2transform: Don't leak pool if activation failed
+ https://bugzilla.gnome.org/show_bug.cgi?id=730207
+
+2014-05-14 17:18:35 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2bufferpool.c:
+ * sys/v4l2/gstv4l2bufferpool.h:
+ * sys/v4l2/gstv4l2transform.c:
+ * sys/v4l2/gstv4l2videodec.c:
+ v4l2: Split flush in start/stop_streaming
+ This allow calling start streaming later for capture device. Currently it breaks
+ in dmabuf-import because downstream is holding a buffer that will only be
+ released after stream-start.
+ https://bugzilla.gnome.org/show_bug.cgi?id=730207
+
+2014-05-14 15:12:26 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2transform.c:
+ v4l2transform: Flush buffer pools on flush stop
+ https://bugzilla.gnome.org/show_bug.cgi?id=730207
+
+2014-05-14 13:28:31 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2allocator.c:
+ v4l2allocator: Fix use of atomic active marker
+ https://bugzilla.gnome.org/show_bug.cgi?id=730207
+
+2014-05-14 13:05:42 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2bufferpool.c:
+ v4l2bufferpool: Don't deactivate otherpool
+ We should not stop the otherpool unless we also stop our own
+ pool, otherwise it will never get restarted.
+ https://bugzilla.gnome.org/show_bug.cgi?id=730207
+
+2014-05-14 12:33:58 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2bufferpool.c:
+ v4l2bufferpool: Also update num_buffers for import cases
+ https://bugzilla.gnome.org/show_bug.cgi?id=730207
+
+2014-05-14 13:42:25 -0700 Aleix Conchillo Flaqué <aleix@oblong.com>
+
+ * gst/rtpmanager/gstrtpbin.c:
+ rtpbin: update rtp encoder/decoder docs
+ Use %u in RTP encoder/decoder pads to match other rtpbin pads.
+ https://bugzilla.gnome.org/show_bug.cgi?id=730146
+
+2013-12-27 11:55:18 +0200 George Kiagiadakis <george.kiagiadakis@collabora.com>
+
+ * tests/check/elements/rtpsession.c:
+ tests/check: rtpsession: test internal sources timing out
+
+2013-12-26 17:30:42 +0200 George Kiagiadakis <george.kiagiadakis@collabora.com>
+
+ * gst/rtpmanager/rtpsession.c:
+ rtpsession: remove unused if branch
+ 1) sources that have sent BYE in the past cannot be senders, since
+ they would have timed out to being receivers in the meantime...
+ 2) sources that have sent BYE are now being removed earlier inside
+ this function
+
+2013-12-26 17:29:42 +0200 George Kiagiadakis <george.kiagiadakis@collabora.com>
+
+ * gst/rtpmanager/rtpsession.c:
+ rtpsession: cleanup sources that have sent BYE
+
+2013-12-26 17:24:51 +0200 George Kiagiadakis <george.kiagiadakis@collabora.com>
+
+ * gst/rtpmanager/rtpsession.c:
+ rtpsession: unify nested if clauses
+
+2013-12-26 17:21:44 +0200 George Kiagiadakis <george.kiagiadakis@collabora.com>
+
+ * gst/rtpmanager/rtpsession.c:
+ rtpsession: timeout internal sources that are inactive for a long time and send BYE
+
+2014-05-13 12:25:04 -0700 Aleix Conchillo Flaqué <aleix@oblong.com>
+
+ * gst/rtpmanager/rtpjitterbuffer.c:
+ rtpjitterbuffer: don't stop looping if event found in the queue
+ If we are inserting a packet into the jitter queue we need to keep
+ looping through the items until the right position is found. Currently,
+ the code stops as soon as an event is found in the queue.
+ Regarding events, we should only move packets before an event if there
+ is another packet before the event that has a larger seqnum.
+ Fixes https://bugzilla.gnome.org/show_bug.cgi?id=730078
+
+2014-04-17 13:04:00 +0000 Adrien SCH <adrien.schwartzentruber@gmail.com>
+
+ * gst/matroska/matroska-mux.c:
+ matroskamux: fix the memory leak of language attribute
+ https://bugzilla.gnome.org/show_bug.cgi?id=728418
+
+2014-05-13 13:44:20 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2object.c:
+ v4l2object: Fix regression in offset extrapolation
+ When extrapolating the offset, we need to use the extrapolate
+ stride rather then the base stride. This should fix support for format
+ with more then two planes (I420, Y42B, etc).
+
+2014-05-12 18:03:18 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2bufferpool.c:
+ * sys/v4l2/gstv4l2bufferpool.h:
+ v4l2bufferpool: Use default VideoInfo for frame operation
+ When doing frame operation, we need to use the default VideoInfo
+ and let the frame API read the video meta in order to get the stride
+ and offset right. Currently we where using the specialized VideoInfo
+ which reflects what the HW is setup to.
+
+2014-05-12 17:23:19 +0100 Tim-Philipp Müller <tim@centricular.com>
+
+ * sys/v4l2/gstv4l2object.c:
+ v4l2src: minor GValue handling optimisation in probing code
+
+2014-05-12 17:20:14 +0100 Tim-Philipp Müller <tim@centricular.com>
+
+ * sys/v4l2/gstv4l2object.c:
+ v4l2src: avoid lists with one single framerate in probed caps
+ Simplify framerate field if possible, so we don't end up with
+ e.g. framerate = (fraction) { 30/1 }. Maybe the helper function
+ should be moved to core, but we can do this later.
+
+2014-05-12 16:56:35 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/isomp4/qtdemux.c:
+ qtdemux: Fix leak of palette_data in error cases
+ CID #1212151
+
+2014-05-12 16:53:32 +0200 Edward Hervey <bilboed@bilboed.com>
+
+ * gst/isomp4/gstqtmux.c:
+ qtmux: Free node_header in error cases
+ CID #1212134
+
+2014-05-12 13:46:01 +0200 Edward Hervey <edward@collabora.com>
+
+ * gst/flv/gstflvdemux.c:
+ flvdemux: Don't use WARNING for not-linked flow return
+ Pollutes debug logs for no reason. It's only an error if all pads
+ return not-linked
+
+2014-05-12 13:45:06 +0200 Edward Hervey <edward@collabora.com>
+
+ * gst/flv/gstflvdemux.c:
+ * gst/flv/gstflvdemux.h:
+ flvdemux: Skip unknown tags in push-mode
+ We add a new mode (SKIP) in push-mode to skip tags that we don't known about
+ Partially fixes https://bugzilla.gnome.org/show_bug.cgi?id=670712
+
+2014-05-10 09:14:33 +0200 Sebastian Dröge <sebastian@centricular.com>
+
+ * ext/flac/gstflacdec.c:
+ flacdec: Add support for variable block size files and remove dead code
+ This dead code wasn't used since the 1.0 port and would need to
+ be modified heavily for variable block size support.
+ https://bugzilla.gnome.org/show_bug.cgi?id=729894
+
+2014-05-09 12:14:23 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.co.uk>
+
+ * sys/v4l2/gstv4l2transform.c:
+ v4l2transform: Fix NULL check copy paste error
+ CID 1212129
+
+2014-05-09 12:11:54 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.co.uk>
+
+ * sys/v4l2/gstv4l2transform.c:
+ v4l2transform: Fix potential deadlock due to missing break
+ CID 1212131
+
+2014-05-09 18:01:28 +0200 Wim Taymans <wtaymans@redhat.com>
+
+ * gst/rtpmanager/gstrtpjitterbuffer.c:
+ * tests/check/elements/rtpjitterbuffer.c:
+ rtpjitterbuffer: increment accepted packets after loss
+ When we detect a lost packet, expect packets with higher
+ seqnum on the input.
+ Also update the unit test.
+ Fixes https://bugzilla.gnome.org/show_bug.cgi?id=729524
+
+2014-05-04 11:12:54 -0600 Jason Litzinger <jlitzingerdev@gmail.com>
+
+ * gst/rtpmanager/gstrtpjitterbuffer.c:
+ * tests/check/elements/rtpjitterbuffer.c:
+ Add new test case.
+
+2014-05-09 16:14:21 +0200 Wim Taymans <wtaymans@redhat.com>
+
+ * tests/check/elements/shapewipe.c:
+ shapewipe: no need to activate pads
+ Activation will happen in the state change
+
+2014-05-09 12:10:04 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.co.uk>
+
+ * sys/v4l2/gstv4l2object.c:
+ v4l2object: Don't leak config structure
+ this fixes a leak of the config structure and take care of making sure
+ caps can't reach ref 0 before we are done doing our check.
+ CID 1212144
+
+2014-05-09 12:08:11 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.co.uk>
+
+ * sys/v4l2/gstv4l2object.c:
+ v4l2object: Remove uneeded cast for code clarity
+
+2014-05-09 11:56:52 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.co.uk>
+
+ * sys/v4l2/gstv4l2bufferpool.c:
+ v4l2pool: Fix leak of config structure in error case
+ CIDs 1212167 and 1212167
+
+2014-05-09 11:51:26 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.co.uk>
+
+ * sys/v4l2/gstv4l2object.c:
+ v4l2object: Fix use of unitilized pool pointer
+ CID #1212173
+
+2014-05-09 16:48:58 +0200 Eric Trousset <etrousset@awox.com>
+
+ * gst/isomp4/qtdemux.c:
+ qtdemux: don't respond to a position query in BYTE format with a TIME position
+ https://bugzilla.gnome.org/show_bug.cgi?id=729553
+
+2014-05-09 14:22:42 +0100 Tim-Philipp Müller <tim@centricular.com>
+
+ * gst/matroska/matroska-read-common.c:
+ matroskademux: don't leak doctype string in error code path
+ CID 1212145.
+
+2014-05-06 13:37:47 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.co.uk>
+
+ * sys/v4l2/gstv4l2object.c:
+ v4l2object: Readback pool config if used within the baseclass
+
+2014-05-06 12:58:59 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.co.uk>
+
+ * sys/v4l2/gstv4l2bufferpool.c:
+ * sys/v4l2/gstv4l2bufferpool.h:
+ * sys/v4l2/gstv4l2object.c:
+ * sys/v4l2/gstv4l2object.h:
+ * sys/v4l2/gstv4l2src.c:
+ * sys/v4l2/gstv4l2transform.c:
+ * sys/v4l2/gstv4l2videodec.c:
+ v4l2: Replace miss-use of crop meta in favour of proper offset
+ This moves away from copying information and store everything inside
+ the GstVideoInfo structure. The alignement exposed by v4l2 api
+ is now handled using proper offset.
+
+2014-05-06 12:55:30 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.co.uk>
+
+ * sys/v4l2/gstv4l2object.h:
+ v4l2object: Style fix
+
+2014-05-05 12:38:33 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.co.uk>
+
+ * sys/v4l2/gstv4l2allocator.c:
+ v4l2allocator: Reset imported buffer size with expected size
+ This ensure that the buffer pool won't always discard buffer with these
+ memory when they are released.
+
+2014-05-05 12:37:43 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.co.uk>
+
+ * sys/v4l2/gstv4l2allocator.c:
+ v4l2allocator: Reset flushed group
+ This ensure that a flushed group memory are the same size as when they
+ where originally allocated / imported.
+
+2014-05-05 12:07:31 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.co.uk>
+
+ * sys/v4l2/gstv4l2bufferpool.c:
+ * sys/v4l2/gstv4l2bufferpool.h:
+ v4l2bufferpool: Get number of allocated buffers from allocator
+ The value of num_allocated buffer would get confused when
+ buffer are being discarded.
+
+2014-05-05 12:06:44 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.co.uk>
+
+ * sys/v4l2/gstv4l2allocator.c:
+ * sys/v4l2/gstv4l2allocator.h:
+ v4l2allocator: Add a method to read number of allocated group
+
+2014-05-04 20:23:42 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.co.uk>
+
+ * sys/v4l2/gstv4l2bufferpool.c:
+ v4l2bufferpool: Improve debugging
+
+2014-05-04 19:51:48 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.co.uk>
+
+ * sys/v4l2/gstv4l2bufferpool.c:
+ * sys/v4l2/gstv4l2bufferpool.h:
+ v4l2bufferpool: Ensure we don't re-enqueue buffer during flush
+
+2014-05-04 19:13:37 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.co.uk>
+
+ * sys/v4l2/gstv4l2transform.c:
+ v4l2transform: Initilialize debug category
+
+2014-05-04 16:11:09 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.co.uk>
+
+ * sys/v4l2/gstv4l2allocator.c:
+ v4l2allocator: Fix libv4l2 support
+ Need to include config.h, otherwise we endup directly using the
+ ioct/mmap/munmap calls and need to vall v4l2_munmap.
+
+2014-05-01 13:04:08 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2allocator.c:
+ v4l2allocator: Set the flags on the object
+ We where not setting the probed flags on the allocator, which mean even if
+ CREATE_BUFS was supported on some driver, it would endup being ignored.
+
+2014-04-29 16:49:52 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2bufferpool.c:
+ v4l2bufferpool: Re-enqueue buffer at stream start
+
+2014-04-29 16:06:00 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2allocator.c:
+ v4l2allocator: There is not group on error
+
+2014-04-29 14:56:31 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2transform.c:
+ v4l2transform: Handle FLUSH_STOP event
+
+2014-04-29 13:05:41 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2bufferpool.c:
+ * sys/v4l2/gstv4l2bufferpool.h:
+ * sys/v4l2/gstv4l2sink.c:
+ * sys/v4l2/gstv4l2src.c:
+ * sys/v4l2/gstv4l2videodec.c:
+ v4l2bufferpool: Acquire cannot return a buffer from another pool
+ Return a buffer from an otherpool has unwanted side effects that lead to leaks and
+ prevents deactivating the pool. Instead, we change the _process() API so it can
+ replace the internal buffer with the buffer from the downstream pool. This implied
+ moving from _fill() to _create() method in the src.
+
+2014-04-29 13:00:32 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2bufferpool.c:
+ v4l2bufferpool: Remove unreached acquire code
+ The acquire is done in _prepare now.
+
+2014-04-29 12:57:08 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2bufferpool.c:
+ v4l2bufferpool: Sanetize buffer refount handling
+ Buffer refcounting is a bit hard, because of the duality between CAPTURE and
+ OUTPUT mode. In the long term, we should consider having two seperate pool
+ instead of this mess. At least state should be better kept this way.
+
+2014-04-29 12:48:04 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2transform.c:
+ v4l2transform: Add more traces
+
+2014-04-28 08:48:26 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2allocator.c:
+ * sys/v4l2/gstv4l2allocator.h:
+ v4l2-allocator: Add S to REQBUFS/CREATE_BUFS enum
+ All enum that has REQBUFS and CREATE_BUFS where missing S, which was
+ confusing since they are supposed to match with associcated ioctl name. This
+ also fixes the yet unused CAN_REQUEST flag check.
+
+2014-04-18 17:51:07 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2transform.c:
+ v4l2transform: Enabled QoS
+
+2014-04-18 17:02:50 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2allocator.c:
+ * sys/v4l2/gstv4l2allocator.h:
+ * sys/v4l2/gstv4l2bufferpool.c:
+ v4l2: Fixup USERPTR/DMABUF capture support
+
+2014-04-18 14:45:00 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2object.c:
+ v4l2object: Improve selecton of min/max in decide allocation
+
+2014-04-18 13:09:00 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2bufferpool.c:
+ v4l2bufferpool: Update config if meta is missing
+ Rather then hard failure, we should update the config with the meta option we
+ need and return false.
+
+2014-04-11 17:10:11 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2allocator.c:
+ * sys/v4l2/gstv4l2allocator.h:
+ * sys/v4l2/gstv4l2bufferpool.c:
+ * sys/v4l2/gstv4l2bufferpool.h:
+ * sys/v4l2/gstv4l2object.c:
+ * sys/v4l2/gstv4l2object.h:
+ v4l2: Add DMABUF and USERPTR importation
+
+2014-04-17 21:45:58 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2allocator.c:
+ v4l2allocator: Valid FD are bigger or equal to zero
+
+2014-04-16 17:04:42 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2object.c:
+ v4l2object: Don't leak downstream pool in propose_allocation
+ parse_nth_allocation_pool() give a ref on the pool, we need to unref it
+ when done.
+
+2014-04-14 12:19:39 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2bufferpool.c:
+ * sys/v4l2/gstv4l2object.c:
+ * sys/v4l2/gstv4l2object.h:
+ v4l2: Introduce DMABUF_IMPORT IO mode
+
+2014-04-10 16:26:34 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2allocator.c:
+ * sys/v4l2/gstv4l2allocator.h:
+ * sys/v4l2/gstv4l2bufferpool.c:
+ v4l2: Add dmabuf export support
+ This can be enabled sing io-mode=dmabuf. This will enabled mmap base
+ drivers to export the buffers as dmabuf.
+
+2014-04-16 15:51:03 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2allocator.c:
+ v4l2allocator: Guaranty queued state integrety
+ Because of the buf in videobuf2, dqbuf may leave the DONE flag being,
+ which would implied that the buffer is queued. As this has been broken
+ for 4 years, simply guaranty the state flags integrity when doing
+ qbuf/dqbuf.
+ See https://patchwork.linuxtv.org/patch/23641/
+
+2014-04-15 17:31:42 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2transform.c:
+ v4l2transform: Implement open/close
+
+2014-04-15 16:43:41 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2transform.c:
+ v4l2transform: Ensure output pool is configured
+
+2014-04-15 16:43:15 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2transform.c:
+ * sys/v4l2/gstv4l2transform.h:
+ v4l2transform: Check if caps have changes before asserting
+ In set_caps, now checks if caps actually changed and succeed if they didn't
+ change.
+
+2014-04-15 16:41:46 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2videodec.c:
+ v4l2videodec: Ensure pool is configured
+
+2014-04-08 18:54:09 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2object.c:
+ v4l2object: Always set a size when deciding allocation
+
+2014-04-08 18:20:25 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2object.c:
+ v4l2object: Improved decide allocation
+ Improve decide allocation so it properly configure both local and downstream
+ buffer pools. Also read back the pool config if it was changed to to driver
+ limitations.
+
+2014-04-15 13:30:02 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2bufferpool.c:
+ v4l2bufferpool: Do not pre-configure the pool
+ Pre-configuring the pool is error prone, since it may hide a configuration failure and
+ endup with a pool that is not configured the way it should (e.g. no video meta, wrong
+ queue size, etc.)
+
+2014-04-15 13:23:33 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2bufferpool.c:
+ v4l2bufferpool: Preserve downstream minimum even in RW
+
+2014-04-15 13:20:12 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2bufferpool.c:
+ * sys/v4l2/gstv4l2bufferpool.h:
+ v4l2bufferpool: Turn cropmeta into a custom option
+ Turn crop meta into a custom option and make sure it's there is needed.
+
+2014-04-09 12:53:19 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2object.c:
+ v4l2bufferpool: Early catch short allocation
+ Catch short allocation after saving the format. This is not a catch all, but should catch
+ most of the miss-behaving drivers when doing S_FMT/G_FMT and avoid potential crash.
+
+2014-04-04 22:46:40 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2bufferpool.c:
+ * sys/v4l2/gstv4l2bufferpool.h:
+ v4l2bufferpool: Port to use GstV4l2Allocator
+
+2014-04-04 22:35:48 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/Makefile.am:
+ * sys/v4l2/gstv4l2allocator.c:
+ * sys/v4l2/gstv4l2allocator.h:
+ * sys/v4l2/v4l2_calls.h:
+ Implement V4l2 Allocator
+ This goal of this allocator is mainly to allow tracking the memory.
+ Currently, when a buffer memory has been modified, the buffer and it's
+ memory is disposed and lost until the stream is restarted.
+
+2014-04-16 16:35:49 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2object.c:
+ v4l2object: Don't advertise crop meta
+ Currently we advertise crop meta, but not element handle support this meta.
+
+2014-04-08 18:18:57 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2object.c:
+ v4l2object: Setup pool already send element error
+
+2014-04-08 18:17:31 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2object.c:
+ v4l2object: Workaround decoder that set num_planes to 0 in the format
+ Some well known decoder wrongly set num_planes to 0 in their format instead of
+ one. In this case we would endup with no size when deciding buffer allocation.
+
+2014-04-08 17:34:19 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2object.c:
+ v4l2object: Ensure size before configuring the pool
+
+2014-04-04 22:38:05 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2object.h:
+ v4l2object: Set minimum buffers to 2
+ All the element requires at least two buffers. This is not used for RW mode.
+
+2014-04-04 22:37:14 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2object.h:
+ v4l2object: Remove unused MAX_BUFFERS define
+
+2014-04-04 22:36:37 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2object.c:
+ v4l2object: Don't hardcode min/max use default instead
+
+2014-04-10 17:49:41 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2transform.c:
+ v4l2transform: Install PROP_CAPTURE_IO_MODE with right ID
+
+2014-04-08 18:54:50 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2transform.c:
+ v4l2transform: decide_allocation returns a boolean
+
+2014-04-10 17:49:29 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2videodec.c:
+ v4l2videodec: Install PROP_CAPTURE_IO_MODE with right ID
+
+2014-03-27 13:21:25 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2transform.c:
+ v4l2transform: Add propose_allocation
+ This should remove 1 copy between the decoder and the transform.
+
+2014-03-27 13:20:53 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2object.c:
+ * sys/v4l2/gstv4l2object.h:
+ * sys/v4l2/gstv4l2sink.c:
+ v4l2: Move propose allocation to v4l2object
+
+2014-03-20 17:26:05 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2transform.c:
+ v4l2transform: Fixup caps query
+
+2014-03-20 15:31:22 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2object.c:
+ * sys/v4l2/gstv4l2object.h:
+ * sys/v4l2/gstv4l2transform.c:
+ v4l2transform: Setup cropping if needed
+
+2014-03-19 17:25:16 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2.c:
+ v4l2transform: Expose BGRA and ARGB formats
+
+2014-03-18 17:33:38 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2transform.c:
+ v4l2transform: Ensure output pool is activated
+ That pool may be different then the internal pool.
+
+2014-03-16 19:11:16 +0100 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2transform.c:
+ v4l2transform: Ensure internal buffer pools actication
+
+2014-03-16 11:36:19 +0100 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2transform.c:
+ v4l2transform: Move subinstance subclass init near other init
+
+2014-03-15 18:56:51 +0100 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2transform.c:
+ v4l2transform: Stop stream before closing the devices.
+
+2014-03-15 16:53:54 +0000 Víctor Manuel Jáquez Leal <vjaquez@igalia.com>
+
+ * sys/v4l2/gstv4l2transform.c:
+ v4l2transform: copy metdata
+
+2014-03-04 18:31:27 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/Makefile.am:
+ * sys/v4l2/gstv4l2.c:
+ * sys/v4l2/gstv4l2object.c:
+ * sys/v4l2/gstv4l2transform.c:
+ * sys/v4l2/gstv4l2transform.h:
+ Implement GstV4l2Transform
+ Implement a v4l2 element that wraps HW video converters.
+
+2014-03-27 18:41:07 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2bufferpool.c:
+ * sys/v4l2/gstv4l2object.c:
+ * sys/v4l2/gstv4l2object.h:
+ v4l2: Probe for CREATE_BUFS in order to correctly set pool min/max
+ In order to correctly set the pool min/max, we need to probe for CREATE_BUFS
+ ioctl. This can be done as soon as the format has been negotiated using a
+ count of 0.
+
+2014-03-25 15:21:03 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2bufferpool.c:
+ * sys/v4l2/gstv4l2videodec.c:
+ v4l2: Move capture eos handling in _process()
+ Now that we might be copying out buffer (e.g. downstream don't support video
+ meta bug we need it) we need to move the EOS handling inside the process
+ method.
+
+2014-03-25 10:49:39 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2object.c:
+ v4l2object: Fix support for planar format in 1 v4l2 mplane
+ So far we where only setting saving the first plane stride in the meta. This was
+ leading to wrong values in GstVideoMeta.
+
+2014-03-19 17:52:08 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2videodec.c:
+ v4l2videodec: Cleanly fail if set_format is never called
+
+2014-03-19 17:00:56 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2object.c:
+ * sys/v4l2/gstv4l2object.h:
+ * sys/v4l2/v4l2_calls.c:
+ v4l2: Expose RGB32 formats with and without alpha
+ As soon a the alpha component can be set, we can expose the RGB32 and BGR32
+ format as ARGB and BGRA as long we can deterministically set the alpha padding
+ value.
+
+2014-03-18 15:49:49 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2bufferpool.c:
+ * sys/v4l2/gstv4l2object.c:
+ v4l2: Correctly check if video meta is needed
+ Correctly check if video meta is needed. In buffer pool, trust need_video_meta
+ flag in order to decide if configuration should succeed.
+
+2014-03-18 15:45:18 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2object.c:
+ v4l2object: Fix tiled stride request
+ Fix stride request for tiled format and improve logging.
+
+2014-03-18 11:53:57 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2bufferpool.c:
+ * sys/v4l2/gstv4l2object.c:
+ v4l2object: Ensure video and crop meta are enabled if needed
+ In certain cases we cannot live without video meta and/or crop meta
+ being enabled in our internal buffer pool. Ensure this is always the case,
+ regardless of having support for allocation query.
+
+2014-03-16 18:39:32 +0100 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2videodec.c:
+ v4l2videodec: Ensure internal pool are activated
+
+2014-03-16 17:01:10 +0100 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2videodec.c:
+ v4l2videodec: Check that pool where allocated before flushing them
+ Upon error, the pools might not have been allocated yet, hence we should not
+ try and flush them (even though we still want to make sure the processing thread
+ is fully stopped).
+
+2014-03-16 16:55:43 +0100 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2bufferpool.c:
+ * sys/v4l2/gstv4l2sink.c:
+ v4l2bufferpool: Enforce activation outside of process
+ Enforce pool being activate from before calling pool process. This should
+ help catching basic errors in the usage of buffer pool.
+
+2014-03-16 12:44:14 +0100 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2object.c:
+ v4l2object: don't use own pool if downstream don't support video meta
+
+2014-03-14 00:31:32 +0100 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2bufferpool.c:
+ v4l2bufferpool: Use obj->n_v4l2_planes for correct number of planes
+ Buffer pool was guessing wrongly the number of planes rather
+ then reading the value from obj->n_v4l2_planes. This was causing
+ format YU12 (I420) to fail upon check.
+
+2014-03-07 16:39:29 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2object.c:
+ v4l2object: Fix handling of contiuous vs non-contiguous support
+ The complex mechanic to try and choose the right thing did not work. Instead,
+ simply probe the non-contiguous format first and then the contiguous one.
+ This is in fact very low overhead, as there is a relatively small number of
+ pixel format supported by each devices.
+
+2014-04-15 15:07:23 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2bufferpool.c:
+ * sys/v4l2/gstv4l2bufferpool.h:
+ * sys/v4l2/gstv4l2object.c:
+ * sys/v4l2/gstv4l2object.h:
+ * sys/v4l2/gstv4l2videodec.h:
+ v4l2: Add initial support for alignment and cropping
+
+2014-03-13 19:24:51 +0100 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2object.c:
+ * sys/v4l2/gstv4l2object.h:
+ * sys/v4l2/gstv4l2videodec.c:
+ v4l2object: Rename setup_format() method into acquire_format()
+ The setup_format() was confusing since it does not set anything, in fact
+ it reads the setup from the driver and save it.
+
+2014-03-13 18:21:41 +0100 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2object.c:
+ v4l2object: Move type declaration to the top
+
+2014-03-12 18:07:38 +0100 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2videodec.c:
+ v4l2videodec: Protect NULL pool while going to READY
+ When the pipeline fails early, the pool might be unset before the processing
+ thread has run once. Add protection against that.
+
+2014-03-12 18:01:09 +0100 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2object.c:
+ v4l2object: Fail cleanly if pixel format is unkown or not raw video
+ Certain decoder has been found to not choose a format automatically. Running
+ v4l2videodec on these would assert. This patch will make it fail cleanly
+ instead.
+
+2014-03-12 17:56:18 +0100 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2videodec.c:
+ v4l2videodec: Clear the input state pointer after unref
+ If caps are set again, we have a risk od returning from set_format with a
+ input_state pointing to dead memory. Clearing the pointer after unref fix
+ this issue.
+
+2014-03-12 17:11:16 +0100 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2videodec.c:
+ v4l2videodec: handle stop being called without flush
+ Uppon certain downstream error, stop() is called without a flush(). This mean that
+ the streaming thread may still be running even though unlock has been called.
+ Now calling flush to reset the decoder state if we are processing.
+
+2014-03-06 18:13:14 -0500 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2videodec.c:
+ v4l2videodec: Default to template in caps query
+
+2014-03-11 14:23:32 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2videodec.c:
+ v4l2videodec: Ensure processing thread has stopped when draining
+
+2014-03-11 14:01:27 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2videodec.c:
+ v4l2videodec: Don't drain if processing thread is inactive
+
+2014-05-08 09:49:24 +0200 Sebastian Dröge <sebastian@centricular.com>
+
+ * ext/soup/gstsouphttpsrc.c:
+ souphttpsrc: Clean up all pending operations from libsoup before unreffing our context
+ When we cancel connection attempts and similar things, there are still
+ some operations pending on our main context from the GCancellables. We
+ should let them all run before unreffing our context, otherwise we leak
+ file descriptors.
+ Unfortunately this requires libsoup 2.47.0 or newer as earlier versions
+ steal our main context from us and we can't use it for cleanup later
+ without assertions and funny crashes.
+ Based on a patch by Dmitry Shatrov <shatrov@gmail.com>.
+ https://bugzilla.gnome.org/show_bug.cgi?id=663944
+
+2014-05-07 15:49:39 +0100 Tim-Philipp Müller <tim@centricular.com>
+
+ * tests/check/elements/souphttpsrc.c:
+ tests: fix compilation of souphttpsrc test for libsoup 2.40 for real
+ https://bugzilla.gnome.org/show_bug.cgi?id=727329
+
+2014-05-07 13:23:50 +0100 Tim-Philipp Müller <tim@centricular.com>
+
+ * tests/check/elements/souphttpsrc.c:
+ tests: fix compilation of souphttpsrc test for libsoup 2.40
+ SOUP_CHECK_VERSION was only added in 2.41, but we only
+ depend on 2.40.
+ https://bugzilla.gnome.org/show_bug.cgi?id=727329
+
+2014-05-07 00:58:15 +0100 Tim-Philipp Müller <tim@centricular.com>
+
+ * gst/audioparsers/gstflacparse.c:
+ flacparse: skip PICTURE headers without any image data
+ Fixes warning if the image length is 0.
+
+2014-05-06 09:22:18 +0000 Руслан Ижбулатов <lrn1986@gmail.com>
+
+ * configure.ac:
+ configure: use X11 detection macro from common
+ https://bugzilla.gnome.org/show_bug.cgi?id=729621
+
+2014-04-30 11:13:12 +0200 Guillaume Desmottes <guillaume.desmottes@collabora.co.uk>
+
+ * gst/rtp/README:
+ rtp/README: update pipelines to work with 1.0
+ - Use gst-libav encoders/decoders instead of gst-ffmpeg
+ - gstrtpjitterbuffer -> rtpjitterbuffer
+ - gst-launch-0.10 -> gst-launch-1.0
+ - Add 'videoconvert' element
+ - xvimagesink -> autovideosink
+ https://bugzilla.gnome.org/show_bug.cgi?id=729247
+
+2014-05-05 14:41:05 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+ * gst/matroska/ebml-write.c:
+ matroska: rejig test to avoid undefined shift behavior
+ Coverity 1195121, 1195120
+
+2014-05-05 14:33:38 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+ * ext/vpx/gstvp9enc.c:
+ vp9enc: do not dereference NULL pointer
+ Coverity 1197703
+
+2014-05-05 14:32:06 +0100 Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+ * gst/matroska/matroska-mux.c:
+ matroskamux: ensure we don't dereference a NULL pointer
+ while working out the codec ID.
+ Coverity 1195148
+
+2014-05-05 12:07:25 +0100 Tim-Philipp Müller <tim@centricular.com>
+
+ * sys/v4l2/gstv4l2.c:
+ v4l2: minor fix for closing the fd
+ The fd returned by open() could theoretically be 0 as well.
+ Coverity CID 1211823.
+
+2014-05-04 20:23:29 -0400 Olivier Crête <olivier.crete@ocrete.ca>
+
+ * tests/check/elements/rtpaux.c:
+ * tests/check/elements/rtprtx.c:
+ rtpaux/rtprtx: Make tests non-racy
+ Fix the raciness by iterating on a condition instead of using the gmainloop.
+ Don't use the EOS as the target, otherwise the retransmission of the last
+ packets are lost. Also count the retranmissions requests that are dropped.
+ Check the condition before blocking on the GCond
+ https://bugzilla.gnome.org/show_bug.cgi?id=728501
+
+2014-05-04 22:32:54 -0400 Olivier Crête <olivier.crete@ocrete.ca>
+
+ * gst/rtpmanager/gstrtprtxreceive.c:
+ * gst/rtpmanager/gstrtprtxreceive.h:
+ rtprtxreceive: Wait until timeout to clear association requests
+ If two streams request a retranmission for the same SSRC, ignore the second
+ one if the first oen is less than one second old, otherwise time out the first
+ one and ignore the second.
+
+2014-05-04 18:59:33 -0400 Olivier Crête <olivier.crete@ocrete.ca>
+
+ * gst/rtpmanager/gstrtpmux.c:
+ * tests/check/elements/rtpmux.c:
+ rtpmux: Always let upstream chose the ssrc if it wishes
+
+2014-05-04 13:37:46 +0200 Mark Nauwelaerts <mnauw@users.sourceforge.net>
+
+ * gst/rtpmanager/gstrtpjitterbuffer.c:
+ rtpjitterbuffer: avoid stall by corrupted seqnum accounting
+
+2014-05-04 01:14:33 -0400 Olivier Crête <olivier.crete@ocrete.ca>
+
+ * ext/pulse/pulsedevicemonitor.c:
+ * ext/pulse/pulsedevicemonitor.h:
+ pulsedevicemonitor: Index are per facility, not global
+ So need to keep the type of device in the device object
+
+2014-05-04 01:13:24 -0400 Olivier Crête <olivier.crete@ocrete.ca>
+
+ * ext/pulse/pulsedevicemonitor.c:
+ pulsedevicemonitor: pa_subscription_event_t are enums, not flags
+ Coverity 1195132
+
+2014-05-02 22:42:54 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.co.uk>
+
+ * sys/v4l2/gstv4l2devicemonitor.c:
+ v4l2devicemonitor: Port to use GstV4l2Iterator
+ https://bugzilla.gnome.org/show_bug.cgi?id=727925
+
+2014-05-02 21:38:30 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.co.uk>
+
+ * sys/v4l2/gstv4l2.c:
+ * sys/v4l2/gstv4l2object.c:
+ * sys/v4l2/gstv4l2videodec.c:
+ * sys/v4l2/gstv4l2videodec.h:
+ v4l2: Use single pass iterator for M2M probe
+ Instead of having each M2M class do their own probing, use the
+ GstV4l2Iterator and probe all devices in a single pass.
+ https://bugzilla.gnome.org/show_bug.cgi?id=727925
+
+2014-05-02 16:55:05 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/Makefile.am:
+ * sys/v4l2/v4l2-utils.c:
+ * sys/v4l2/v4l2-utils.h:
+ v4l2: Add a common device enumerator
+ This will allow removing code duplication (hence bugs duplication).
+ https://bugzilla.gnome.org/show_bug.cgi?id=727925
+
+2014-03-16 11:38:07 +0100 Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+ * sys/v4l2/gstv4l2videodec.c:
+ * sys/v4l2/gstv4l2videodec.h:
+ v4l2videodec: Simplify sub-instanciation mechanism
+ Simplify sub-instanciation by defining an absract type and using subtype
+ class and instance init callback. This also fixes a bug where the template
+ pads get initialized too late.
+ https://bugzilla.gnome.org/show_bug.cgi?id=727925
+
+2014-05-02 18:18:26 -0400 Nicolas Dufresne <nicolas.dufresne@collabora.co.uk>
+
+ * sys/v4l2/gstv4l2.c:
+ v4l2: Cleanup plugin registration
+ There is no plan to introduce special sources for jpeg, te v4l2src works fine
+ for this.
+ https://bugzilla.gnome.org/show_bug.cgi?id=727925
+
+2014-05-03 18:30:20 -0400 Olivier Crête <olivier.crete@ocrete.ca>
+
+ * gst/rtpmanager/rtpsession.c:
+ * gst/rtpmanager/rtpsession.h:
+ * gst/rtpmanager/rtpsource.c:
+ * gst/rtpmanager/rtpsource.h:
+ * tests/check/elements/rtpcollision.c:
+ rtpsession: Keep local conflicting addresses in the session
+ As we now replace the local RTPSource on a conflict, it's no longer possible
+ to keep local conflicts in the RTPSource, so they instead need to be kept
+ in the RTPSession.
+ Also fix the rtpcollision test to generate multiple collisions instead of
+ one by change the address, as otherwise we detected that it was a single one.
+
+2014-05-03 20:48:30 +0200 Sebastian Dröge <sebastian@centricular.com>
+
+ * configure.ac:
+ Back to development
+
=== release 1.3.1 ===
-2014-05-03 Sebastian Dröge <slomo@coaxion.net>
+2014-05-03 18:02:23 +0200 Sebastian Dröge <sebastian@centricular.com>
+ * ChangeLog:
+ * NEWS:
+ * RELEASE:
* configure.ac:
- releasing 1.3.1
+ * docs/plugins/gst-plugins-good-plugins.args:
+ * docs/plugins/gst-plugins-good-plugins.hierarchy:
+ * docs/plugins/gst-plugins-good-plugins.interfaces:
+ * docs/plugins/gst-plugins-good-plugins.prerequisites:
+ * docs/plugins/gst-plugins-good-plugins.signals:
+ * docs/plugins/inspect/plugin-1394.xml:
+ * docs/plugins/inspect/plugin-aasink.xml:
+ * docs/plugins/inspect/plugin-alaw.xml:
+ * docs/plugins/inspect/plugin-alpha.xml:
+ * docs/plugins/inspect/plugin-alphacolor.xml:
+ * docs/plugins/inspect/plugin-apetag.xml:
+ * docs/plugins/inspect/plugin-audiofx.xml:
+ * docs/plugins/inspect/plugin-audioparsers.xml:
+ * docs/plugins/inspect/plugin-auparse.xml:
+ * docs/plugins/inspect/plugin-autodetect.xml:
+ * docs/plugins/inspect/plugin-avi.xml:
+ * docs/plugins/inspect/plugin-cacasink.xml:
+ * docs/plugins/inspect/plugin-cairo.xml:
+ * docs/plugins/inspect/plugin-cutter.xml:
+ * docs/plugins/inspect/plugin-debug.xml:
+ * docs/plugins/inspect/plugin-deinterlace.xml:
+ * docs/plugins/inspect/plugin-dtmf.xml:
+ * docs/plugins/inspect/plugin-dv.xml:
+ * docs/plugins/inspect/plugin-effectv.xml:
+ * docs/plugins/inspect/plugin-equalizer.xml:
+ * docs/plugins/inspect/plugin-flac.xml:
+ * docs/plugins/inspect/plugin-flv.xml:
+ * docs/plugins/inspect/plugin-flxdec.xml:
+ * docs/plugins/inspect/plugin-gdkpixbuf.xml:
+ * docs/plugins/inspect/plugin-goom.xml:
+ * docs/plugins/inspect/plugin-goom2k1.xml:
+ * docs/plugins/inspect/plugin-icydemux.xml:
+ * docs/plugins/inspect/plugin-id3demux.xml:
+ * docs/plugins/inspect/plugin-imagefreeze.xml:
+ * docs/plugins/inspect/plugin-interleave.xml:
+ * docs/plugins/inspect/plugin-isomp4.xml:
+ * docs/plugins/inspect/plugin-jack.xml:
+ * docs/plugins/inspect/plugin-jpeg.xml:
+ * docs/plugins/inspect/plugin-level.xml:
+ * docs/plugins/inspect/plugin-matroska.xml:
+ * docs/plugins/inspect/plugin-mulaw.xml:
+ * docs/plugins/inspect/plugin-multifile.xml:
+ * docs/plugins/inspect/plugin-multipart.xml:
+ * docs/plugins/inspect/plugin-navigationtest.xml:
+ * docs/plugins/inspect/plugin-oss4.xml:
+ * docs/plugins/inspect/plugin-ossaudio.xml:
+ * docs/plugins/inspect/plugin-png.xml:
+ * docs/plugins/inspect/plugin-pulseaudio.xml:
+ * docs/plugins/inspect/plugin-replaygain.xml:
+ * docs/plugins/inspect/plugin-rtp.xml:
+ * docs/plugins/inspect/plugin-rtpmanager.xml:
+ * docs/plugins/inspect/plugin-rtsp.xml:
+ * docs/plugins/inspect/plugin-shapewipe.xml:
+ * docs/plugins/inspect/plugin-shout2send.xml:
+ * docs/plugins/inspect/plugin-smpte.xml:
+ * docs/plugins/inspect/plugin-soup.xml:
+ * docs/plugins/inspect/plugin-spectrum.xml:
+ * docs/plugins/inspect/plugin-speex.xml:
+ * docs/plugins/inspect/plugin-taglib.xml:
+ * docs/plugins/inspect/plugin-udp.xml:
+ * docs/plugins/inspect/plugin-video4linux2.xml:
+ * docs/plugins/inspect/plugin-videobox.xml:
+ * docs/plugins/inspect/plugin-videocrop.xml:
+ * docs/plugins/inspect/plugin-videofilter.xml:
+ * docs/plugins/inspect/plugin-videomixer.xml:
+ * docs/plugins/inspect/plugin-vpx.xml:
+ * docs/plugins/inspect/plugin-wavenc.xml:
+ * docs/plugins/inspect/plugin-wavpack.xml:
+ * docs/plugins/inspect/plugin-wavparse.xml:
+ * docs/plugins/inspect/plugin-ximagesrc.xml:
+ * docs/plugins/inspect/plugin-y4menc.xml:
+ * gst-plugins-good.doap:
+ * gst/audiofx/audiopanoramaorc-dist.c:
+ * gst/deinterlace/tvtime-dist.c:
+ * gst/videobox/gstvideoboxorc-dist.c:
+ * gst/videomixer/videomixerorc-dist.c:
+ * win32/common/config.h:
+ Release 1.3.1
+
+2014-05-03 18:02:01 +0200 Sebastian Dröge <sebastian@centricular.com>
+
+ * po/af.po:
+ * po/az.po:
+ * po/bg.po:
+ * po/ca.po:
+ * po/cs.po:
+ * po/da.po:
+ * po/de.po:
+ * po/el.po:
+ * po/en_GB.po:
+ * po/eo.po:
+ * po/es.po:
+ * po/eu.po:
+ * po/fi.po:
+ * po/fr.po:
+ * po/gl.po:
+ * po/hr.po:
+ * po/hu.po:
+ * po/id.po:
+ * po/it.po:
+ * po/ja.po:
+ * po/lt.po:
+ * po/lv.po:
+ * po/mt.po:
+ * po/nb.po:
+ * po/nl.po:
+ * po/or.po:
+ * po/pl.po:
+ * po/pt_BR.po:
+ * po/ro.po:
+ * po/ru.po:
+ * po/sk.po:
+ * po/sl.po:
+ * po/sq.po:
+ * po/sr.po:
+ * po/sv.po:
+ * po/tr.po:
+ * po/uk.po:
+ * po/vi.po:
+ * po/zh_CN.po:
+ * po/zh_HK.po:
+ * po/zh_TW.po:
+ Update .po files
2014-05-03 17:22:45 +0200 Sebastian Dröge <sebastian@centricular.com>
diff --git a/Makefile.in b/Makefile.in
index 894ee467..01c90974 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -121,6 +121,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/NEWS b/NEWS
index 5fc86c82..da4707eb 100644
--- a/NEWS
+++ b/NEWS
@@ -1,4 +1,4 @@
-This is GStreamer Good Plugins 1.3.1
+This is GStreamer Good Plugins 1.3.2
Changes since 1.2:
@@ -45,6 +45,8 @@ New API:
events and merge custom tags into them consistently.
• playbin/playsink has support for application provided audio and video
filters.
+ • GstDiscoverer has new and simplified API to get details about missing
+ plugins and information to pass to the plugin installer.
• The GL library was merged from gst-plugins-gl to gst-plugins-bad,
providing a generic infrastructure for handling GL inside GStreamer
pipelines and a plugin with some elements using these, especially
@@ -62,6 +64,14 @@ Major changes:
of the existing V4L2 elements and the corresponding
infrastructure.
The v4l2videodec element replaces the mfcdec element.
+ ∘ New downloadbuffer element that replaces the download
+ buffering feature of queue2. Compared to queue2's code
+ it is much simpler and only for this single use case.
+ A noteworthy new feature is that it's downloading gaps
+ in the already downloaded stream parts when nothing else
+ is to be downloaded.
+ This is now used by playbin when download buffering is
+ enabled.
∘ rtpstreampay and rtpstreamdepay elements for transmitting
RTP packets over a stream API (e.g. TCP) according to
RFC 4571.
@@ -78,7 +88,7 @@ Major changes:
are available on OS X and iOS now.
• Other changes:
- ∘ gst-libav now uses libav 10, and gained support for H265/HEVC.
+ ∘ gst-libav now uses libav 10.1, and gained support for H265/HEVC.
∘ Support for hardware codecs and special memory types has been
improved with bugfixes and feature additions in various plugins
and base classes.
@@ -95,6 +105,9 @@ Major changes:
reliable now and supports more HLS features like trick modes.
Also fragments are pushed downstream while they're downloaded
now instead of waiting for each fragment to finish.
+ ∘ dashdemux and mssdemux are now also pushing fragments downstream
+ while they're downloaded instead of waiting for each fragment to
+ finish.
∘ videoflip can automatically flip based on the orientation tag.
∘ openjpeg supports the OpenJPEG2 API.
∘ gst-rtsp-server supports SRTP and MIKEY now.
@@ -107,4 +120,3 @@ Things to look out for:
element.
• The mfcdec element was removed and replaced by v4l2videodec.
• osxvideosink is only available in OS X 10.6 or newer.
-
diff --git a/RELEASE b/RELEASE
index 30d75956..2e63499e 100644
--- a/RELEASE
+++ b/RELEASE
@@ -1,8 +1,8 @@
-Release notes for GStreamer Good Plugins 1.3.1
+Release notes for GStreamer Good Plugins 1.3.2
-The GStreamer team is pleased to announce the first release of the unstable
+The GStreamer team is pleased to announce the second release of the unstable
1.3 release series. The 1.3 release series is adding new features on top of
the 1.0 and 1.2 series and is part of the API and ABI-stable 1.x release
series of the GStreamer multimedia framework. The unstable 1.3 release series
@@ -70,101 +70,25 @@ contains a set of codecs plugins based on libav (formerly gst-ffmpeg)
Bugs fixed in this release
+ * 583890 : v4l2: Implement V4L2_MEMORY_USERPTR support
* 728501 : rtpaux/rtprtx: Unit tests are racy and take very long sometimes
- * 719636 : deinterlace: alters caps in passthrough mode preventing hardware decode
- * 727305 : matroskademux: Add support for A_OPUS
- * 725632 : v4l2: Normalise control names in the same way as v4l2-ctl
- * 345830 : qtdemux: better edit lists handling
- * 636143 : avidemux: report creation date/time via GST_TAG_DATE_TIME
- * 652986 : rtpjitterbuffer: events are not serialized
- * 664339 : matroskamux: support for audio/x-adpcm
- * 691570 : [isomp4/qtdemux] lots of critical warnings on this sample file
- * 692787 : rtph264pay: No way to clear SPS and PPS in case of a new stream
- * 705024 : aacparse: does not propagate downstream sample rate restriction upstream
- * 705982 : mp4mux: HDLR box name string is not NULL terminated
- * 708165 : videomixer: Store and forward tag events
- * 709079 : rtpgstpay: Leaks memory
- * 709093 : qtdemux: add HEVC support
- * 709266 : matroska-demux leaks memory
- * 709312 : videoflip: Add an automatic method that flip base on image-orientation tag
- * 710415 : hdv1394src: Not possible to select a HDV camera from GUID
- * 710762 : qtdemux: fails reading some MOV files with problematic jpeg frames
- * 711010 : videomixer: remove unneeded guint comparison
- * 711011 : y4mencode: fix uninitialized variable warning
- * 711013 : osxvideosink: fix missing selector name warning
- * 711084 : rtpmanager: add new rtprtxsend and rtprtxreceive elements for retransmission
- * 711087 : rtpbin: Support Auxiliary streams
- * 711270 : check: add rtpsession test
- * 711411 : rtpjitterbuffer: implement RTX statistics
- * 711412 : rtpjitterbuffer: Automatically calculate RTX properties based on RTT
- * 711560 : rtpsession: ssrc collision improvements
- * 711693 : rtpsession: Implement various session statistics
- * 712206 : v4l2: print FOURCC before enumerating
- * 712254 : multifilesrc: Implement seeking in case of multiple images
- * 712303 : qtdemux: playback regression after commit ae1150e85cf99d7482933aa6f7e4f012fe45a3ec
- * 712567 : rtpsession: RBs are not included in SRs after the first RTCP timeout when there are multiple internal senders
- * 712612 : v4l2bufferpool: take over the floating reference for the new allocator
- * 712754 : v4l2: add support for multi-planar V4L2 API
- * 719434 : rtph264pay maps and unmaps inbuffer twice
- * 719497 : videoflip: crashes on tag list without orientation tag in git master
- * 719783 : qtdemux: regression with mp4-main-multi-mpd-AV-NBS.mpd
- * 719829 : rtp: Add RFC4571 framing/de-framing element
- * 719938 : rtpbin: allow dynamic RTP/RTCP encoders and decoders
- * 720371 : rtpbin: Impossible to set jitterbuffer rtx-* properties when using rtpbin
- * 720512 : flacparse: Doesn't set the codec tag
- * 720568 : v4l2: Various changes to allow using M2M decoders
- * 720995 : matroskamux: add g726 adpcm support
- * 721245 : osxvideosink: Fails to build on OS X Leopard 10.5.8
- * 721342 : shout2send: Some minor cleanups
- * 722175 : rtpmanager: improve code of rtprtx* elements
- * 722370 : rtprtxsend: push rtx buffers from a different thread to avoid long retransmission delays
- * 722372 : rtpjitterbuffer: Got data flow before stream-start event
- * 722394 : v4l2: set GST_BUFFER_FLAG_DELTA_UNIT when appropriate
- * 722396 : avimux: don't make the buffer writable unless absolutely necessary
- * 722866 : rtspsrc: add rtpjitterbuffer do-retransmission property
- * 722981 : autodetect elements have inconsistent handling of autoplugin
- * 723166 : qtdemux: incorrect tag character
- * 723269 : matroskamux: used uid list grows forever
- * 723289 : cairooverlay: add RGB16 support
- * 723502 : gst-plugins-good: Do not build check tests for disabled plugins
- * 723849 : matroska: add support for GRAY8, BGR and RGB video colourspaces in V_UNCOMPRESSED codec
- * 724085 : gst-plugins-good/docs: Rebalance docbook < para > tags in comments
- * 724213 : rtph264pay: shouldn't update time for sending SPS and PPS if we failed to send SPS or PPS
- * 724396 : rtspsrc: add tls-database property
- * 724636 : v4l2videodec: VP8 KO with playbin
- * 724705 : videomixer: Port to new collectpads API
- * 724712 : rtspsrc doesn't set caps on pads before adding them
- * 724899 : v4l2src does not set interlaced flag on buffers
- * 725008 : matroskademux: crash with 24bit raw audio
- * 725159 : rtpjitterbuffer: RTP sequence number rollover problems
- * 725361 : [regression] rtpsession: setting the " internal-ssrc " property does nothing
- * 725480 : gst-plugins-good: Ignore gcov intermediate files
- * 725723 : osxvideo: GetCurrentProcess not available on Mavericks
- * 725948 : videomixer2: crash after renegotiating with different resolution
- * 726106 : matroskademux: does not handle fps lower than 1
- * 726161 : png plugin handles interlaced png files incorrectly
- * 726696 : rtspsrc memleaks
- * 726737 : osxvideosink: advertize for the video meta API support
- * 726738 : osxvideosink: use the video frame API instead of the video meta API
- * 726833 : ximagesrc: Add alpha channel support
- * 726837 : rtspsrc segfault
- * 727821 : souphttpsrc: Regression in push mode
- * 727867 : qtdemux: Does not return stream flags from trex atom
- * 727878 : qtdemux: replace duplicated variable when parsing trex atom
- * 729223 : wavparse: drops upstream tags for .wav files that are ID3 tagged
- * 728987 : qtdemux: 'caps' may be used uninitialized in this function.
- * 729067 : goom filter: left shift of 24 places cannot be represented in type 'int'
- * 712333 : regression: videoflip: aborts with gst_video_flip_transform_caps: code should not be reached
- * 722077 : v4l2: compile error - 'V4L2_CAP_VIDEO_M2M_MPLANE' undeclared
- * 722127 : v4l2: Add NV12_64Z32 support
- * 722128 : v4l2: Implement video decoder
- * 723446 : v4l2src: Should detect support for mplanar formats during runtime
- * 726453 : v4l2 plugin broken due to bundeling of videodev2.h
- * 721764 : souphttpsrc: Add ability to do HTTP session logging
- * 722311 : matroskaparse: should try to identify data on stream header before going with a blind
- * 722705 : Factor out common init/reset code from matroska parse/demux
- * 712643 : qtdemux: couple of issues with vobsub
- * 581295 : mp4mux: Add support for embedded subtitles
+ * 663944 : souphttpsrc: leaking file descriptors + memory when destroyed while connecting
+ * 707321 : flvdemux: complains too much when failed to send buffers
+ * 720440 : rtpsession: internal sources are never removed
+ * 725410 : v4l2videodec: Probe fails if first device does not start with 0
+ * 725415 : v4l2videodec: Check caps are subset of encode or raw when probing devices
+ * 727925 : v4l2: Share device enumeration
+ * 729247 : rtp/README: update to work with gst 1.0
+ * 729524 : rtpjitterbuffer: if retransmissions enabled, a gap larger than the latency can result in a stuck jitterbuffer
+ * 729553 : qtdemux: tries to reply to a byte position query with a time position
+ * 729591 : v4l2videodec: Remove meaningless properties
+ * 730078 : rtpjitterbuffer: wrong packet insertion if events present in the jitter queue
+ * 730146 : rtpbin: update rtp encoder/decoder documentation
+ * 730200 : v4l2videodec: v4l2bufferpool must be updated according to driver requirement
+ * 730207 : v4l2: Seeking with M2M devices
+ * 730212 : rtspsrc: use a random ssrc for the internal session
+ * 730217 : rtpsession: do not mark internal senders as expired
+ * 724630 : v4l2videodec: alignment support
==== Download ====
@@ -201,70 +125,21 @@ subscribe to the gstreamer-devel list.
Contributors to this release
- * Akihiro Tsukada
- * Aleix Conchillo Flaque
+ * Adrien SCH
* Aleix Conchillo Flaqué
- * Alessandro Decina
- * Alexander Zallesov
- * Andoni Morales Alastruey
* Benjamin Gaignard
- * Branislav Katreniak
- * Brendan Long
- * Christian Fredrik Kalager Schaller
- * Dan Kegel
- * Darryl Gamroth
- * Djalma Lúcio Soares da Silva
* Edward Hervey
+ * Eric Trousset
* George Kiagiadakis
- * Göran Jönsson
- * Hans Månsson
- * Hugues Fruchet
- * Jake Foytik
- * Jan Schmidt
- * Jeremy Huddleston
- * Jeremy Huddleston Sequoia
- * Jimmy Ohn
- * Jonas Holmberg
- * Josep Torra
- * Julien Isorce
- * Justin Joy
- * Luis de Bethencourt
- * Marc Leeman
+ * Guillaume Desmottes
+ * Jason Litzinger
* Mark Nauwelaerts
- * Matej Knopp
- * Mathieu Duponchelle
- * MathieuDuponchelle
- * Matthieu Bouron
- * Michael Olbrich
- * Mike Sheldon
- * Nicola Murino
* Nicolas Dufresne
- * Ognyan Tonchev
* Olivier Crête
- * Paul HENRYS
- * Per x Johansson
- * Peter Korsgaard
- * Philippe Normand
- * Rafał Mużyło
- * Reynaldo H. Verdejo Pinochet
- * Rico Tzschichholz
- * Ryan Lortie
- * Santiago Carot-Nemesio
* Sebastian Dröge
- * Sebastian Rasmussen
- * Simon Farnsworth
- * Sreerenj Balachandran
- * Stefan Sauer
- * Stéphane Cerveau
- * Thiago Santos
- * Thibault Saunier
- * Thijs Vermeir
* Tim-Philipp Müller
- * Todd Agulnick
- * Torrie Fischer
* Vincent Penquerc'h
- * William Jon McCann
- * William Manley
+ * Víctor Manuel Jáquez Leal
* Wim Taymans
- * divhaere
+ * Руслан Ижбулатов
  \ No newline at end of file
diff --git a/aclocal.m4 b/aclocal.m4
index ec7cfe1a..e99353fe 100644
--- a/aclocal.m4
+++ b/aclocal.m4
@@ -1491,6 +1491,7 @@ m4_include([common/m4/gst-package-release-datetime.m4])
m4_include([common/m4/gst-platform.m4])
m4_include([common/m4/gst-plugin-docs.m4])
m4_include([common/m4/gst-plugindir.m4])
+m4_include([common/m4/gst-x11.m4])
m4_include([common/m4/gst.m4])
m4_include([common/m4/gtk-doc.m4])
m4_include([common/m4/orc.m4])
diff --git a/common/Makefile.in b/common/Makefile.in
index a48f4038..806bdf4e 100644
--- a/common/Makefile.in
+++ b/common/Makefile.in
@@ -102,6 +102,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/common/m4/Makefile.in b/common/m4/Makefile.in
index ef2bd77b..0fe0d505 100644
--- a/common/m4/Makefile.in
+++ b/common/m4/Makefile.in
@@ -101,6 +101,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/configure b/configure
index a4838c48..e9e8040f 100755
--- a/configure
+++ b/configure
@@ -1,6 +1,6 @@
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for GStreamer Good Plug-ins 1.3.1.
+# Generated by GNU Autoconf 2.69 for GStreamer Good Plug-ins 1.3.2.
#
# Report bugs to <http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer>.
#
@@ -591,8 +591,8 @@ MAKEFLAGS=
# Identity of this package.
PACKAGE_NAME='GStreamer Good Plug-ins'
PACKAGE_TARNAME='gst-plugins-good'
-PACKAGE_VERSION='1.3.1'
-PACKAGE_STRING='GStreamer Good Plug-ins 1.3.1'
+PACKAGE_VERSION='1.3.2'
+PACKAGE_STRING='GStreamer Good Plug-ins 1.3.2'
PACKAGE_BUGREPORT='http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer'
PACKAGE_URL=''
@@ -745,11 +745,11 @@ XSHM_LIBS
HAVE_XSHM
USE_X_FALSE
USE_X_TRUE
-HAVE_X
XDAMAGE_LIBS
XDAMAGE_CFLAGS
XFIXES_LIBS
XFIXES_CFLAGS
+HAVE_X
X_EXTRA_LIBS
X_LIBS
X_PRE_LIBS
@@ -1945,7 +1945,7 @@ if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF
-\`configure' configures GStreamer Good Plug-ins 1.3.1 to adapt to many kinds of systems.
+\`configure' configures GStreamer Good Plug-ins 1.3.2 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
@@ -2021,7 +2021,7 @@ fi
if test -n "$ac_init_help"; then
case $ac_init_help in
- short | recursive ) echo "Configuration of GStreamer Good Plug-ins 1.3.1:";;
+ short | recursive ) echo "Configuration of GStreamer Good Plug-ins 1.3.2:";;
esac
cat <<\_ACEOF
@@ -2384,7 +2384,7 @@ fi
test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
-GStreamer Good Plug-ins configure 1.3.1
+GStreamer Good Plug-ins configure 1.3.2
generated by GNU Autoconf 2.69
Copyright (C) 2012 Free Software Foundation, Inc.
@@ -3195,7 +3195,7 @@ cat >config.log <<_ACEOF
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
-It was created by GStreamer Good Plug-ins $as_me 1.3.1, which was
+It was created by GStreamer Good Plug-ins $as_me 1.3.2, which was
generated by GNU Autoconf 2.69. Invocation command line was
$ $0 $@
@@ -4177,7 +4177,7 @@ fi
# Define the identity of the package.
PACKAGE='gst-plugins-good'
- VERSION='1.3.1'
+ VERSION='1.3.2'
cat >>confdefs.h <<_ACEOF
@@ -4388,9 +4388,9 @@ fi
- PACKAGE_VERSION_MAJOR=$(echo 1.3.1 | cut -d'.' -f1)
- PACKAGE_VERSION_MINOR=$(echo 1.3.1 | cut -d'.' -f2)
- PACKAGE_VERSION_MICRO=$(echo 1.3.1 | cut -d'.' -f3)
+ PACKAGE_VERSION_MAJOR=$(echo 1.3.2 | cut -d'.' -f1)
+ PACKAGE_VERSION_MINOR=$(echo 1.3.2 | cut -d'.' -f2)
+ PACKAGE_VERSION_MICRO=$(echo 1.3.2 | cut -d'.' -f3)
@@ -4401,7 +4401,7 @@ fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking nano version" >&5
$as_echo_n "checking nano version... " >&6; }
- NANO=$(echo 1.3.1 | cut -d'.' -f4)
+ NANO=$(echo 1.3.2 | cut -d'.' -f4)
if test x"$NANO" = x || test "x$NANO" = "x0" ; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: 0 (release)" >&5
@@ -9057,10 +9057,10 @@ fi
done
- GST_CURRENT=301
+ GST_CURRENT=302
GST_REVISION=0
- GST_AGE=301
- GST_LIBVERSION=301:0:301
+ GST_AGE=302
+ GST_LIBVERSION=302:0:302
@@ -13385,8 +13385,8 @@ CC="$lt_save_CC"
-GST_REQ=1.3.1
-GSTPB_REQ=1.3.1
+GST_REQ=1.3.2
+GSTPB_REQ=1.3.2
@@ -30292,6 +30292,7 @@ if test x$USE_X = xyes; then
HAVE_X=no
+
if test "$no_x" = yes; then
# Not all programs may use this symbol, but it does not hurt to define it.
@@ -30782,12 +30783,12 @@ fi
fi
-
- ac_cflags_save="$CFLAGS"
+ ac_cflags_save="$CFLAGS"
ac_cppflags_save="$CPPFLAGS"
CFLAGS="$CFLAGS $X_CFLAGS"
CPPFLAGS="$CPPFLAGS $X_CFLAGS"
- ac_fn_c_check_header_mongrel "$LINENO" "X11/Xlib.h" "ac_cv_header_X11_Xlib_h" "$ac_includes_default"
+
+ ac_fn_c_check_header_mongrel "$LINENO" "X11/Xlib.h" "ac_cv_header_X11_Xlib_h" "$ac_includes_default"
if test "x$ac_cv_header_X11_Xlib_h" = xyes; then :
HAVE_X="yes"
else
@@ -30805,8 +30806,16 @@ $as_echo "$as_me: cannot find X11 development files" >&6;}
X_LIBS="$X_LIBS -lX11"
+ fi
+ CFLAGS="$ac_cflags_save"
+ CPPFLAGS="$ac_cppflags_save"
+
+
+ if test "x$HAVE_X" = "xyes"
+ then
+
pkg_failed=no
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for XFIXES" >&5
$as_echo_n "checking for XFIXES... " >&6; }
@@ -30963,9 +30972,6 @@ fi
fi
- CFLAGS="$ac_cflags_save"
- CPPFLAGS="$ac_cppflags_save"
-
LIBS=$gst_check_save_LIBS
LDFLAGS=$gst_check_save_LDFLAGS
@@ -37419,7 +37425,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# report actual input values of CONFIG_FILES etc. instead of their
# values after options handling.
ac_log="
-This file was extended by GStreamer Good Plug-ins $as_me 1.3.1, which was
+This file was extended by GStreamer Good Plug-ins $as_me 1.3.2, which was
generated by GNU Autoconf 2.69. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
@@ -37485,7 +37491,7 @@ _ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
ac_cs_version="\\
-GStreamer Good Plug-ins config.status 1.3.1
+GStreamer Good Plug-ins config.status 1.3.2
configured by $0, generated by GNU Autoconf 2.69,
with options \\"\$ac_cs_config\\"
diff --git a/configure.ac b/configure.ac
index b31be2ab..17be4da3 100644
--- a/configure.ac
+++ b/configure.ac
@@ -5,7 +5,7 @@ dnl please read gstreamer/docs/random/autotools before changing this file
dnl initialize autoconf
dnl releases only do -Wall, git and prerelease does -Werror too
dnl use a three digit version number for releases, and four for git/pre
-AC_INIT([GStreamer Good Plug-ins],[1.3.1],[http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer],[gst-plugins-good])
+AC_INIT([GStreamer Good Plug-ins],[1.3.2],[http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer],[gst-plugins-good])
AG_GST_INIT
@@ -43,11 +43,11 @@ AC_DEFINE_UNQUOTED(GST_API_VERSION, "$GST_API_VERSION",
[GStreamer API Version])
AG_GST_LIBTOOL_PREPARE
-AS_LIBTOOL(GST, 301, 0, 301)
+AS_LIBTOOL(GST, 302, 0, 302)
dnl *** required versions of GStreamer stuff ***
-GST_REQ=1.3.1
-GSTPB_REQ=1.3.1
+GST_REQ=1.3.2
+GSTPB_REQ=1.3.2
dnl *** autotools stuff ****
@@ -554,27 +554,10 @@ dnl Check for X11
translit(dnm, m, l) AM_CONDITIONAL(USE_X, true)
AG_GST_CHECK_FEATURE(X, [X libraries and plugins],
[ximagesrc], [
- AC_PATH_XTRA
+ AG_GST_CHECK_X
- dnl now try to find the HEADER
- ac_cflags_save="$CFLAGS"
- ac_cppflags_save="$CPPFLAGS"
- CFLAGS="$CFLAGS $X_CFLAGS"
- CPPFLAGS="$CPPFLAGS $X_CFLAGS"
- AC_CHECK_HEADER(X11/Xlib.h, HAVE_X="yes", HAVE_X="no")
-
- if test "x$HAVE_X" = "xno"
+ if test "x$HAVE_X" = "xyes"
then
- AC_MSG_NOTICE([cannot find X11 development files])
- else
- dnl this is much more than we want
- X_LIBS="$X_LIBS $X_PRE_LIBS $X_EXTRA_LIBS"
- dnl AC_PATH_XTRA only defines the path needed to find the X libs,
- dnl it does not add the libs; therefore we add them here
- X_LIBS="$X_LIBS -lX11"
- AC_SUBST(X_CFLAGS)
- AC_SUBST(X_LIBS)
-
dnl check for Xfixes
PKG_CHECK_MODULES(XFIXES, xfixes, HAVE_XFIXES="yes", HAVE_XFIXES="no")
if test "x$HAVE_XFIXES" = "xyes"
@@ -593,9 +576,6 @@ AG_GST_CHECK_FEATURE(X, [X libraries and plugins],
AC_SUBST(XDAMAGE_LIBS)
AC_SUBST(XDAMAGE_CFLAGS)
fi
- AC_SUBST(HAVE_X)
- CFLAGS="$ac_cflags_save"
- CPPFLAGS="$ac_cppflags_save"
])
dnl FIXME: this should be rolled into the test above, it's just an additional
diff --git a/docs/Makefile.in b/docs/Makefile.in
index d59161f6..48327087 100644
--- a/docs/Makefile.in
+++ b/docs/Makefile.in
@@ -102,6 +102,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/docs/plugins/Makefile.in b/docs/plugins/Makefile.in
index 55dbc256..690bba8b 100644
--- a/docs/plugins/Makefile.in
+++ b/docs/plugins/Makefile.in
@@ -120,6 +120,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/docs/plugins/gst-plugins-good-plugins.hierarchy b/docs/plugins/gst-plugins-good-plugins.hierarchy
index dfe88596..11075f7b 100644
--- a/docs/plugins/gst-plugins-good-plugins.hierarchy
+++ b/docs/plugins/gst-plugins-good-plugins.hierarchy
@@ -305,6 +305,8 @@ GObject
GstTaskPool
GSocket
GTlsDatabase
+ GUdevClient
+ GUdevDevice
GdkPixbuf
GstColorBalanceChannel
GstTunerChannel
diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-1394.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-1394.html
index a0b43985..cca2848b 100644
--- a/docs/plugins/html/gst-plugins-good-plugins-plugin-1394.html
+++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-1394.html
@@ -42,7 +42,7 @@
</tr>
<tr>
<td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
</tr>
<tr>
<td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-aasink.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-aasink.html
index 92cdca0c..e5f9a159 100644
--- a/docs/plugins/html/gst-plugins-good-plugins-plugin-aasink.html
+++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-aasink.html
@@ -42,7 +42,7 @@
</tr>
<tr>
<td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
</tr>
<tr>
<td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-alaw.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-alaw.html
index 105e9f0f..0fe3047b 100644
--- a/docs/plugins/html/gst-plugins-good-plugins-plugin-alaw.html
+++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-alaw.html
@@ -42,7 +42,7 @@
</tr>
<tr>
<td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
</tr>
<tr>
<td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-alpha.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-alpha.html
index 4fbcd378..9a5055f2 100644
--- a/docs/plugins/html/gst-plugins-good-plugins-plugin-alpha.html
+++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-alpha.html
@@ -42,7 +42,7 @@
</tr>
<tr>
<td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
</tr>
<tr>
<td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-alphacolor.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-alphacolor.html
index af068448..e53d974b 100644
--- a/docs/plugins/html/gst-plugins-good-plugins-plugin-alphacolor.html
+++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-alphacolor.html
@@ -42,7 +42,7 @@
</tr>
<tr>
<td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
</tr>
<tr>
<td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-apetag.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-apetag.html
index 0cf723cb..e80dd3bc 100644
--- a/docs/plugins/html/gst-plugins-good-plugins-plugin-apetag.html
+++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-apetag.html
@@ -42,7 +42,7 @@
</tr>
<tr>
<td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
</tr>
<tr>
<td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-audiofx.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-audiofx.html
index 81562129..386f4e08 100644
--- a/docs/plugins/html/gst-plugins-good-plugins-plugin-audiofx.html
+++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-audiofx.html
@@ -42,7 +42,7 @@
</tr>
<tr>
<td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
</tr>
<tr>
<td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-auparse.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-auparse.html
index 0bcb675d..2346d4df 100644
--- a/docs/plugins/html/gst-plugins-good-plugins-plugin-auparse.html
+++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-auparse.html
@@ -42,7 +42,7 @@
</tr>
<tr>
<td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
</tr>
<tr>
<td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-autodetect.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-autodetect.html
index 7f6e5d07..e956f6d6 100644
--- a/docs/plugins/html/gst-plugins-good-plugins-plugin-autodetect.html
+++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-autodetect.html
@@ -42,7 +42,7 @@
</tr>
<tr>
<td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
</tr>
<tr>
<td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-avi.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-avi.html
index 1a98a2c5..18fe15e4 100644
--- a/docs/plugins/html/gst-plugins-good-plugins-plugin-avi.html
+++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-avi.html
@@ -42,7 +42,7 @@
</tr>
<tr>
<td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
</tr>
<tr>
<td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-cacasink.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-cacasink.html
index f97116f8..1da58705 100644
--- a/docs/plugins/html/gst-plugins-good-plugins-plugin-cacasink.html
+++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-cacasink.html
@@ -42,7 +42,7 @@
</tr>
<tr>
<td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
</tr>
<tr>
<td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-cairo.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-cairo.html
index b72c5493..e38b3320 100644
--- a/docs/plugins/html/gst-plugins-good-plugins-plugin-cairo.html
+++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-cairo.html
@@ -42,7 +42,7 @@
</tr>
<tr>
<td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
</tr>
<tr>
<td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-cutter.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-cutter.html
index 50c96fa9..3ac346c1 100644
--- a/docs/plugins/html/gst-plugins-good-plugins-plugin-cutter.html
+++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-cutter.html
@@ -42,7 +42,7 @@
</tr>
<tr>
<td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
</tr>
<tr>
<td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-debug.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-debug.html
index 27c1ac97..68f1d54e 100644
--- a/docs/plugins/html/gst-plugins-good-plugins-plugin-debug.html
+++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-debug.html
@@ -42,7 +42,7 @@
</tr>
<tr>
<td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
</tr>
<tr>
<td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-deinterlace.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-deinterlace.html
index 9341ad9e..c6769fda 100644
--- a/docs/plugins/html/gst-plugins-good-plugins-plugin-deinterlace.html
+++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-deinterlace.html
@@ -42,7 +42,7 @@
</tr>
<tr>
<td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
</tr>
<tr>
<td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-dtmf.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-dtmf.html
index ed5a4f5b..1c793eda 100644
--- a/docs/plugins/html/gst-plugins-good-plugins-plugin-dtmf.html
+++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-dtmf.html
@@ -42,7 +42,7 @@
</tr>
<tr>
<td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
</tr>
<tr>
<td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-dv.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-dv.html
index 8742ebbe..28a8a4a1 100644
--- a/docs/plugins/html/gst-plugins-good-plugins-plugin-dv.html
+++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-dv.html
@@ -42,7 +42,7 @@
</tr>
<tr>
<td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
</tr>
<tr>
<td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-effectv.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-effectv.html
index 25872f45..13252854 100644
--- a/docs/plugins/html/gst-plugins-good-plugins-plugin-effectv.html
+++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-effectv.html
@@ -42,7 +42,7 @@
</tr>
<tr>
<td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
</tr>
<tr>
<td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-equalizer.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-equalizer.html
index 4187720b..0b6ece21 100644
--- a/docs/plugins/html/gst-plugins-good-plugins-plugin-equalizer.html
+++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-equalizer.html
@@ -42,7 +42,7 @@
</tr>
<tr>
<td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
</tr>
<tr>
<td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-flac.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-flac.html
index 8250a2ee..b99e8786 100644
--- a/docs/plugins/html/gst-plugins-good-plugins-plugin-flac.html
+++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-flac.html
@@ -42,7 +42,7 @@
</tr>
<tr>
<td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
</tr>
<tr>
<td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-flv.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-flv.html
index bb28a2ea..8a5acbfc 100644
--- a/docs/plugins/html/gst-plugins-good-plugins-plugin-flv.html
+++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-flv.html
@@ -42,7 +42,7 @@
</tr>
<tr>
<td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
</tr>
<tr>
<td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-flxdec.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-flxdec.html
index 67005ffa..089cf092 100644
--- a/docs/plugins/html/gst-plugins-good-plugins-plugin-flxdec.html
+++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-flxdec.html
@@ -42,7 +42,7 @@
</tr>
<tr>
<td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
</tr>
<tr>
<td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-gdkpixbuf.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-gdkpixbuf.html
index 72496a63..a7e07c0b 100644
--- a/docs/plugins/html/gst-plugins-good-plugins-plugin-gdkpixbuf.html
+++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-gdkpixbuf.html
@@ -42,7 +42,7 @@
</tr>
<tr>
<td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
</tr>
<tr>
<td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-goom.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-goom.html
index 7f8aee8c..c9e05349 100644
--- a/docs/plugins/html/gst-plugins-good-plugins-plugin-goom.html
+++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-goom.html
@@ -42,7 +42,7 @@
</tr>
<tr>
<td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
</tr>
<tr>
<td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-goom2k1.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-goom2k1.html
index 2a702aa0..f5f12a81 100644
--- a/docs/plugins/html/gst-plugins-good-plugins-plugin-goom2k1.html
+++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-goom2k1.html
@@ -42,7 +42,7 @@
</tr>
<tr>
<td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
</tr>
<tr>
<td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-icydemux.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-icydemux.html
index a5ee9846..9a20dfe2 100644
--- a/docs/plugins/html/gst-plugins-good-plugins-plugin-icydemux.html
+++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-icydemux.html
@@ -42,7 +42,7 @@
</tr>
<tr>
<td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
</tr>
<tr>
<td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-id3demux.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-id3demux.html
index 7e9db7e8..f27bebcf 100644
--- a/docs/plugins/html/gst-plugins-good-plugins-plugin-id3demux.html
+++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-id3demux.html
@@ -42,7 +42,7 @@
</tr>
<tr>
<td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
</tr>
<tr>
<td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-imagefreeze.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-imagefreeze.html
index c975f7b8..2c75fe76 100644
--- a/docs/plugins/html/gst-plugins-good-plugins-plugin-imagefreeze.html
+++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-imagefreeze.html
@@ -42,7 +42,7 @@
</tr>
<tr>
<td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
</tr>
<tr>
<td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-interleave.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-interleave.html
index 725ba74d..6b142623 100644
--- a/docs/plugins/html/gst-plugins-good-plugins-plugin-interleave.html
+++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-interleave.html
@@ -42,7 +42,7 @@
</tr>
<tr>
<td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
</tr>
<tr>
<td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-isomp4.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-isomp4.html
index dac89672..0dcc77a9 100644
--- a/docs/plugins/html/gst-plugins-good-plugins-plugin-isomp4.html
+++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-isomp4.html
@@ -42,7 +42,7 @@
</tr>
<tr>
<td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
</tr>
<tr>
<td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-jack.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-jack.html
index d90c1b05..eeeadda4 100644
--- a/docs/plugins/html/gst-plugins-good-plugins-plugin-jack.html
+++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-jack.html
@@ -42,7 +42,7 @@
</tr>
<tr>
<td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
</tr>
<tr>
<td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-jpeg.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-jpeg.html
index 44cbf7f0..b29252b0 100644
--- a/docs/plugins/html/gst-plugins-good-plugins-plugin-jpeg.html
+++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-jpeg.html
@@ -42,7 +42,7 @@
</tr>
<tr>
<td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
</tr>
<tr>
<td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-level.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-level.html
index f65c5ad1..40cd9baf 100644
--- a/docs/plugins/html/gst-plugins-good-plugins-plugin-level.html
+++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-level.html
@@ -42,7 +42,7 @@
</tr>
<tr>
<td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
</tr>
<tr>
<td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-matroska.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-matroska.html
index f73f04e6..9705ee3d 100644
--- a/docs/plugins/html/gst-plugins-good-plugins-plugin-matroska.html
+++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-matroska.html
@@ -42,7 +42,7 @@
</tr>
<tr>
<td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
</tr>
<tr>
<td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-mulaw.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-mulaw.html
index 262c8d9f..15a9642b 100644
--- a/docs/plugins/html/gst-plugins-good-plugins-plugin-mulaw.html
+++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-mulaw.html
@@ -42,7 +42,7 @@
</tr>
<tr>
<td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
</tr>
<tr>
<td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-multifile.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-multifile.html
index 1eb4482f..074ecb05 100644
--- a/docs/plugins/html/gst-plugins-good-plugins-plugin-multifile.html
+++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-multifile.html
@@ -42,7 +42,7 @@
</tr>
<tr>
<td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
</tr>
<tr>
<td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-multipart.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-multipart.html
index d9072adb..a9b1d96e 100644
--- a/docs/plugins/html/gst-plugins-good-plugins-plugin-multipart.html
+++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-multipart.html
@@ -42,7 +42,7 @@
</tr>
<tr>
<td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
</tr>
<tr>
<td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-navigationtest.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-navigationtest.html
index def87fbe..0c196847 100644
--- a/docs/plugins/html/gst-plugins-good-plugins-plugin-navigationtest.html
+++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-navigationtest.html
@@ -42,7 +42,7 @@
</tr>
<tr>
<td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
</tr>
<tr>
<td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-oss4.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-oss4.html
index 5f9db0d7..a100fb82 100644
--- a/docs/plugins/html/gst-plugins-good-plugins-plugin-oss4.html
+++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-oss4.html
@@ -42,7 +42,7 @@
</tr>
<tr>
<td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
</tr>
<tr>
<td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-ossaudio.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-ossaudio.html
index 0ff5ab28..ecbf7c8a 100644
--- a/docs/plugins/html/gst-plugins-good-plugins-plugin-ossaudio.html
+++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-ossaudio.html
@@ -42,7 +42,7 @@
</tr>
<tr>
<td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
</tr>
<tr>
<td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-png.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-png.html
index 833e2ee7..a4ae523f 100644
--- a/docs/plugins/html/gst-plugins-good-plugins-plugin-png.html
+++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-png.html
@@ -42,7 +42,7 @@
</tr>
<tr>
<td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
</tr>
<tr>
<td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-pulseaudio.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-pulseaudio.html
index 3443a87e..dd575028 100644
--- a/docs/plugins/html/gst-plugins-good-plugins-plugin-pulseaudio.html
+++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-pulseaudio.html
@@ -42,7 +42,7 @@
</tr>
<tr>
<td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
</tr>
<tr>
<td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-replaygain.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-replaygain.html
index 0e2a2b6b..adcbad2d 100644
--- a/docs/plugins/html/gst-plugins-good-plugins-plugin-replaygain.html
+++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-replaygain.html
@@ -42,7 +42,7 @@
</tr>
<tr>
<td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
</tr>
<tr>
<td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-rtp.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-rtp.html
index 4f58e14b..43f8077d 100644
--- a/docs/plugins/html/gst-plugins-good-plugins-plugin-rtp.html
+++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-rtp.html
@@ -42,7 +42,7 @@
</tr>
<tr>
<td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
</tr>
<tr>
<td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-rtpmanager.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-rtpmanager.html
index d8222e40..9fbe16f5 100644
--- a/docs/plugins/html/gst-plugins-good-plugins-plugin-rtpmanager.html
+++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-rtpmanager.html
@@ -42,7 +42,7 @@
</tr>
<tr>
<td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
</tr>
<tr>
<td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-rtsp.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-rtsp.html
index 0488126f..8ec448a4 100644
--- a/docs/plugins/html/gst-plugins-good-plugins-plugin-rtsp.html
+++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-rtsp.html
@@ -42,7 +42,7 @@
</tr>
<tr>
<td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
</tr>
<tr>
<td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-shapewipe.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-shapewipe.html
index db60d1fa..d2b546b4 100644
--- a/docs/plugins/html/gst-plugins-good-plugins-plugin-shapewipe.html
+++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-shapewipe.html
@@ -42,7 +42,7 @@
</tr>
<tr>
<td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
</tr>
<tr>
<td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-shout2send.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-shout2send.html
index cb2a76cd..f35781cb 100644
--- a/docs/plugins/html/gst-plugins-good-plugins-plugin-shout2send.html
+++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-shout2send.html
@@ -42,7 +42,7 @@
</tr>
<tr>
<td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
</tr>
<tr>
<td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-smpte.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-smpte.html
index 8f89301a..262d842b 100644
--- a/docs/plugins/html/gst-plugins-good-plugins-plugin-smpte.html
+++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-smpte.html
@@ -42,7 +42,7 @@
</tr>
<tr>
<td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
</tr>
<tr>
<td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-soup.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-soup.html
index a1da43d8..2a922c87 100644
--- a/docs/plugins/html/gst-plugins-good-plugins-plugin-soup.html
+++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-soup.html
@@ -42,7 +42,7 @@
</tr>
<tr>
<td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
</tr>
<tr>
<td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-spectrum.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-spectrum.html
index 68cf1ce6..3d79f291 100644
--- a/docs/plugins/html/gst-plugins-good-plugins-plugin-spectrum.html
+++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-spectrum.html
@@ -42,7 +42,7 @@
</tr>
<tr>
<td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
</tr>
<tr>
<td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-speex.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-speex.html
index c753741f..dfc720af 100644
--- a/docs/plugins/html/gst-plugins-good-plugins-plugin-speex.html
+++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-speex.html
@@ -42,7 +42,7 @@
</tr>
<tr>
<td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
</tr>
<tr>
<td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-taglib.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-taglib.html
index acd62cb4..fcc71325 100644
--- a/docs/plugins/html/gst-plugins-good-plugins-plugin-taglib.html
+++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-taglib.html
@@ -42,7 +42,7 @@
</tr>
<tr>
<td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
</tr>
<tr>
<td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-udp.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-udp.html
index e3323d9e..78a30806 100644
--- a/docs/plugins/html/gst-plugins-good-plugins-plugin-udp.html
+++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-udp.html
@@ -42,7 +42,7 @@
</tr>
<tr>
<td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
</tr>
<tr>
<td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-video4linux2.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-video4linux2.html
index 19526790..ff881ee1 100644
--- a/docs/plugins/html/gst-plugins-good-plugins-plugin-video4linux2.html
+++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-video4linux2.html
@@ -42,7 +42,7 @@
</tr>
<tr>
<td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
</tr>
<tr>
<td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-videobox.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-videobox.html
index e6441a26..e870e957 100644
--- a/docs/plugins/html/gst-plugins-good-plugins-plugin-videobox.html
+++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-videobox.html
@@ -42,7 +42,7 @@
</tr>
<tr>
<td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
</tr>
<tr>
<td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-videocrop.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-videocrop.html
index 4641104e..a3ca90ac 100644
--- a/docs/plugins/html/gst-plugins-good-plugins-plugin-videocrop.html
+++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-videocrop.html
@@ -42,7 +42,7 @@
</tr>
<tr>
<td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
</tr>
<tr>
<td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-videofilter.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-videofilter.html
index 11faec2e..86832770 100644
--- a/docs/plugins/html/gst-plugins-good-plugins-plugin-videofilter.html
+++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-videofilter.html
@@ -42,7 +42,7 @@
</tr>
<tr>
<td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
</tr>
<tr>
<td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-videomixer.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-videomixer.html
index 88d260dc..5de1cc9c 100644
--- a/docs/plugins/html/gst-plugins-good-plugins-plugin-videomixer.html
+++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-videomixer.html
@@ -42,7 +42,7 @@
</tr>
<tr>
<td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
</tr>
<tr>
<td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-vpx.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-vpx.html
index 098951c3..a36606e1 100644
--- a/docs/plugins/html/gst-plugins-good-plugins-plugin-vpx.html
+++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-vpx.html
@@ -42,7 +42,7 @@
</tr>
<tr>
<td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
</tr>
<tr>
<td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-wavenc.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-wavenc.html
index a092e7be..c7e38aa7 100644
--- a/docs/plugins/html/gst-plugins-good-plugins-plugin-wavenc.html
+++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-wavenc.html
@@ -42,7 +42,7 @@
</tr>
<tr>
<td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
</tr>
<tr>
<td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-wavpack.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-wavpack.html
index bc045a38..c9ec8ae0 100644
--- a/docs/plugins/html/gst-plugins-good-plugins-plugin-wavpack.html
+++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-wavpack.html
@@ -42,7 +42,7 @@
</tr>
<tr>
<td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
</tr>
<tr>
<td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-wavparse.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-wavparse.html
index 872ff60b..af68e0ef 100644
--- a/docs/plugins/html/gst-plugins-good-plugins-plugin-wavparse.html
+++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-wavparse.html
@@ -42,7 +42,7 @@
</tr>
<tr>
<td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
</tr>
<tr>
<td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-ximagesrc.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-ximagesrc.html
index dd4ffd97..1e98570d 100644
--- a/docs/plugins/html/gst-plugins-good-plugins-plugin-ximagesrc.html
+++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-ximagesrc.html
@@ -42,7 +42,7 @@
</tr>
<tr>
<td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
</tr>
<tr>
<td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-good-plugins-plugin-y4menc.html b/docs/plugins/html/gst-plugins-good-plugins-plugin-y4menc.html
index c1b2d516..7f85fd30 100644
--- a/docs/plugins/html/gst-plugins-good-plugins-plugin-y4menc.html
+++ b/docs/plugins/html/gst-plugins-good-plugins-plugin-y4menc.html
@@ -42,7 +42,7 @@
</tr>
<tr>
<td><p><span class="term">version</span></p></td>
-<td>1.3.1</td>
+<td>1.3.2</td>
</tr>
<tr>
<td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-good-plugins-rtpbin.html b/docs/plugins/html/gst-plugins-good-plugins-rtpbin.html
index 36b5d1dd..93226dcc 100644
--- a/docs/plugins/html/gst-plugins-good-plugins-rtpbin.html
+++ b/docs/plugins/html/gst-plugins-good-plugins-rtpbin.html
@@ -312,7 +312,7 @@ internal source and other sources.</p>
<a class="link" href="gst-plugins-good-plugins-rtpbin.html#GstRtpBin-request-rtp-decoder" title="The “request-rtp-decoder” signal"><span class="type">“request-rtp-decoder”</span></a>, <a class="link" href="gst-plugins-good-plugins-rtpbin.html#GstRtpBin-request-rtcp-encoder" title="The “request-rtcp-encoder” signal"><span class="type">“request-rtcp-encoder”</span></a> and
<a class="link" href="gst-plugins-good-plugins-rtpbin.html#GstRtpBin-request-rtp-decoder" title="The “request-rtp-decoder” signal"><span class="type">“request-rtp-decoder”</span></a>) to dynamically request for RTP and RTCP encoders
and decoders in order to support SRTP. The encoders must provide the pads
-rtp_sink_%d and rtp_src_%d for RTP and rtcp_sink_%d and rtcp_src_%d for
+rtp_sink_%u and rtp_src_%u for RTP and rtcp_sink_%u and rtcp_src_%u for
RTCP. The session number will be used in the pad name. The decoders must provide
rtp_sink and rtp_src for RTP and rtcp_sink and rtcp_src for RTCP. The decoders will
be placed before the <a class="link" href="gst-plugins-good-plugins-rtpsession.html#GstRtpSession"><span class="type">GstRtpSession</span></a> element, thus they must support SSRC demuxing
diff --git a/docs/plugins/html/gst-plugins-good-plugins-v4l2sink.html b/docs/plugins/html/gst-plugins-good-plugins-v4l2sink.html
index 1cb0524b..925069d9 100644
--- a/docs/plugins/html/gst-plugins-good-plugins-v4l2sink.html
+++ b/docs/plugins/html/gst-plugins-good-plugins-v4l2sink.html
@@ -287,7 +287,7 @@ GstV4l2Sink implements
</tr>
<tr>
<td><p><span class="term"></span></p></td>
-<td> video/x-raw, format=(string){ RGB15, RGB16, BGR, RGB, BGRx, xRGB, GRAY8, YVU9, YV12, YUY2, UYVY, Y42B, Y41B, NV12_64Z32, YUV9, I420, YVYU, NV21, NV12 }, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]</td>
+<td> video/x-raw, format=(string){ RGB15, RGB16, BGR, RGB, BGRx, BGRA, xRGB, ARGB, GRAY8, YVU9, YV12, YUY2, UYVY, Y42B, Y41B, NV12_64Z32, YUV9, I420, YVYU, NV21, NV12 }, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]</td>
</tr>
<tr>
<td><p><span class="term"></span></p></td>
diff --git a/docs/plugins/html/gst-plugins-good-plugins-v4l2src.html b/docs/plugins/html/gst-plugins-good-plugins-v4l2src.html
index 0087ace8..f90f3d28 100644
--- a/docs/plugins/html/gst-plugins-good-plugins-v4l2src.html
+++ b/docs/plugins/html/gst-plugins-good-plugins-v4l2src.html
@@ -268,7 +268,7 @@ GstV4l2Src implements
</tr>
<tr>
<td><p><span class="term"></span></p></td>
-<td> video/x-raw, format=(string){ RGB15, RGB16, BGR, RGB, BGRx, xRGB, GRAY8, YVU9, YV12, YUY2, UYVY, Y42B, Y41B, NV12_64Z32, YUV9, I420, YVYU, NV21, NV12 }, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]</td>
+<td> video/x-raw, format=(string){ RGB15, RGB16, BGR, RGB, BGRx, BGRA, xRGB, ARGB, GRAY8, YVU9, YV12, YUY2, UYVY, Y42B, Y41B, NV12_64Z32, YUV9, I420, YVYU, NV21, NV12 }, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]</td>
</tr>
<tr>
<td><p><span class="term"></span></p></td>
diff --git a/docs/plugins/html/index.html b/docs/plugins/html/index.html
index bc272f04..6c68353a 100644
--- a/docs/plugins/html/index.html
+++ b/docs/plugins/html/index.html
@@ -15,7 +15,7 @@
<div>
<div><table class="navigation" id="top" width="100%" cellpadding="2" cellspacing="0"><tr><th valign="middle"><p class="title">GStreamer Good Plugins 1.0 Plugins Reference Manual</p></th></tr></table></div>
<div><p class="releaseinfo">
- for GStreamer Good Plugins 1.0 (1.3.1)
+ for GStreamer Good Plugins 1.0 (1.3.2)
The latest version of this documentation can be found on-line at
<a class="ulink" href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-good/html/" target="_top">http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-good/html/</a>.
</p></div>
diff --git a/docs/plugins/inspect/plugin-1394.xml b/docs/plugins/inspect/plugin-1394.xml
index 4c60e18c..6d5b5083 100644
--- a/docs/plugins/inspect/plugin-1394.xml
+++ b/docs/plugins/inspect/plugin-1394.xml
@@ -3,7 +3,7 @@
<description>Source for video data via IEEE1394 interface</description>
<filename>../../ext/raw1394/.libs/libgst1394.so</filename>
<basename>libgst1394.so</basename>
- <version>1.3.1</version>
+ <version>1.3.2</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-aasink.xml b/docs/plugins/inspect/plugin-aasink.xml
index ab51066d..7a8a8612 100644
--- a/docs/plugins/inspect/plugin-aasink.xml
+++ b/docs/plugins/inspect/plugin-aasink.xml
@@ -3,7 +3,7 @@
<description>ASCII Art video sink</description>
<filename>../../ext/aalib/.libs/libgstaasink.so</filename>
<basename>libgstaasink.so</basename>
- <version>1.3.1</version>
+ <version>1.3.2</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-alaw.xml b/docs/plugins/inspect/plugin-alaw.xml
index a32dbb81..460e8d5b 100644
--- a/docs/plugins/inspect/plugin-alaw.xml
+++ b/docs/plugins/inspect/plugin-alaw.xml
@@ -3,7 +3,7 @@
<description>ALaw audio conversion routines</description>
<filename>../../gst/law/.libs/libgstalaw.so</filename>
<basename>libgstalaw.so</basename>
- <version>1.3.1</version>
+ <version>1.3.2</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-alpha.xml b/docs/plugins/inspect/plugin-alpha.xml
index 7f6c5a0a..4f05ef59 100644
--- a/docs/plugins/inspect/plugin-alpha.xml
+++ b/docs/plugins/inspect/plugin-alpha.xml
@@ -3,7 +3,7 @@
<description>adds an alpha channel to video - constant or via chroma-keying</description>
<filename>../../gst/alpha/.libs/libgstalpha.so</filename>
<basename>libgstalpha.so</basename>
- <version>1.3.1</version>
+ <version>1.3.2</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-alphacolor.xml b/docs/plugins/inspect/plugin-alphacolor.xml
index 02f284a6..59ea3560 100644
--- a/docs/plugins/inspect/plugin-alphacolor.xml
+++ b/docs/plugins/inspect/plugin-alphacolor.xml
@@ -3,7 +3,7 @@
<description>RGBA from/to AYUV colorspace conversion preserving the alpha channel</description>
<filename>../../gst/alpha/.libs/libgstalphacolor.so</filename>
<basename>libgstalphacolor.so</basename>
- <version>1.3.1</version>
+ <version>1.3.2</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-apetag.xml b/docs/plugins/inspect/plugin-apetag.xml
index fb04308e..3441857e 100644
--- a/docs/plugins/inspect/plugin-apetag.xml
+++ b/docs/plugins/inspect/plugin-apetag.xml
@@ -3,7 +3,7 @@
<description>APEv1/2 tag reader</description>
<filename>../../gst/apetag/.libs/libgstapetag.so</filename>
<basename>libgstapetag.so</basename>
- <version>1.3.1</version>
+ <version>1.3.2</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-audiofx.xml b/docs/plugins/inspect/plugin-audiofx.xml
index 2da24ab1..c7329c01 100644
--- a/docs/plugins/inspect/plugin-audiofx.xml
+++ b/docs/plugins/inspect/plugin-audiofx.xml
@@ -3,7 +3,7 @@
<description>Audio effects plugin</description>
<filename>../../gst/audiofx/.libs/libgstaudiofx.so</filename>
<basename>libgstaudiofx.so</basename>
- <version>1.3.1</version>
+ <version>1.3.2</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-audioparsers.xml b/docs/plugins/inspect/plugin-audioparsers.xml
index 7a3bf28e..34eb617f 100644
--- a/docs/plugins/inspect/plugin-audioparsers.xml
+++ b/docs/plugins/inspect/plugin-audioparsers.xml
@@ -3,7 +3,7 @@
<description>Parsers for various audio formats</description>
<filename>../../gst/audioparsers/.libs/libgstaudioparsers.so</filename>
<basename>libgstaudioparsers.so</basename>
- <version>1.3.1</version>
+ <version>1.3.2</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-auparse.xml b/docs/plugins/inspect/plugin-auparse.xml
index 677bfeab..d4efc2da 100644
--- a/docs/plugins/inspect/plugin-auparse.xml
+++ b/docs/plugins/inspect/plugin-auparse.xml
@@ -3,7 +3,7 @@
<description>parses au streams</description>
<filename>../../gst/auparse/.libs/libgstauparse.so</filename>
<basename>libgstauparse.so</basename>
- <version>1.3.1</version>
+ <version>1.3.2</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-autodetect.xml b/docs/plugins/inspect/plugin-autodetect.xml
index 962b7074..fd32c113 100644
--- a/docs/plugins/inspect/plugin-autodetect.xml
+++ b/docs/plugins/inspect/plugin-autodetect.xml
@@ -3,7 +3,7 @@
<description>Plugin contains auto-detection plugins for video/audio in- and outputs</description>
<filename>../../gst/autodetect/.libs/libgstautodetect.so</filename>
<basename>libgstautodetect.so</basename>
- <version>1.3.1</version>
+ <version>1.3.2</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-avi.xml b/docs/plugins/inspect/plugin-avi.xml
index f03c50a5..7b3810e8 100644
--- a/docs/plugins/inspect/plugin-avi.xml
+++ b/docs/plugins/inspect/plugin-avi.xml
@@ -3,7 +3,7 @@
<description>AVI stream handling</description>
<filename>../../gst/avi/.libs/libgstavi.so</filename>
<basename>libgstavi.so</basename>
- <version>1.3.1</version>
+ <version>1.3.2</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-cacasink.xml b/docs/plugins/inspect/plugin-cacasink.xml
index 7fa81fd0..f1f2caa6 100644
--- a/docs/plugins/inspect/plugin-cacasink.xml
+++ b/docs/plugins/inspect/plugin-cacasink.xml
@@ -3,7 +3,7 @@
<description>Colored ASCII Art video sink</description>
<filename>../../ext/libcaca/.libs/libgstcacasink.so</filename>
<basename>libgstcacasink.so</basename>
- <version>1.3.1</version>
+ <version>1.3.2</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-cairo.xml b/docs/plugins/inspect/plugin-cairo.xml
index 59999838..2da90e0b 100644
--- a/docs/plugins/inspect/plugin-cairo.xml
+++ b/docs/plugins/inspect/plugin-cairo.xml
@@ -3,7 +3,7 @@
<description>Cairo-based elements</description>
<filename>../../ext/cairo/.libs/libgstcairo.so</filename>
<basename>libgstcairo.so</basename>
- <version>1.3.1</version>
+ <version>1.3.2</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-cutter.xml b/docs/plugins/inspect/plugin-cutter.xml
index cb9691a1..37803d90 100644
--- a/docs/plugins/inspect/plugin-cutter.xml
+++ b/docs/plugins/inspect/plugin-cutter.xml
@@ -3,7 +3,7 @@
<description>Audio Cutter to split audio into non-silent bits</description>
<filename>../../gst/cutter/.libs/libgstcutter.so</filename>
<basename>libgstcutter.so</basename>
- <version>1.3.1</version>
+ <version>1.3.2</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-debug.xml b/docs/plugins/inspect/plugin-debug.xml
index 3f845f46..9d844f70 100644
--- a/docs/plugins/inspect/plugin-debug.xml
+++ b/docs/plugins/inspect/plugin-debug.xml
@@ -3,7 +3,7 @@
<description>elements for testing and debugging</description>
<filename>../../gst/debugutils/.libs/libgstdebug.so</filename>
<basename>libgstdebug.so</basename>
- <version>1.3.1</version>
+ <version>1.3.2</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-deinterlace.xml b/docs/plugins/inspect/plugin-deinterlace.xml
index 3e6d61f6..97f3981e 100644
--- a/docs/plugins/inspect/plugin-deinterlace.xml
+++ b/docs/plugins/inspect/plugin-deinterlace.xml
@@ -3,7 +3,7 @@
<description>Deinterlacer</description>
<filename>../../gst/deinterlace/.libs/libgstdeinterlace.so</filename>
<basename>libgstdeinterlace.so</basename>
- <version>1.3.1</version>
+ <version>1.3.2</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-dtmf.xml b/docs/plugins/inspect/plugin-dtmf.xml
index 30d1c4fd..92968190 100644
--- a/docs/plugins/inspect/plugin-dtmf.xml
+++ b/docs/plugins/inspect/plugin-dtmf.xml
@@ -3,7 +3,7 @@
<description>DTMF plugins</description>
<filename>../../gst/dtmf/.libs/libgstdtmf.so</filename>
<basename>libgstdtmf.so</basename>
- <version>1.3.1</version>
+ <version>1.3.2</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-dv.xml b/docs/plugins/inspect/plugin-dv.xml
index 5a516fb9..7a34a78c 100644
--- a/docs/plugins/inspect/plugin-dv.xml
+++ b/docs/plugins/inspect/plugin-dv.xml
@@ -3,7 +3,7 @@
<description>DV demuxer and decoder based on libdv (libdv.sf.net)</description>
<filename>../../ext/dv/.libs/libgstdv.so</filename>
<basename>libgstdv.so</basename>
- <version>1.3.1</version>
+ <version>1.3.2</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-effectv.xml b/docs/plugins/inspect/plugin-effectv.xml
index a0c087d3..290640f9 100644
--- a/docs/plugins/inspect/plugin-effectv.xml
+++ b/docs/plugins/inspect/plugin-effectv.xml
@@ -3,7 +3,7 @@
<description>effect plugins from the effectv project</description>
<filename>../../gst/effectv/.libs/libgsteffectv.so</filename>
<basename>libgsteffectv.so</basename>
- <version>1.3.1</version>
+ <version>1.3.2</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-equalizer.xml b/docs/plugins/inspect/plugin-equalizer.xml
index 013dafe4..ae4a53f0 100644
--- a/docs/plugins/inspect/plugin-equalizer.xml
+++ b/docs/plugins/inspect/plugin-equalizer.xml
@@ -3,7 +3,7 @@
<description>GStreamer audio equalizers</description>
<filename>../../gst/equalizer/.libs/libgstequalizer.so</filename>
<basename>libgstequalizer.so</basename>
- <version>1.3.1</version>
+ <version>1.3.2</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-flac.xml b/docs/plugins/inspect/plugin-flac.xml
index ab52b4f4..6121817e 100644
--- a/docs/plugins/inspect/plugin-flac.xml
+++ b/docs/plugins/inspect/plugin-flac.xml
@@ -3,7 +3,7 @@
<description>The FLAC Lossless compressor Codec</description>
<filename>../../ext/flac/.libs/libgstflac.so</filename>
<basename>libgstflac.so</basename>
- <version>1.3.1</version>
+ <version>1.3.2</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-flv.xml b/docs/plugins/inspect/plugin-flv.xml
index f0dd215c..3fd91453 100644
--- a/docs/plugins/inspect/plugin-flv.xml
+++ b/docs/plugins/inspect/plugin-flv.xml
@@ -3,7 +3,7 @@
<description>FLV muxing and demuxing plugin</description>
<filename>../../gst/flv/.libs/libgstflv.so</filename>
<basename>libgstflv.so</basename>
- <version>1.3.1</version>
+ <version>1.3.2</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-flxdec.xml b/docs/plugins/inspect/plugin-flxdec.xml
index 27602f25..08088de1 100644
--- a/docs/plugins/inspect/plugin-flxdec.xml
+++ b/docs/plugins/inspect/plugin-flxdec.xml
@@ -3,7 +3,7 @@
<description>FLC/FLI/FLX video decoder</description>
<filename>../../gst/flx/.libs/libgstflxdec.so</filename>
<basename>libgstflxdec.so</basename>
- <version>1.3.1</version>
+ <version>1.3.2</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-gdkpixbuf.xml b/docs/plugins/inspect/plugin-gdkpixbuf.xml
index 67042977..288e74ce 100644
--- a/docs/plugins/inspect/plugin-gdkpixbuf.xml
+++ b/docs/plugins/inspect/plugin-gdkpixbuf.xml
@@ -3,7 +3,7 @@
<description>GdkPixbuf-based image decoder, overlay and sink</description>
<filename>../../ext/gdk_pixbuf/.libs/libgstgdkpixbuf.so</filename>
<basename>libgstgdkpixbuf.so</basename>
- <version>1.3.1</version>
+ <version>1.3.2</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-goom.xml b/docs/plugins/inspect/plugin-goom.xml
index 0728eff8..947229cb 100644
--- a/docs/plugins/inspect/plugin-goom.xml
+++ b/docs/plugins/inspect/plugin-goom.xml
@@ -3,7 +3,7 @@
<description>GOOM visualization filter</description>
<filename>../../gst/goom/.libs/libgstgoom.so</filename>
<basename>libgstgoom.so</basename>
- <version>1.3.1</version>
+ <version>1.3.2</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-goom2k1.xml b/docs/plugins/inspect/plugin-goom2k1.xml
index 070ad509..5e97c084 100644
--- a/docs/plugins/inspect/plugin-goom2k1.xml
+++ b/docs/plugins/inspect/plugin-goom2k1.xml
@@ -3,7 +3,7 @@
<description>GOOM 2k1 visualization filter</description>
<filename>../../gst/goom2k1/.libs/libgstgoom2k1.so</filename>
<basename>libgstgoom2k1.so</basename>
- <version>1.3.1</version>
+ <version>1.3.2</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-icydemux.xml b/docs/plugins/inspect/plugin-icydemux.xml
index f90866f9..66c3cdf7 100644
--- a/docs/plugins/inspect/plugin-icydemux.xml
+++ b/docs/plugins/inspect/plugin-icydemux.xml
@@ -3,7 +3,7 @@
<description>Demux ICY tags from a stream</description>
<filename>../../gst/icydemux/.libs/libgsticydemux.so</filename>
<basename>libgsticydemux.so</basename>
- <version>1.3.1</version>
+ <version>1.3.2</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-id3demux.xml b/docs/plugins/inspect/plugin-id3demux.xml
index 1df22eb3..1fe4a1c2 100644
--- a/docs/plugins/inspect/plugin-id3demux.xml
+++ b/docs/plugins/inspect/plugin-id3demux.xml
@@ -3,7 +3,7 @@
<description>Demux ID3v1 and ID3v2 tags from a file</description>
<filename>../../gst/id3demux/.libs/libgstid3demux.so</filename>
<basename>libgstid3demux.so</basename>
- <version>1.3.1</version>
+ <version>1.3.2</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-imagefreeze.xml b/docs/plugins/inspect/plugin-imagefreeze.xml
index 895f2291..5dd77d55 100644
--- a/docs/plugins/inspect/plugin-imagefreeze.xml
+++ b/docs/plugins/inspect/plugin-imagefreeze.xml
@@ -3,7 +3,7 @@
<description>Still frame stream generator</description>
<filename>../../gst/imagefreeze/.libs/libgstimagefreeze.so</filename>
<basename>libgstimagefreeze.so</basename>
- <version>1.3.1</version>
+ <version>1.3.2</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-interleave.xml b/docs/plugins/inspect/plugin-interleave.xml
index eb688cbf..951ff24a 100644
--- a/docs/plugins/inspect/plugin-interleave.xml
+++ b/docs/plugins/inspect/plugin-interleave.xml
@@ -3,7 +3,7 @@
<description>Audio interleaver/deinterleaver</description>
<filename>../../gst/interleave/.libs/libgstinterleave.so</filename>
<basename>libgstinterleave.so</basename>
- <version>1.3.1</version>
+ <version>1.3.2</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-isomp4.xml b/docs/plugins/inspect/plugin-isomp4.xml
index 937eecb8..b1e074a6 100644
--- a/docs/plugins/inspect/plugin-isomp4.xml
+++ b/docs/plugins/inspect/plugin-isomp4.xml
@@ -3,7 +3,7 @@
<description>ISO base media file format support (mp4, 3gpp, qt, mj2)</description>
<filename>../../gst/isomp4/.libs/libgstisomp4.so</filename>
<basename>libgstisomp4.so</basename>
- <version>1.3.1</version>
+ <version>1.3.2</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-jack.xml b/docs/plugins/inspect/plugin-jack.xml
index 1deb50a3..0eaccd05 100644
--- a/docs/plugins/inspect/plugin-jack.xml
+++ b/docs/plugins/inspect/plugin-jack.xml
@@ -3,7 +3,7 @@
<description>JACK audio elements</description>
<filename>../../ext/jack/.libs/libgstjack.so</filename>
<basename>libgstjack.so</basename>
- <version>1.3.1</version>
+ <version>1.3.2</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-jpeg.xml b/docs/plugins/inspect/plugin-jpeg.xml
index c4412d2c..f3ac3f28 100644
--- a/docs/plugins/inspect/plugin-jpeg.xml
+++ b/docs/plugins/inspect/plugin-jpeg.xml
@@ -3,7 +3,7 @@
<description>JPeg plugin library</description>
<filename>../../ext/jpeg/.libs/libgstjpeg.so</filename>
<basename>libgstjpeg.so</basename>
- <version>1.3.1</version>
+ <version>1.3.2</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-level.xml b/docs/plugins/inspect/plugin-level.xml
index 6d36d51c..fd065621 100644
--- a/docs/plugins/inspect/plugin-level.xml
+++ b/docs/plugins/inspect/plugin-level.xml
@@ -3,7 +3,7 @@
<description>Audio level plugin</description>
<filename>../../gst/level/.libs/libgstlevel.so</filename>
<basename>libgstlevel.so</basename>
- <version>1.3.1</version>
+ <version>1.3.2</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-matroska.xml b/docs/plugins/inspect/plugin-matroska.xml
index 93a70a46..93775db2 100644
--- a/docs/plugins/inspect/plugin-matroska.xml
+++ b/docs/plugins/inspect/plugin-matroska.xml
@@ -3,7 +3,7 @@
<description>Matroska and WebM stream handling</description>
<filename>../../gst/matroska/.libs/libgstmatroska.so</filename>
<basename>libgstmatroska.so</basename>
- <version>1.3.1</version>
+ <version>1.3.2</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-mulaw.xml b/docs/plugins/inspect/plugin-mulaw.xml
index 5e0e28ea..46525a99 100644
--- a/docs/plugins/inspect/plugin-mulaw.xml
+++ b/docs/plugins/inspect/plugin-mulaw.xml
@@ -3,7 +3,7 @@
<description>MuLaw audio conversion routines</description>
<filename>../../gst/law/.libs/libgstmulaw.so</filename>
<basename>libgstmulaw.so</basename>
- <version>1.3.1</version>
+ <version>1.3.2</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-multifile.xml b/docs/plugins/inspect/plugin-multifile.xml
index c4554e52..b3a6fa7c 100644
--- a/docs/plugins/inspect/plugin-multifile.xml
+++ b/docs/plugins/inspect/plugin-multifile.xml
@@ -3,7 +3,7 @@
<description>Reads/Writes buffers from/to sequentially named files</description>
<filename>../../gst/multifile/.libs/libgstmultifile.so</filename>
<basename>libgstmultifile.so</basename>
- <version>1.3.1</version>
+ <version>1.3.2</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-multipart.xml b/docs/plugins/inspect/plugin-multipart.xml
index 82dbf7fa..14e937df 100644
--- a/docs/plugins/inspect/plugin-multipart.xml
+++ b/docs/plugins/inspect/plugin-multipart.xml
@@ -3,7 +3,7 @@
<description>multipart stream manipulation</description>
<filename>../../gst/multipart/.libs/libgstmultipart.so</filename>
<basename>libgstmultipart.so</basename>
- <version>1.3.1</version>
+ <version>1.3.2</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-navigationtest.xml b/docs/plugins/inspect/plugin-navigationtest.xml
index 0af9cd2d..ae5da569 100644
--- a/docs/plugins/inspect/plugin-navigationtest.xml
+++ b/docs/plugins/inspect/plugin-navigationtest.xml
@@ -3,7 +3,7 @@
<description>Template for a video filter</description>
<filename>../../gst/debugutils/.libs/libgstnavigationtest.so</filename>
<basename>libgstnavigationtest.so</basename>
- <version>1.3.1</version>
+ <version>1.3.2</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-oss4.xml b/docs/plugins/inspect/plugin-oss4.xml
index ec105413..933a015c 100644
--- a/docs/plugins/inspect/plugin-oss4.xml
+++ b/docs/plugins/inspect/plugin-oss4.xml
@@ -3,7 +3,7 @@
<description>Open Sound System (OSS) version 4 support for GStreamer</description>
<filename>../../sys/oss4/.libs/libgstoss4audio.so</filename>
<basename>libgstoss4audio.so</basename>
- <version>1.3.1</version>
+ <version>1.3.2</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-ossaudio.xml b/docs/plugins/inspect/plugin-ossaudio.xml
index 499f3ed4..25106a15 100644
--- a/docs/plugins/inspect/plugin-ossaudio.xml
+++ b/docs/plugins/inspect/plugin-ossaudio.xml
@@ -3,7 +3,7 @@
<description>OSS (Open Sound System) support for GStreamer</description>
<filename>../../sys/oss/.libs/libgstossaudio.so</filename>
<basename>libgstossaudio.so</basename>
- <version>1.3.1</version>
+ <version>1.3.2</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-png.xml b/docs/plugins/inspect/plugin-png.xml
index ca0d4b39..6d685859 100644
--- a/docs/plugins/inspect/plugin-png.xml
+++ b/docs/plugins/inspect/plugin-png.xml
@@ -3,7 +3,7 @@
<description>PNG plugin library</description>
<filename>../../ext/libpng/.libs/libgstpng.so</filename>
<basename>libgstpng.so</basename>
- <version>1.3.1</version>
+ <version>1.3.2</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-pulseaudio.xml b/docs/plugins/inspect/plugin-pulseaudio.xml
index 254ad244..aeb3608e 100644
--- a/docs/plugins/inspect/plugin-pulseaudio.xml
+++ b/docs/plugins/inspect/plugin-pulseaudio.xml
@@ -3,7 +3,7 @@
<description>PulseAudio plugin library</description>
<filename>../../ext/pulse/.libs/libgstpulse.so</filename>
<basename>libgstpulse.so</basename>
- <version>1.3.1</version>
+ <version>1.3.2</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-replaygain.xml b/docs/plugins/inspect/plugin-replaygain.xml
index a9255efd..5c0fad57 100644
--- a/docs/plugins/inspect/plugin-replaygain.xml
+++ b/docs/plugins/inspect/plugin-replaygain.xml
@@ -3,7 +3,7 @@
<description>ReplayGain volume normalization</description>
<filename>../../gst/replaygain/.libs/libgstreplaygain.so</filename>
<basename>libgstreplaygain.so</basename>
- <version>1.3.1</version>
+ <version>1.3.2</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-rtp.xml b/docs/plugins/inspect/plugin-rtp.xml
index e628c7b0..4762cccf 100644
--- a/docs/plugins/inspect/plugin-rtp.xml
+++ b/docs/plugins/inspect/plugin-rtp.xml
@@ -3,7 +3,7 @@
<description>Real-time protocol plugins</description>
<filename>../../gst/rtp/.libs/libgstrtp.so</filename>
<basename>libgstrtp.so</basename>
- <version>1.3.1</version>
+ <version>1.3.2</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-rtpmanager.xml b/docs/plugins/inspect/plugin-rtpmanager.xml
index 4d4b69e0..0f53304e 100644
--- a/docs/plugins/inspect/plugin-rtpmanager.xml
+++ b/docs/plugins/inspect/plugin-rtpmanager.xml
@@ -3,7 +3,7 @@
<description>RTP session management plugin library</description>
<filename>../../gst/rtpmanager/.libs/libgstrtpmanager.so</filename>
<basename>libgstrtpmanager.so</basename>
- <version>1.3.1</version>
+ <version>1.3.2</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-rtsp.xml b/docs/plugins/inspect/plugin-rtsp.xml
index 431a76c6..d2db8079 100644
--- a/docs/plugins/inspect/plugin-rtsp.xml
+++ b/docs/plugins/inspect/plugin-rtsp.xml
@@ -3,7 +3,7 @@
<description>transfer data via RTSP</description>
<filename>../../gst/rtsp/.libs/libgstrtsp.so</filename>
<basename>libgstrtsp.so</basename>
- <version>1.3.1</version>
+ <version>1.3.2</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-shapewipe.xml b/docs/plugins/inspect/plugin-shapewipe.xml
index ffaa86db..0cf09999 100644
--- a/docs/plugins/inspect/plugin-shapewipe.xml
+++ b/docs/plugins/inspect/plugin-shapewipe.xml
@@ -3,7 +3,7 @@
<description>Shape Wipe transition filter</description>
<filename>../../gst/shapewipe/.libs/libgstshapewipe.so</filename>
<basename>libgstshapewipe.so</basename>
- <version>1.3.1</version>
+ <version>1.3.2</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-shout2send.xml b/docs/plugins/inspect/plugin-shout2send.xml
index ea7de39b..6e4f2c79 100644
--- a/docs/plugins/inspect/plugin-shout2send.xml
+++ b/docs/plugins/inspect/plugin-shout2send.xml
@@ -3,7 +3,7 @@
<description>Sends data to an icecast server using libshout2</description>
<filename>../../ext/shout2/.libs/libgstshout2.so</filename>
<basename>libgstshout2.so</basename>
- <version>1.3.1</version>
+ <version>1.3.2</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>libshout2</package>
diff --git a/docs/plugins/inspect/plugin-smpte.xml b/docs/plugins/inspect/plugin-smpte.xml
index 880784c5..148eaa94 100644
--- a/docs/plugins/inspect/plugin-smpte.xml
+++ b/docs/plugins/inspect/plugin-smpte.xml
@@ -3,7 +3,7 @@
<description>Apply the standard SMPTE transitions on video images</description>
<filename>../../gst/smpte/.libs/libgstsmpte.so</filename>
<basename>libgstsmpte.so</basename>
- <version>1.3.1</version>
+ <version>1.3.2</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-soup.xml b/docs/plugins/inspect/plugin-soup.xml
index 57025b42..a6aaa5f1 100644
--- a/docs/plugins/inspect/plugin-soup.xml
+++ b/docs/plugins/inspect/plugin-soup.xml
@@ -3,7 +3,7 @@
<description>libsoup HTTP client src/sink</description>
<filename>../../ext/soup/.libs/libgstsouphttpsrc.so</filename>
<basename>libgstsouphttpsrc.so</basename>
- <version>1.3.1</version>
+ <version>1.3.2</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-spectrum.xml b/docs/plugins/inspect/plugin-spectrum.xml
index 731eeae7..fa2bc27e 100644
--- a/docs/plugins/inspect/plugin-spectrum.xml
+++ b/docs/plugins/inspect/plugin-spectrum.xml
@@ -3,7 +3,7 @@
<description>Run an FFT on the audio signal, output spectrum data</description>
<filename>../../gst/spectrum/.libs/libgstspectrum.so</filename>
<basename>libgstspectrum.so</basename>
- <version>1.3.1</version>
+ <version>1.3.2</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-speex.xml b/docs/plugins/inspect/plugin-speex.xml
index f782108d..d548ee62 100644
--- a/docs/plugins/inspect/plugin-speex.xml
+++ b/docs/plugins/inspect/plugin-speex.xml
@@ -3,7 +3,7 @@
<description>Speex plugin library</description>
<filename>../../ext/speex/.libs/libgstspeex.so</filename>
<basename>libgstspeex.so</basename>
- <version>1.3.1</version>
+ <version>1.3.2</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-taglib.xml b/docs/plugins/inspect/plugin-taglib.xml
index f8bf15c8..e2df20f3 100644
--- a/docs/plugins/inspect/plugin-taglib.xml
+++ b/docs/plugins/inspect/plugin-taglib.xml
@@ -3,7 +3,7 @@
<description>Tag writing plug-in based on taglib</description>
<filename>../../ext/taglib/.libs/libgsttaglib.so</filename>
<basename>libgsttaglib.so</basename>
- <version>1.3.1</version>
+ <version>1.3.2</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-udp.xml b/docs/plugins/inspect/plugin-udp.xml
index 11473180..9a714dc6 100644
--- a/docs/plugins/inspect/plugin-udp.xml
+++ b/docs/plugins/inspect/plugin-udp.xml
@@ -3,7 +3,7 @@
<description>transfer data via UDP</description>
<filename>../../gst/udp/.libs/libgstudp.so</filename>
<basename>libgstudp.so</basename>
- <version>1.3.1</version>
+ <version>1.3.2</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-video4linux2.xml b/docs/plugins/inspect/plugin-video4linux2.xml
index e74cc81f..6b7f2e1b 100644
--- a/docs/plugins/inspect/plugin-video4linux2.xml
+++ b/docs/plugins/inspect/plugin-video4linux2.xml
@@ -3,7 +3,7 @@
<description>elements for Video 4 Linux</description>
<filename>../../sys/v4l2/.libs/libgstvideo4linux2.so</filename>
<basename>libgstvideo4linux2.so</basename>
- <version>1.3.1</version>
+ <version>1.3.2</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins source release</package>
@@ -29,7 +29,7 @@
<name>sink</name>
<direction>sink</direction>
<presence>always</presence>
- <details>image/jpeg; video/mpeg, mpegversion=(int)4, systemstream=(boolean)false; video/mpeg, mpegversion=(int)2; video/mpegts, systemstream=(boolean)true; video/x-bayer, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]; video/x-dv, systemstream=(boolean)true; video/x-h263, variant=(string)itu; video/x-h264, stream-format=(string)byte-stream, alignment=(string)au; video/x-pwc1, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]; video/x-pwc2, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]; video/x-raw, format=(string){ RGB15, RGB16, BGR, RGB, BGRx, xRGB, GRAY8, YVU9, YV12, YUY2, UYVY, Y42B, Y41B, NV12_64Z32, YUV9, I420, YVYU, NV21, NV12 }, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]; video/x-sonix, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]; video/x-vp8</details>
+ <details>image/jpeg; video/mpeg, mpegversion=(int)4, systemstream=(boolean)false; video/mpeg, mpegversion=(int)2; video/mpegts, systemstream=(boolean)true; video/x-bayer, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]; video/x-dv, systemstream=(boolean)true; video/x-h263, variant=(string)itu; video/x-h264, stream-format=(string)byte-stream, alignment=(string)au; video/x-pwc1, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]; video/x-pwc2, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]; video/x-raw, format=(string){ RGB15, RGB16, BGR, RGB, BGRx, BGRA, xRGB, ARGB, GRAY8, YVU9, YV12, YUY2, UYVY, Y42B, Y41B, NV12_64Z32, YUV9, I420, YVYU, NV21, NV12 }, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]; video/x-sonix, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]; video/x-vp8</details>
</caps>
</pads>
</element>
@@ -44,7 +44,7 @@
<name>src</name>
<direction>source</direction>
<presence>always</presence>
- <details>image/jpeg; video/mpeg, mpegversion=(int)4, systemstream=(boolean)false; video/mpeg, mpegversion=(int)2; video/mpegts, systemstream=(boolean)true; video/x-bayer, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]; video/x-dv, systemstream=(boolean)true; video/x-h263, variant=(string)itu; video/x-h264, stream-format=(string)byte-stream, alignment=(string)au; video/x-pwc1, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]; video/x-pwc2, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]; video/x-raw, format=(string){ RGB15, RGB16, BGR, RGB, BGRx, xRGB, GRAY8, YVU9, YV12, YUY2, UYVY, Y42B, Y41B, NV12_64Z32, YUV9, I420, YVYU, NV21, NV12 }, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]; video/x-sonix, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]; video/x-vp8</details>
+ <details>image/jpeg; video/mpeg, mpegversion=(int)4, systemstream=(boolean)false; video/mpeg, mpegversion=(int)2; video/mpegts, systemstream=(boolean)true; video/x-bayer, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]; video/x-dv, systemstream=(boolean)true; video/x-h263, variant=(string)itu; video/x-h264, stream-format=(string)byte-stream, alignment=(string)au; video/x-pwc1, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]; video/x-pwc2, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]; video/x-raw, format=(string){ RGB15, RGB16, BGR, RGB, BGRx, BGRA, xRGB, ARGB, GRAY8, YVU9, YV12, YUY2, UYVY, Y42B, Y41B, NV12_64Z32, YUV9, I420, YVYU, NV21, NV12 }, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]; video/x-sonix, width=(int)[ 1, 32768 ], height=(int)[ 1, 32768 ], framerate=(fraction)[ 0/1, 100/1 ]; video/x-vp8</details>
</caps>
</pads>
</element>
diff --git a/docs/plugins/inspect/plugin-videobox.xml b/docs/plugins/inspect/plugin-videobox.xml
index 490f960b..cbaa0e13 100644
--- a/docs/plugins/inspect/plugin-videobox.xml
+++ b/docs/plugins/inspect/plugin-videobox.xml
@@ -3,7 +3,7 @@
<description>resizes a video by adding borders or cropping</description>
<filename>../../gst/videobox/.libs/libgstvideobox.so</filename>
<basename>libgstvideobox.so</basename>
- <version>1.3.1</version>
+ <version>1.3.2</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-videocrop.xml b/docs/plugins/inspect/plugin-videocrop.xml
index f213c189..55ff1fba 100644
--- a/docs/plugins/inspect/plugin-videocrop.xml
+++ b/docs/plugins/inspect/plugin-videocrop.xml
@@ -3,7 +3,7 @@
<description>Crops video into a user-defined region</description>
<filename>../../gst/videocrop/.libs/libgstvideocrop.so</filename>
<basename>libgstvideocrop.so</basename>
- <version>1.3.1</version>
+ <version>1.3.2</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-videofilter.xml b/docs/plugins/inspect/plugin-videofilter.xml
index a58165e8..916ae609 100644
--- a/docs/plugins/inspect/plugin-videofilter.xml
+++ b/docs/plugins/inspect/plugin-videofilter.xml
@@ -3,7 +3,7 @@
<description>Video filters plugin</description>
<filename>../../gst/videofilter/.libs/libgstvideofilter.so</filename>
<basename>libgstvideofilter.so</basename>
- <version>1.3.1</version>
+ <version>1.3.2</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-videomixer.xml b/docs/plugins/inspect/plugin-videomixer.xml
index 0526574d..4dde821f 100644
--- a/docs/plugins/inspect/plugin-videomixer.xml
+++ b/docs/plugins/inspect/plugin-videomixer.xml
@@ -3,7 +3,7 @@
<description>Video mixer</description>
<filename>../../gst/videomixer/.libs/libgstvideomixer.so</filename>
<basename>libgstvideomixer.so</basename>
- <version>1.3.1</version>
+ <version>1.3.2</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-vpx.xml b/docs/plugins/inspect/plugin-vpx.xml
index 7338cb6a..317fa3a3 100644
--- a/docs/plugins/inspect/plugin-vpx.xml
+++ b/docs/plugins/inspect/plugin-vpx.xml
@@ -3,7 +3,7 @@
<description>VP8 plugin</description>
<filename>../../ext/vpx/.libs/libgstvpx.so</filename>
<basename>libgstvpx.so</basename>
- <version>1.3.1</version>
+ <version>1.3.2</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-wavenc.xml b/docs/plugins/inspect/plugin-wavenc.xml
index 59d0e4b5..8c585e4f 100644
--- a/docs/plugins/inspect/plugin-wavenc.xml
+++ b/docs/plugins/inspect/plugin-wavenc.xml
@@ -3,7 +3,7 @@
<description>Encode raw audio into WAV</description>
<filename>../../gst/wavenc/.libs/libgstwavenc.so</filename>
<basename>libgstwavenc.so</basename>
- <version>1.3.1</version>
+ <version>1.3.2</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-wavpack.xml b/docs/plugins/inspect/plugin-wavpack.xml
index 8a22c04f..37324dff 100644
--- a/docs/plugins/inspect/plugin-wavpack.xml
+++ b/docs/plugins/inspect/plugin-wavpack.xml
@@ -3,7 +3,7 @@
<description>Wavpack lossless/lossy audio format handling</description>
<filename>../../ext/wavpack/.libs/libgstwavpack.so</filename>
<basename>libgstwavpack.so</basename>
- <version>1.3.1</version>
+ <version>1.3.2</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-wavparse.xml b/docs/plugins/inspect/plugin-wavparse.xml
index b6784d56..a5a34f47 100644
--- a/docs/plugins/inspect/plugin-wavparse.xml
+++ b/docs/plugins/inspect/plugin-wavparse.xml
@@ -3,7 +3,7 @@
<description>Parse a .wav file into raw audio</description>
<filename>../../gst/wavparse/.libs/libgstwavparse.so</filename>
<basename>libgstwavparse.so</basename>
- <version>1.3.1</version>
+ <version>1.3.2</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-ximagesrc.xml b/docs/plugins/inspect/plugin-ximagesrc.xml
index 4b240e18..4452ef5e 100644
--- a/docs/plugins/inspect/plugin-ximagesrc.xml
+++ b/docs/plugins/inspect/plugin-ximagesrc.xml
@@ -3,7 +3,7 @@
<description>X11 video input plugin using standard Xlib calls</description>
<filename>../../sys/ximage/.libs/libgstximagesrc.so</filename>
<basename>libgstximagesrc.so</basename>
- <version>1.3.1</version>
+ <version>1.3.2</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-y4menc.xml b/docs/plugins/inspect/plugin-y4menc.xml
index e7359a24..aa3ee5cc 100644
--- a/docs/plugins/inspect/plugin-y4menc.xml
+++ b/docs/plugins/inspect/plugin-y4menc.xml
@@ -3,7 +3,7 @@
<description>Encodes a YUV frame into the yuv4mpeg format (mjpegtools)</description>
<filename>../../gst/y4m/.libs/libgsty4menc.so</filename>
<basename>libgsty4menc.so</basename>
- <version>1.3.1</version>
+ <version>1.3.2</version>
<license>LGPL</license>
<source>gst-plugins-good</source>
<package>GStreamer Good Plug-ins source release</package>
diff --git a/ext/Makefile.in b/ext/Makefile.in
index 82643c0d..d0bc90b2 100644
--- a/ext/Makefile.in
+++ b/ext/Makefile.in
@@ -107,6 +107,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/ext/aalib/Makefile.in b/ext/aalib/Makefile.in
index 6b9cf4fd..11a3451f 100644
--- a/ext/aalib/Makefile.in
+++ b/ext/aalib/Makefile.in
@@ -104,6 +104,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/ext/cairo/Makefile.in b/ext/cairo/Makefile.in
index 1635d8de..0d13c0d3 100644
--- a/ext/cairo/Makefile.in
+++ b/ext/cairo/Makefile.in
@@ -104,6 +104,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/ext/dv/Makefile.in b/ext/dv/Makefile.in
index 96980447..f1da88f2 100644
--- a/ext/dv/Makefile.in
+++ b/ext/dv/Makefile.in
@@ -106,6 +106,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/ext/flac/Makefile.in b/ext/flac/Makefile.in
index 3d06b397..e0ec2fdf 100644
--- a/ext/flac/Makefile.in
+++ b/ext/flac/Makefile.in
@@ -104,6 +104,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/ext/flac/gstflacdec.c b/ext/flac/gstflacdec.c
index 3537fc25..5de5bc0d 100644
--- a/ext/flac/gstflacdec.c
+++ b/ext/flac/gstflacdec.c
@@ -332,14 +332,14 @@ gst_flac_calculate_crc8 (guint8 * data, guint length)
/* FIXME: for our purposes it's probably enough to just check for the sync
* marker - we just want to know if it's a header frame or not */
static gboolean
-gst_flac_dec_scan_got_frame (GstFlacDec * flacdec, guint8 * data, guint size,
- gint64 * last_sample_num)
+gst_flac_dec_scan_got_frame (GstFlacDec * flacdec, guint8 * data, guint size)
{
guint headerlen;
guint sr_from_end = 0; /* can be 0, 8 or 16 */
guint bs_from_end = 0; /* can be 0, 8 or 16 */
guint32 val = 0;
guint8 bs, sr, ca, ss, pb;
+ gboolean vbs;
if (size < 10)
return FALSE;
@@ -347,11 +347,8 @@ gst_flac_dec_scan_got_frame (GstFlacDec * flacdec, guint8 * data, guint size,
/* sync */
if (data[0] != 0xFF || (data[1] & 0xFC) != 0xF8)
return FALSE;
- if (data[1] & 1) {
- GST_WARNING_OBJECT (flacdec, "Variable block size FLAC unsupported");
- return FALSE;
- }
+ vbs = ! !(data[1] & 1); /* variable blocksize */
bs = (data[2] & 0xF0) >> 4; /* blocksize marker */
sr = (data[2] & 0x0F); /* samplerate marker */
ca = (data[3] & 0xF0) >> 4; /* channel assignment */
@@ -359,7 +356,8 @@ gst_flac_dec_scan_got_frame (GstFlacDec * flacdec, guint8 * data, guint size,
pb = (data[3] & 0x01); /* padding bit */
GST_LOG_OBJECT (flacdec,
- "got sync, bs=%x,sr=%x,ca=%x,ss=%x,pb=%x", bs, sr, ca, ss, pb);
+ "got sync, vbs=%d,bs=%x,sr=%x,ca=%x,ss=%x,pb=%x", vbs, bs, sr, ca, ss,
+ pb);
if (bs == 0 || sr == 0x0F || ca >= 0x0B || ss == 0x03 || ss == 0x07) {
return FALSE;
@@ -406,36 +404,6 @@ gst_flac_dec_scan_got_frame (GstFlacDec * flacdec, guint8 * data, guint size,
return FALSE;
}
- if (!last_sample_num)
- return TRUE;
-
- /* FIXME: This is can be 36 bit if variable block size is used,
- * fortunately not encoder supports this yet and we check for that
- * above.
- */
- val = (guint32) g_utf8_get_char_validated ((gchar *) data + 4, -1);
-
- if (val == (guint32) - 1 || val == (guint32) - 2) {
- GST_LOG_OBJECT (flacdec, "failed to read sample/frame");
- return FALSE;
- }
-
- if (flacdec->min_blocksize == flacdec->max_blocksize) {
- *last_sample_num = ((guint64) val + 1) * flacdec->min_blocksize;
- } else {
- *last_sample_num = 0; /* FIXME: + length of last block in samples */
- }
-
- /* FIXME: only valid for fixed block size streams */
- GST_DEBUG_OBJECT (flacdec, "frame number: %" G_GINT64_FORMAT,
- *last_sample_num);
-
- if (flacdec->info.rate > 0 && *last_sample_num != 0) {
- GST_DEBUG_OBJECT (flacdec, "last sample %" G_GINT64_FORMAT " = %"
- GST_TIME_FORMAT, *last_sample_num,
- GST_TIME_ARGS (*last_sample_num * GST_SECOND / flacdec->info.rate));
- }
-
return TRUE;
}
@@ -788,8 +756,7 @@ gst_flac_dec_handle_frame (GstAudioDecoder * audio_dec, GstBuffer * buf)
/* check if this is a flac audio frame (rather than a header or junk) */
gst_buffer_map (buf, &map, GST_MAP_READ);
- got_audio_frame =
- gst_flac_dec_scan_got_frame (dec, map.data, map.size, NULL);
+ got_audio_frame = gst_flac_dec_scan_got_frame (dec, map.data, map.size);
gst_buffer_unmap (buf, &map);
if (!got_audio_frame) {
diff --git a/ext/gdk_pixbuf/Makefile.in b/ext/gdk_pixbuf/Makefile.in
index b5cb7150..91f130d2 100644
--- a/ext/gdk_pixbuf/Makefile.in
+++ b/ext/gdk_pixbuf/Makefile.in
@@ -104,6 +104,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/ext/jack/Makefile.in b/ext/jack/Makefile.in
index 8c8fa6ec..0ecf6975 100644
--- a/ext/jack/Makefile.in
+++ b/ext/jack/Makefile.in
@@ -104,6 +104,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/ext/jpeg/Makefile.in b/ext/jpeg/Makefile.in
index 054d1afd..833003db 100644
--- a/ext/jpeg/Makefile.in
+++ b/ext/jpeg/Makefile.in
@@ -104,6 +104,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/ext/libcaca/Makefile.in b/ext/libcaca/Makefile.in
index 146933a3..ac5b8e84 100644
--- a/ext/libcaca/Makefile.in
+++ b/ext/libcaca/Makefile.in
@@ -104,6 +104,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/ext/libpng/Makefile.in b/ext/libpng/Makefile.in
index 2bba3fb2..88c9318c 100644
--- a/ext/libpng/Makefile.in
+++ b/ext/libpng/Makefile.in
@@ -104,6 +104,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/ext/pulse/Makefile.in b/ext/pulse/Makefile.in
index c19fb1a0..3d14c305 100644
--- a/ext/pulse/Makefile.in
+++ b/ext/pulse/Makefile.in
@@ -104,6 +104,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/ext/pulse/pulsedevicemonitor.c b/ext/pulse/pulsedevicemonitor.c
index 83b88029..b4ee8199 100644
--- a/ext/pulse/pulsedevicemonitor.c
+++ b/ext/pulse/pulsedevicemonitor.c
@@ -257,22 +257,24 @@ context_subscribe_cb (pa_context * context, pa_subscription_event_type_t type,
{
GstPulseDeviceMonitor *self = userdata;
GstDeviceMonitor *monitor = userdata;
+ pa_subscription_event_type_t facility =
+ type & PA_SUBSCRIPTION_EVENT_FACILITY_MASK;
+ pa_subscription_event_type_t event_type =
+ type & PA_SUBSCRIPTION_EVENT_TYPE_MASK;
-
- if (!(type & (PA_SUBSCRIPTION_EVENT_SOURCE | PA_SUBSCRIPTION_EVENT_SINK)))
+ if (facility != PA_SUBSCRIPTION_EVENT_SOURCE &&
+ facility != PA_SUBSCRIPTION_EVENT_SINK)
return;
-
- if ((type & PA_SUBSCRIPTION_EVENT_TYPE_MASK) == PA_SUBSCRIPTION_EVENT_NEW) {
+ if (event_type == PA_SUBSCRIPTION_EVENT_NEW) {
/* Microphone in the source output has changed */
- if (type & PA_SUBSCRIPTION_EVENT_SOURCE)
+ if (facility == PA_SUBSCRIPTION_EVENT_SOURCE)
pa_context_get_source_info_by_index (context, idx, get_source_info_cb,
self);
- else if (type & PA_SUBSCRIPTION_EVENT_SINK)
+ else if (facility == PA_SUBSCRIPTION_EVENT_SINK)
pa_context_get_sink_info_by_index (context, idx, get_sink_info_cb, self);
- } else if ((type & PA_SUBSCRIPTION_EVENT_TYPE_MASK) ==
- PA_SUBSCRIPTION_EVENT_REMOVE) {
+ } else if (event_type == PA_SUBSCRIPTION_EVENT_REMOVE) {
GstPulseDevice *dev = NULL;
GList *item;
@@ -280,7 +282,11 @@ context_subscribe_cb (pa_context * context, pa_subscription_event_type_t type,
for (item = monitor->devices; item; item = item->next) {
dev = item->data;
- if (dev->device_index == idx) {
+ if (((facility == PA_SUBSCRIPTION_EVENT_SOURCE &&
+ dev->type == GST_PULSE_DEVICE_TYPE_SOURCE) ||
+ (facility == PA_SUBSCRIPTION_EVENT_SINK &&
+ dev->type == GST_PULSE_DEVICE_TYPE_SINK)) &&
+ dev->device_index == idx) {
gst_object_ref (dev);
break;
}
@@ -627,6 +633,7 @@ gst_pulse_device_new (guint device_index, const gchar * device_name,
"display-name", device_name, "caps", caps, "klass", klass,
"internal-name", internal_name, NULL);
+ gstdev->type = type;
gstdev->device_index = device_index;
gstdev->element = element;
diff --git a/ext/pulse/pulsedevicemonitor.h b/ext/pulse/pulsedevicemonitor.h
index 9d9070e2..100ba9b0 100644
--- a/ext/pulse/pulsedevicemonitor.h
+++ b/ext/pulse/pulsedevicemonitor.h
@@ -83,6 +83,7 @@ typedef struct _GstPulseDeviceClass GstPulseDeviceClass;
struct _GstPulseDevice {
GstDevice parent;
+ GstPulseDeviceType type;
guint device_index;
gchar *internal_name;
const gchar *element;
diff --git a/ext/raw1394/Makefile.in b/ext/raw1394/Makefile.in
index 61f7c934..aa69dabb 100644
--- a/ext/raw1394/Makefile.in
+++ b/ext/raw1394/Makefile.in
@@ -104,6 +104,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/ext/shout2/Makefile.in b/ext/shout2/Makefile.in
index ea32c4be..98bad5fd 100644
--- a/ext/shout2/Makefile.in
+++ b/ext/shout2/Makefile.in
@@ -104,6 +104,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/ext/soup/Makefile.in b/ext/soup/Makefile.in
index cc397cb0..8bf9b9c6 100644
--- a/ext/soup/Makefile.in
+++ b/ext/soup/Makefile.in
@@ -104,6 +104,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/ext/soup/gstsouphttpsrc.c b/ext/soup/gstsouphttpsrc.c
index c1cb5424..1ec661bb 100644
--- a/ext/soup/gstsouphttpsrc.c
+++ b/ext/soup/gstsouphttpsrc.c
@@ -81,6 +81,15 @@
#include "gstsouphttpsrc.h"
#include "gstsouputils.h"
+/* libsoup before 2.47.0 was stealing our main context from us,
+ * so we can't reliable use it to clean up all pending resources
+ * once we're done... let's just continue leaking on old versions.
+ * https://bugzilla.gnome.org/show_bug.cgi?id=663944
+ */
+#if defined(SOUP_MINOR_VERSION) && SOUP_MINOR_VERSION >= 47
+#define LIBSOUP_DOES_NOT_STEAL_OUR_CONTEXT 1
+#endif
+
#include <gst/tag/tag.h>
GST_DEBUG_CATEGORY_STATIC (souphttpsrc_debug);
@@ -912,11 +921,23 @@ gst_soup_http_src_session_open (GstSoupHTTPSrc * src)
return TRUE;
}
+#ifdef LIBSOUP_DOES_NOT_STEAL_OUR_CONTEXT
+static gboolean
+dummy_idle_cb (gpointer data)
+{
+ return FALSE /* Idle source is removed */ ;
+}
+#endif
+
static void
gst_soup_http_src_session_close (GstSoupHTTPSrc * src)
{
GST_DEBUG_OBJECT (src, "Closing session");
+ if (src->loop)
+ g_main_loop_quit (src->loop);
+
+ g_mutex_lock (&src->mutex);
if (src->session) {
soup_session_abort (src->session); /* This unrefs the message. */
g_object_unref (src->session);
@@ -924,11 +945,33 @@ gst_soup_http_src_session_close (GstSoupHTTPSrc * src)
src->msg = NULL;
}
if (src->loop) {
+#ifdef LIBSOUP_DOES_NOT_STEAL_OUR_CONTEXT
+ GSource *idle_source;
+
+ /* Iterating the main context to give GIO cancellables a chance
+ * to initiate cleanups. Wihout this, resources allocated by
+ * libsoup for the connection are not released and socket fd is
+ * leaked. */
+ idle_source = g_idle_source_new ();
+ /* Suppressing "idle souce without callback" warning */
+ g_source_set_callback (idle_source, dummy_idle_cb, NULL, NULL);
+ g_source_set_priority (idle_source, G_PRIORITY_LOW);
+ g_source_attach (idle_source, src->context);
+ /* Acquiring the context. Idle source guarantees that we'll not block. */
+ g_main_context_push_thread_default (src->context);
+ g_main_context_iteration (src->context, TRUE);
+ /* Ensuring that there's no unhandled pending events left. */
+ while (g_main_context_iteration (src->context, FALSE));
+ g_main_context_pop_thread_default (src->context);
+ g_source_unref (idle_source);
+#endif
+
g_main_loop_unref (src->loop);
g_main_context_unref (src->context);
src->loop = NULL;
src->context = NULL;
}
+ g_mutex_unlock (&src->mutex);
}
static void
@@ -1565,8 +1608,11 @@ gst_soup_http_src_do_request (GstSoupHTTPSrc * src, const gchar * method,
break;
}
- if (src->ret == GST_FLOW_CUSTOM_ERROR)
+ if (src->ret == GST_FLOW_CUSTOM_ERROR) {
+ g_main_context_push_thread_default (src->context);
g_main_loop_run (src->loop);
+ g_main_context_pop_thread_default (src->context);
+ }
} while (src->ret == GST_FLOW_CUSTOM_ERROR);
@@ -1575,7 +1621,9 @@ gst_soup_http_src_do_request (GstSoupHTTPSrc * src, const gchar * method,
&& src->read_position >= src->stop_position) {
src->outbuf = NULL;
gst_soup_http_src_session_unpause_message (src);
+ g_main_context_push_thread_default (src->context);
g_main_loop_run (src->loop);
+ g_main_context_pop_thread_default (src->context);
g_cond_signal (&src->request_finished_cond);
/* Return OK unconditionally here, src->ret will
diff --git a/ext/speex/Makefile.in b/ext/speex/Makefile.in
index 4b58dba3..b268d348 100644
--- a/ext/speex/Makefile.in
+++ b/ext/speex/Makefile.in
@@ -104,6 +104,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/ext/taglib/Makefile.in b/ext/taglib/Makefile.in
index deab6182..f58d5df3 100644
--- a/ext/taglib/Makefile.in
+++ b/ext/taglib/Makefile.in
@@ -104,6 +104,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/ext/vpx/Makefile.in b/ext/vpx/Makefile.in
index 865c5987..7902d060 100644
--- a/ext/vpx/Makefile.in
+++ b/ext/vpx/Makefile.in
@@ -105,6 +105,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/ext/vpx/gstvp8enc.c b/ext/vpx/gstvp8enc.c
index 5684e60c..0271ffcd 100644
--- a/ext/vpx/gstvp8enc.c
+++ b/ext/vpx/gstvp8enc.c
@@ -911,18 +911,18 @@ gst_vp8_enc_set_property (GObject * object, guint prop_id,
memset (&gst_vp8_enc->cfg.ts_target_bitrate, 0,
sizeof (gst_vp8_enc->cfg.ts_target_bitrate));
- if (va->n_values > VPX_TS_MAX_LAYERS) {
+ if (va == NULL) {
+ gst_vp8_enc->n_ts_target_bitrate = 0;
+ } else if (va->n_values > VPX_TS_MAX_LAYERS) {
g_warning ("%s: Only %d layers allowed at maximum",
GST_ELEMENT_NAME (gst_vp8_enc), VPX_TS_MAX_LAYERS);
- } else if (va) {
+ } else {
gint i;
for (i = 0; i < va->n_values; i++)
gst_vp8_enc->cfg.ts_target_bitrate[i] =
g_value_get_int (g_value_array_get_nth (va, i));
gst_vp8_enc->n_ts_target_bitrate = va->n_values;
- } else {
- gst_vp8_enc->n_ts_target_bitrate = 0;
}
global = TRUE;
break;
diff --git a/ext/vpx/gstvp9enc.c b/ext/vpx/gstvp9enc.c
index ea276f90..1b153118 100644
--- a/ext/vpx/gstvp9enc.c
+++ b/ext/vpx/gstvp9enc.c
@@ -886,18 +886,20 @@ gst_vp9_enc_set_property (GObject * object, guint prop_id,
memset (&gst_vp9_enc->cfg.ts_target_bitrate, 0,
sizeof (gst_vp9_enc->cfg.ts_target_bitrate));
- if (va->n_values > VPX_TS_MAX_LAYERS) {
- g_warning ("%s: Only %d layers allowed at maximum",
- GST_ELEMENT_NAME (gst_vp9_enc), VPX_TS_MAX_LAYERS);
- } else if (va) {
- gint i;
-
- for (i = 0; i < va->n_values; i++)
- gst_vp9_enc->cfg.ts_target_bitrate[i] =
- g_value_get_int (g_value_array_get_nth (va, i));
- gst_vp9_enc->n_ts_target_bitrate = va->n_values;
- } else {
+ if (va == NULL) {
gst_vp9_enc->n_ts_target_bitrate = 0;
+ } else {
+ if (va->n_values > VPX_TS_MAX_LAYERS) {
+ g_warning ("%s: Only %d layers allowed at maximum",
+ GST_ELEMENT_NAME (gst_vp9_enc), VPX_TS_MAX_LAYERS);
+ } else {
+ gint i;
+
+ for (i = 0; i < va->n_values; i++)
+ gst_vp9_enc->cfg.ts_target_bitrate[i] =
+ g_value_get_int (g_value_array_get_nth (va, i));
+ gst_vp9_enc->n_ts_target_bitrate = va->n_values;
+ }
}
global = TRUE;
break;
@@ -932,7 +934,7 @@ gst_vp9_enc_set_property (GObject * object, guint prop_id,
memset (&gst_vp9_enc->cfg.ts_layer_id, 0,
sizeof (gst_vp9_enc->cfg.ts_layer_id));
- if (va->n_values > VPX_TS_MAX_PERIODICITY) {
+ if (va && va->n_values > VPX_TS_MAX_PERIODICITY) {
g_warning ("%s: Only %d sized layer sequences allowed at maximum",
GST_ELEMENT_NAME (gst_vp9_enc), VPX_TS_MAX_PERIODICITY);
} else if (va) {
diff --git a/ext/wavpack/Makefile.in b/ext/wavpack/Makefile.in
index bc58205c..31482e44 100644
--- a/ext/wavpack/Makefile.in
+++ b/ext/wavpack/Makefile.in
@@ -104,6 +104,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/gst-plugins-good.doap b/gst-plugins-good.doap
index 460ffae9..f2675771 100644
--- a/gst-plugins-good.doap
+++ b/gst-plugins-good.doap
@@ -34,6 +34,16 @@ the plug-in code, LGPL or LGPL-compatible for the supporting library).
<release>
<Version>
+ <revision>1.3.2</revision>
+ <branch>1.3</branch>
+ <name></name>
+ <created>2014-05-21</created>
+ <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gst-plugins-good/gst-plugins-good-1.3.2.tar.xz" />
+ </Version>
+ </release>
+
+ <release>
+ <Version>
<revision>1.3.1</revision>
<branch>1.3</branch>
<name></name>
diff --git a/gst-plugins-good.spec b/gst-plugins-good.spec
index e00ed731..2b25b333 100644
--- a/gst-plugins-good.spec
+++ b/gst-plugins-good.spec
@@ -4,7 +4,7 @@
%define gst_minver 0.11.0
Name: %{gstreamer}-plugins-good
-Version: 1.3.1
+Version: 1.3.2
Release: 1.gst
Summary: GStreamer plug-ins with good code and licensing
diff --git a/gst/Makefile.in b/gst/Makefile.in
index be704f80..21be6a38 100644
--- a/gst/Makefile.in
+++ b/gst/Makefile.in
@@ -107,6 +107,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/gst/alpha/Makefile.in b/gst/alpha/Makefile.in
index 77080afd..617d1053 100644
--- a/gst/alpha/Makefile.in
+++ b/gst/alpha/Makefile.in
@@ -104,6 +104,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/gst/apetag/Makefile.in b/gst/apetag/Makefile.in
index e84b9661..37593d1f 100644
--- a/gst/apetag/Makefile.in
+++ b/gst/apetag/Makefile.in
@@ -104,6 +104,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/gst/audiofx/Makefile.in b/gst/audiofx/Makefile.in
index 3bb7b729..298be4b0 100644
--- a/gst/audiofx/Makefile.in
+++ b/gst/audiofx/Makefile.in
@@ -128,6 +128,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/gst/audiofx/audiopanoramaorc-dist.c b/gst/audiofx/audiopanoramaorc-dist.c
index 12d6aa0e..3d5999a6 100644
--- a/gst/audiofx/audiopanoramaorc-dist.c
+++ b/gst/audiofx/audiopanoramaorc-dist.c
@@ -264,7 +264,7 @@ audiopanoramam_orc_process_s16_ch1_none (gint16 * ORC_RESTRICT d1,
static const orc_uint8 bc[] = {
1, 9, 39, 97, 117, 100, 105, 111, 112, 97, 110, 111, 114, 97, 109, 97,
109, 95, 111, 114, 99, 95, 112, 114, 111, 99, 101, 115, 115, 95, 115,
- 49,
+ 49,
54, 95, 99, 104, 49, 95, 110, 111, 110, 101, 11, 4, 4, 12, 2, 2,
195, 0, 4, 4, 2, 0,
};
@@ -390,7 +390,7 @@ audiopanoramam_orc_process_f32_ch1_none (gfloat * ORC_RESTRICT d1,
static const orc_uint8 bc[] = {
1, 9, 39, 97, 117, 100, 105, 111, 112, 97, 110, 111, 114, 97, 109, 97,
109, 95, 111, 114, 99, 95, 112, 114, 111, 99, 101, 115, 115, 95, 102,
- 51,
+ 51,
50, 95, 99, 104, 49, 95, 110, 111, 110, 101, 11, 8, 8, 12, 4, 4,
194, 0, 4, 4, 2, 0,
};
@@ -502,7 +502,7 @@ audiopanoramam_orc_process_s16_ch2_none (gint16 * ORC_RESTRICT d1,
static const orc_uint8 bc[] = {
1, 9, 39, 97, 117, 100, 105, 111, 112, 97, 110, 111, 114, 97, 109, 97,
109, 95, 111, 114, 99, 95, 112, 114, 111, 99, 101, 115, 115, 95, 115,
- 49,
+ 49,
54, 95, 99, 104, 50, 95, 110, 111, 110, 101, 11, 4, 4, 12, 4, 4,
21, 1, 79, 0, 4, 2, 0,
};
@@ -614,7 +614,7 @@ audiopanoramam_orc_process_f32_ch2_none (gfloat * ORC_RESTRICT d1,
static const orc_uint8 bc[] = {
1, 9, 39, 97, 117, 100, 105, 111, 112, 97, 110, 111, 114, 97, 109, 97,
109, 95, 111, 114, 99, 95, 112, 114, 111, 99, 101, 115, 115, 95, 102,
- 51,
+ 51,
50, 95, 99, 104, 50, 95, 110, 111, 110, 101, 11, 8, 8, 12, 8, 8,
21, 1, 112, 0, 4, 2, 0,
};
@@ -842,7 +842,7 @@ audiopanoramam_orc_process_s16_ch1_psy (gint16 * ORC_RESTRICT d1,
static const orc_uint8 bc[] = {
1, 9, 38, 97, 117, 100, 105, 111, 112, 97, 110, 111, 114, 97, 109, 97,
109, 95, 111, 114, 99, 95, 112, 114, 111, 99, 101, 115, 115, 95, 115,
- 49,
+ 49,
54, 95, 99, 104, 49, 95, 112, 115, 121, 11, 4, 4, 12, 2, 2, 17,
4, 17, 4, 20, 8, 20, 4, 20, 4, 153, 33, 4, 211, 33, 33, 202,
34, 33, 25, 202, 33, 33, 24, 194, 32, 33, 34, 21, 1, 210, 32, 32,
@@ -1053,7 +1053,7 @@ audiopanoramam_orc_process_f32_ch1_psy (gfloat * ORC_RESTRICT d1,
static const orc_uint8 bc[] = {
1, 9, 38, 97, 117, 100, 105, 111, 112, 97, 110, 111, 114, 97, 109, 97,
109, 95, 111, 114, 99, 95, 112, 114, 111, 99, 101, 115, 115, 95, 102,
- 51,
+ 51,
50, 95, 99, 104, 49, 95, 112, 115, 121, 11, 8, 8, 12, 4, 4, 17,
4, 17, 4, 20, 4, 20, 4, 202, 33, 4, 25, 202, 32, 4, 24, 194,
0, 32, 33, 2, 0,
@@ -1355,7 +1355,7 @@ audiopanoramam_orc_process_s16_ch2_psy_right (gint16 * ORC_RESTRICT d1,
static const orc_uint8 bc[] = {
1, 9, 44, 97, 117, 100, 105, 111, 112, 97, 110, 111, 114, 97, 109, 97,
109, 95, 111, 114, 99, 95, 112, 114, 111, 99, 101, 115, 115, 95, 115,
- 49,
+ 49,
54, 95, 99, 104, 50, 95, 112, 115, 121, 95, 114, 105, 103, 104, 116, 11,
4, 4, 12, 4, 4, 17, 4, 17, 4, 20, 8, 20, 4, 20, 4, 20,
4, 21, 1, 153, 32, 4, 21, 1, 211, 32, 32, 192, 33, 32, 193, 34,
@@ -1675,7 +1675,7 @@ audiopanoramam_orc_process_s16_ch2_psy_left (gint16 * ORC_RESTRICT d1,
static const orc_uint8 bc[] = {
1, 9, 43, 97, 117, 100, 105, 111, 112, 97, 110, 111, 114, 97, 109, 97,
109, 95, 111, 114, 99, 95, 112, 114, 111, 99, 101, 115, 115, 95, 115,
- 49,
+ 49,
54, 95, 99, 104, 50, 95, 112, 115, 121, 95, 108, 101, 102, 116, 11, 4,
4, 12, 4, 4, 17, 4, 17, 4, 20, 8, 20, 4, 20, 4, 20, 4,
21, 1, 153, 32, 4, 21, 1, 211, 32, 32, 192, 33, 32, 193, 35, 32,
@@ -1945,7 +1945,7 @@ audiopanoramam_orc_process_f32_ch2_psy_right (gfloat * ORC_RESTRICT d1,
static const orc_uint8 bc[] = {
1, 9, 44, 97, 117, 100, 105, 111, 112, 97, 110, 111, 114, 97, 109, 97,
109, 95, 111, 114, 99, 95, 112, 114, 111, 99, 101, 115, 115, 95, 102,
- 51,
+ 51,
50, 95, 99, 104, 50, 95, 112, 115, 121, 95, 114, 105, 103, 104, 116, 11,
8, 8, 12, 8, 8, 17, 4, 17, 4, 20, 4, 20, 4, 20, 4, 192,
32, 4, 193, 33, 4, 202, 34, 32, 25, 202, 32, 32, 24, 200, 33, 34,
@@ -2205,7 +2205,7 @@ audiopanoramam_orc_process_f32_ch2_psy_left (gfloat * ORC_RESTRICT d1,
static const orc_uint8 bc[] = {
1, 9, 43, 97, 117, 100, 105, 111, 112, 97, 110, 111, 114, 97, 109, 97,
109, 95, 111, 114, 99, 95, 112, 114, 111, 99, 101, 115, 115, 95, 102,
- 51,
+ 51,
50, 95, 99, 104, 50, 95, 112, 115, 121, 95, 108, 101, 102, 116, 11, 8,
8, 12, 8, 8, 17, 4, 17, 4, 20, 4, 20, 4, 20, 4, 192, 32,
4, 193, 34, 4, 202, 33, 34, 24, 202, 34, 34, 25, 200, 32, 33, 32,
@@ -2433,7 +2433,7 @@ audiopanoramam_orc_process_s16_ch1_sim_right (gint16 * ORC_RESTRICT d1,
static const orc_uint8 bc[] = {
1, 9, 44, 97, 117, 100, 105, 111, 112, 97, 110, 111, 114, 97, 109, 97,
109, 95, 111, 114, 99, 95, 112, 114, 111, 99, 101, 115, 115, 95, 115,
- 49,
+ 49,
54, 95, 99, 104, 49, 95, 115, 105, 109, 95, 114, 105, 103, 104, 116, 11,
4, 4, 12, 2, 2, 17, 4, 20, 8, 20, 4, 20, 4, 153, 33, 4,
211, 33, 33, 202, 34, 33, 24, 194, 32, 33, 34, 21, 1, 210, 32, 32,
@@ -2655,7 +2655,7 @@ audiopanoramam_orc_process_s16_ch1_sim_left (gint16 * ORC_RESTRICT d1,
static const orc_uint8 bc[] = {
1, 9, 43, 97, 117, 100, 105, 111, 112, 97, 110, 111, 114, 97, 109, 97,
109, 95, 111, 114, 99, 95, 112, 114, 111, 99, 101, 115, 115, 95, 115,
- 49,
+ 49,
54, 95, 99, 104, 49, 95, 115, 105, 109, 95, 108, 101, 102, 116, 11, 4,
4, 12, 2, 2, 17, 4, 20, 8, 20, 4, 20, 4, 153, 34, 4, 211,
34, 34, 202, 33, 34, 24, 194, 32, 33, 34, 21, 1, 210, 32, 32, 21,
@@ -2909,7 +2909,7 @@ audiopanoramam_orc_process_s16_ch2_sim_right (gint16 * ORC_RESTRICT d1,
static const orc_uint8 bc[] = {
1, 9, 44, 97, 117, 100, 105, 111, 112, 97, 110, 111, 114, 97, 109, 97,
109, 95, 111, 114, 99, 95, 112, 114, 111, 99, 101, 115, 115, 95, 115,
- 49,
+ 49,
54, 95, 99, 104, 50, 95, 115, 105, 109, 95, 114, 105, 103, 104, 116, 11,
4, 4, 12, 4, 4, 17, 4, 20, 8, 20, 4, 20, 4, 21, 1, 153,
32, 4, 21, 1, 211, 32, 32, 192, 33, 32, 193, 34, 32, 202, 34, 34,
@@ -3168,7 +3168,7 @@ audiopanoramam_orc_process_s16_ch2_sim_left (gint16 * ORC_RESTRICT d1,
static const orc_uint8 bc[] = {
1, 9, 43, 97, 117, 100, 105, 111, 112, 97, 110, 111, 114, 97, 109, 97,
109, 95, 111, 114, 99, 95, 112, 114, 111, 99, 101, 115, 115, 95, 115,
- 49,
+ 49,
54, 95, 99, 104, 50, 95, 115, 105, 109, 95, 108, 101, 102, 116, 11, 4,
4, 12, 4, 4, 17, 4, 20, 8, 20, 4, 20, 4, 21, 1, 153, 32,
4, 21, 1, 211, 32, 32, 192, 33, 32, 193, 34, 32, 202, 33, 33, 24,
@@ -3355,7 +3355,7 @@ audiopanoramam_orc_process_f32_ch1_sim_right (gfloat * ORC_RESTRICT d1,
static const orc_uint8 bc[] = {
1, 9, 44, 97, 117, 100, 105, 111, 112, 97, 110, 111, 114, 97, 109, 97,
109, 95, 111, 114, 99, 95, 112, 114, 111, 99, 101, 115, 115, 95, 102,
- 51,
+ 51,
50, 95, 99, 104, 49, 95, 115, 105, 109, 95, 114, 105, 103, 104, 116, 11,
8, 8, 12, 4, 4, 17, 4, 20, 4, 20, 4, 112, 32, 4, 202, 33,
4, 24, 194, 0, 32, 33, 2, 0,
@@ -3529,7 +3529,7 @@ audiopanoramam_orc_process_f32_ch1_sim_left (gfloat * ORC_RESTRICT d1,
static const orc_uint8 bc[] = {
1, 9, 43, 97, 117, 100, 105, 111, 112, 97, 110, 111, 114, 97, 109, 97,
109, 95, 111, 114, 99, 95, 112, 114, 111, 99, 101, 115, 115, 95, 102,
- 51,
+ 51,
50, 95, 99, 104, 49, 95, 115, 105, 109, 95, 108, 101, 102, 116, 11, 8,
8, 12, 4, 4, 17, 4, 20, 4, 20, 4, 202, 32, 4, 24, 112, 33,
4, 194, 0, 32, 33, 2, 0,
@@ -3725,7 +3725,7 @@ audiopanoramam_orc_process_f32_ch2_sim_right (gfloat * ORC_RESTRICT d1,
static const orc_uint8 bc[] = {
1, 9, 44, 97, 117, 100, 105, 111, 112, 97, 110, 111, 114, 97, 109, 97,
109, 95, 111, 114, 99, 95, 112, 114, 111, 99, 101, 115, 115, 95, 102,
- 51,
+ 51,
50, 95, 99, 104, 50, 95, 115, 105, 109, 95, 114, 105, 103, 104, 116, 11,
8, 8, 12, 8, 8, 17, 4, 20, 4, 20, 4, 192, 32, 4, 193, 33,
4, 202, 33, 33, 24, 194, 0, 32, 33, 2, 0,
@@ -3923,7 +3923,7 @@ audiopanoramam_orc_process_f32_ch2_sim_left (gfloat * ORC_RESTRICT d1,
static const orc_uint8 bc[] = {
1, 9, 43, 97, 117, 100, 105, 111, 112, 97, 110, 111, 114, 97, 109, 97,
109, 95, 111, 114, 99, 95, 112, 114, 111, 99, 101, 115, 115, 95, 102,
- 51,
+ 51,
50, 95, 99, 104, 50, 95, 115, 105, 109, 95, 108, 101, 102, 116, 11, 8,
8, 12, 8, 8, 17, 4, 20, 4, 20, 4, 192, 32, 4, 193, 33, 4,
202, 32, 32, 24, 194, 0, 32, 33, 2, 0,
diff --git a/gst/audioparsers/Makefile.in b/gst/audioparsers/Makefile.in
index a7236ac2..c1715805 100644
--- a/gst/audioparsers/Makefile.in
+++ b/gst/audioparsers/Makefile.in
@@ -104,6 +104,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/gst/audioparsers/gstflacparse.c b/gst/audioparsers/gstflacparse.c
index cb7a39ec..d36693b4 100644
--- a/gst/audioparsers/gstflacparse.c
+++ b/gst/audioparsers/gstflacparse.c
@@ -1136,8 +1136,11 @@ gst_flac_parse_handle_picture (GstFlacParse * flacparse, GstBuffer * buffer)
flacparse->tags = gst_tag_list_new_empty ();
GST_INFO_OBJECT (flacparse, "Got image of %d bytes", img_len);
- gst_tag_list_add_id3_image (flacparse->tags,
- map.data + gst_byte_reader_get_pos (&reader), img_len, img_type);
+
+ if (img_len > 0) {
+ gst_tag_list_add_id3_image (flacparse->tags,
+ map.data + gst_byte_reader_get_pos (&reader), img_len, img_type);
+ }
if (gst_tag_list_is_empty (flacparse->tags)) {
gst_tag_list_unref (flacparse->tags);
diff --git a/gst/auparse/Makefile.in b/gst/auparse/Makefile.in
index c89bf0c6..c1f04843 100644
--- a/gst/auparse/Makefile.in
+++ b/gst/auparse/Makefile.in
@@ -104,6 +104,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/gst/autodetect/Makefile.in b/gst/autodetect/Makefile.in
index 1db2a511..59821f37 100644
--- a/gst/autodetect/Makefile.in
+++ b/gst/autodetect/Makefile.in
@@ -104,6 +104,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/gst/avi/Makefile.in b/gst/avi/Makefile.in
index eb5c58b0..2fc49609 100644
--- a/gst/avi/Makefile.in
+++ b/gst/avi/Makefile.in
@@ -104,6 +104,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/gst/cutter/Makefile.in b/gst/cutter/Makefile.in
index 0695f043..a84fd74b 100644
--- a/gst/cutter/Makefile.in
+++ b/gst/cutter/Makefile.in
@@ -104,6 +104,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/gst/debugutils/Makefile.in b/gst/debugutils/Makefile.in
index 2a5b5ac6..8271893e 100644
--- a/gst/debugutils/Makefile.in
+++ b/gst/debugutils/Makefile.in
@@ -104,6 +104,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/gst/debugutils/tests.c b/gst/debugutils/tests.c
index d318664a..9ca2af90 100644
--- a/gst/debugutils/tests.c
+++ b/gst/debugutils/tests.c
@@ -158,7 +158,8 @@ timedur_add (gpointer test, GstBuffer * buffer)
if (GST_BUFFER_TIMESTAMP_IS_VALID (buffer) &&
GST_CLOCK_TIME_IS_VALID (t->expected)) {
- t->diff += labs (GST_BUFFER_TIMESTAMP (buffer) - t->expected);
+ t->diff +=
+ ABS (GST_CLOCK_DIFF (t->expected, GST_BUFFER_TIMESTAMP (buffer)));
t->count++;
}
if (GST_BUFFER_TIMESTAMP_IS_VALID (buffer) &&
diff --git a/gst/deinterlace/Makefile.in b/gst/deinterlace/Makefile.in
index 052094b4..4717f6ea 100644
--- a/gst/deinterlace/Makefile.in
+++ b/gst/deinterlace/Makefile.in
@@ -126,6 +126,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/gst/deinterlace/tvtime-dist.c b/gst/deinterlace/tvtime-dist.c
index 8e869824..b121c010 100644
--- a/gst/deinterlace/tvtime-dist.c
+++ b/gst/deinterlace/tvtime-dist.c
@@ -713,7 +713,7 @@ deinterlace_line_linear_blend (guint8 * ORC_RESTRICT d1,
static const orc_uint8 bc[] = {
1, 9, 29, 100, 101, 105, 110, 116, 101, 114, 108, 97, 99, 101, 95, 108,
105, 110, 101, 95, 108, 105, 110, 101, 97, 114, 95, 98, 108, 101, 110,
- 100,
+ 100,
11, 1, 1, 12, 1, 1, 12, 1, 1, 12, 1, 1, 14, 4, 2, 0,
0, 0, 20, 2, 20, 2, 20, 2, 150, 32, 4, 150, 33, 5, 150, 34,
6, 70, 32, 32, 33, 70, 34, 34, 34, 70, 32, 32, 34, 70, 32, 32,
diff --git a/gst/dtmf/Makefile.in b/gst/dtmf/Makefile.in
index be6dbcb1..d7713608 100644
--- a/gst/dtmf/Makefile.in
+++ b/gst/dtmf/Makefile.in
@@ -104,6 +104,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/gst/effectv/Makefile.in b/gst/effectv/Makefile.in
index dfcf836f..c21ddb00 100644
--- a/gst/effectv/Makefile.in
+++ b/gst/effectv/Makefile.in
@@ -104,6 +104,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/gst/equalizer/Makefile.in b/gst/equalizer/Makefile.in
index d7fcbf6d..304fd4ef 100644
--- a/gst/equalizer/Makefile.in
+++ b/gst/equalizer/Makefile.in
@@ -105,6 +105,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/gst/flv/Makefile.in b/gst/flv/Makefile.in
index 6944697f..ce40c604 100644
--- a/gst/flv/Makefile.in
+++ b/gst/flv/Makefile.in
@@ -104,6 +104,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/gst/flv/gstflvdemux.c b/gst/flv/gstflvdemux.c
index c058fda2..212d18a3 100644
--- a/gst/flv/gstflvdemux.c
+++ b/gst/flv/gstflvdemux.c
@@ -1180,12 +1180,12 @@ gst_flv_demux_parse_tag_audio (GstFlvDemux * demux, GstBuffer * buffer)
demux->audio_done = TRUE;
ret = GST_FLOW_OK;
} else {
- GST_WARNING_OBJECT (demux, "failed pushing a %" G_GUINT64_FORMAT
- " bytes audio buffer: %s", demux->tag_data_size,
- gst_flow_get_name (ret));
if (ret == GST_FLOW_NOT_LINKED) {
demux->audio_linked = FALSE;
- }
+ } else
+ GST_WARNING_OBJECT (demux, "failed pushing a %" G_GUINT64_FORMAT
+ " bytes audio buffer: %s", demux->tag_data_size,
+ gst_flow_get_name (ret));
goto beach;
}
}
@@ -1574,12 +1574,12 @@ gst_flv_demux_parse_tag_video (GstFlvDemux * demux, GstBuffer * buffer)
demux->video_done = TRUE;
ret = GST_FLOW_OK;
} else {
- GST_WARNING_OBJECT (demux, "failed pushing a %" G_GUINT64_FORMAT
- " bytes video buffer: %s", demux->tag_data_size,
- gst_flow_get_name (ret));
- if (ret == GST_FLOW_NOT_LINKED) {
+ if (ret == GST_FLOW_NOT_LINKED)
demux->video_linked = FALSE;
- }
+ else
+ GST_WARNING_OBJECT (demux, "failed pushing a %" G_GUINT64_FORMAT
+ " bytes video buffer: %s", demux->tag_data_size,
+ gst_flow_get_name (ret));
goto beach;
}
}
@@ -1683,6 +1683,16 @@ gst_flv_demux_parse_tag_type (GstFlvDemux * demux, GstBuffer * buffer)
tag_type = map.data[0];
+ /* Tag size is 1 byte of type + 3 bytes of size + 7 bytes + tag data size +
+ * 4 bytes of previous tag size */
+ demux->tag_data_size = GST_READ_UINT24_BE (map.data + 1);
+ demux->tag_size = demux->tag_data_size + 11;
+
+ GST_LOG_OBJECT (demux, "tag data size is %" G_GUINT64_FORMAT,
+ demux->tag_data_size);
+
+ gst_buffer_unmap (buffer, &map);
+
switch (tag_type) {
case 9:
demux->state = FLV_STATE_TAG_VIDEO;
@@ -1697,18 +1707,9 @@ gst_flv_demux_parse_tag_type (GstFlvDemux * demux, GstBuffer * buffer)
break;
default:
GST_WARNING_OBJECT (demux, "unsupported tag type %u", tag_type);
+ demux->state = FLV_STATE_SKIP;
}
- /* Tag size is 1 byte of type + 3 bytes of size + 7 bytes + tag data size +
- * 4 bytes of previous tag size */
- demux->tag_data_size = GST_READ_UINT24_BE (map.data + 1);
- demux->tag_size = demux->tag_data_size + 11;
-
- GST_LOG_OBJECT (demux, "tag data size is %" G_GUINT64_FORMAT,
- demux->tag_data_size);
-
- gst_buffer_unmap (buffer, &map);
-
return ret;
}
@@ -2111,6 +2112,16 @@ parse:
demux->state = FLV_STATE_TAG_TYPE;
goto beach;
}
+ case FLV_STATE_SKIP:
+ /* Skip unknown tags (set in _parse_tag_type()) */
+ if (gst_adapter_available (demux->adapter) >= demux->tag_size) {
+ gst_adapter_flush (demux->adapter, demux->tag_size);
+ demux->offset += demux->tag_size;
+ demux->state = FLV_STATE_TAG_TYPE;
+ goto parse;
+ } else {
+ goto beach;
+ }
default:
GST_DEBUG_OBJECT (demux, "unexpected demuxer state");
}
diff --git a/gst/flv/gstflvdemux.h b/gst/flv/gstflvdemux.h
index 90953b4a..79a8902e 100644
--- a/gst/flv/gstflvdemux.h
+++ b/gst/flv/gstflvdemux.h
@@ -47,6 +47,7 @@ typedef enum
FLV_STATE_TAG_SCRIPT,
FLV_STATE_SEEK,
FLV_STATE_DONE,
+ FLV_STATE_SKIP,
FLV_STATE_NONE
} GstFlvDemuxState;
diff --git a/gst/flx/Makefile.in b/gst/flx/Makefile.in
index aaa1e776..f21764e0 100644
--- a/gst/flx/Makefile.in
+++ b/gst/flx/Makefile.in
@@ -104,6 +104,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/gst/goom/Makefile.in b/gst/goom/Makefile.in
index 6e006ad5..f4c20b87 100644
--- a/gst/goom/Makefile.in
+++ b/gst/goom/Makefile.in
@@ -103,6 +103,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/gst/goom/tentacle3d.c b/gst/goom/tentacle3d.c
index 2abe42fc..f82ffba3 100644
--- a/gst/goom/tentacle3d.c
+++ b/gst/goom/tentacle3d.c
@@ -265,12 +265,13 @@ pretty_move (PluginInfo * goomInfo, float cycle, float *dist, float *dist2,
tmp = cycle - (G_PI * 2.0) * floor (cycle / (G_PI * 2.0));
}
- if (abs (tmp - fx_data->rot) > abs (tmp - (fx_data->rot + 2.0 * G_PI))) {
+ if (fabs (tmp - fx_data->rot) > fabs (tmp - (fx_data->rot + 2.0 * G_PI))) {
fx_data->rot = (tmp + 15.0f * (fx_data->rot + 2 * G_PI)) / 16.0f;
if (fx_data->rot > 2.0 * G_PI)
fx_data->rot -= 2.0 * G_PI;
*rotangle = fx_data->rot;
- } else if (abs (tmp - fx_data->rot) > abs (tmp - (fx_data->rot - 2.0 * G_PI))) {
+ } else if (fabs (tmp - fx_data->rot) >
+ fabs (tmp - (fx_data->rot - 2.0 * G_PI))) {
fx_data->rot = (tmp + 15.0f * (fx_data->rot - 2.0 * G_PI)) / 16.0f;
if (fx_data->rot < 0.0f)
fx_data->rot += 2.0 * G_PI;
diff --git a/gst/goom2k1/Makefile.in b/gst/goom2k1/Makefile.in
index 7f6d5aa7..2847492c 100644
--- a/gst/goom2k1/Makefile.in
+++ b/gst/goom2k1/Makefile.in
@@ -104,6 +104,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/gst/icydemux/Makefile.in b/gst/icydemux/Makefile.in
index c8c88fd2..623dcc4d 100644
--- a/gst/icydemux/Makefile.in
+++ b/gst/icydemux/Makefile.in
@@ -104,6 +104,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/gst/id3demux/Makefile.in b/gst/id3demux/Makefile.in
index bc4d5c7d..2e99241d 100644
--- a/gst/id3demux/Makefile.in
+++ b/gst/id3demux/Makefile.in
@@ -104,6 +104,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/gst/imagefreeze/Makefile.in b/gst/imagefreeze/Makefile.in
index 1d7002f3..a063ed1c 100644
--- a/gst/imagefreeze/Makefile.in
+++ b/gst/imagefreeze/Makefile.in
@@ -104,6 +104,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/gst/interleave/Makefile.in b/gst/interleave/Makefile.in
index c138a79d..66c84a9c 100644
--- a/gst/interleave/Makefile.in
+++ b/gst/interleave/Makefile.in
@@ -104,6 +104,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/gst/isomp4/Makefile.in b/gst/isomp4/Makefile.in
index 92696425..8a41c815 100644
--- a/gst/isomp4/Makefile.in
+++ b/gst/isomp4/Makefile.in
@@ -104,6 +104,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/gst/isomp4/gstqtmux.c b/gst/isomp4/gstqtmux.c
index b3390416..08aa05c6 100644
--- a/gst/isomp4/gstqtmux.c
+++ b/gst/isomp4/gstqtmux.c
@@ -1414,6 +1414,7 @@ serialize_error:
{
GST_ELEMENT_ERROR (qtmux, STREAM, MUX, (NULL),
("Failed to serialize mdat"));
+ g_free (node_header);
return GST_FLOW_ERROR;
}
}
diff --git a/gst/isomp4/qtdemux.c b/gst/isomp4/qtdemux.c
index 613edad5..53847c00 100644
--- a/gst/isomp4/qtdemux.c
+++ b/gst/isomp4/qtdemux.c
@@ -737,12 +737,17 @@ gst_qtdemux_handle_src_query (GstPad * pad, GstObject * parent,
GST_LOG_OBJECT (pad, "%s query", GST_QUERY_TYPE_NAME (query));
switch (GST_QUERY_TYPE (query)) {
- case GST_QUERY_POSITION:
- if (GST_CLOCK_TIME_IS_VALID (qtdemux->segment.position)) {
+ case GST_QUERY_POSITION:{
+ GstFormat fmt;
+
+ gst_query_parse_position (query, &fmt, NULL);
+ if (fmt == GST_FORMAT_TIME
+ && GST_CLOCK_TIME_IS_VALID (qtdemux->segment.position)) {
gst_query_set_position (query, GST_FORMAT_TIME,
qtdemux->segment.position);
res = TRUE;
}
+ }
break;
case GST_QUERY_DURATION:{
GstFormat fmt;
@@ -7485,8 +7490,10 @@ qtdemux_parse_trak (GstQTDemux * qtdemux, GNode * trak)
stream->caps =
qtdemux_video_caps (qtdemux, stream, fourcc, stsd_data, &codec);
- if (G_UNLIKELY (!stream->caps))
+ if (G_UNLIKELY (!stream->caps)) {
+ g_free (palette_data);
goto unknown_stream;
+ }
if (codec) {
list = gst_tag_list_new_empty ();
diff --git a/gst/law/Makefile.in b/gst/law/Makefile.in
index fc326253..b895b255 100644
--- a/gst/law/Makefile.in
+++ b/gst/law/Makefile.in
@@ -104,6 +104,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/gst/level/Makefile.in b/gst/level/Makefile.in
index 6cfee3e8..1f8931c3 100644
--- a/gst/level/Makefile.in
+++ b/gst/level/Makefile.in
@@ -104,6 +104,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/gst/matroska/Makefile.in b/gst/matroska/Makefile.in
index d1642686..74f0d2ab 100644
--- a/gst/matroska/Makefile.in
+++ b/gst/matroska/Makefile.in
@@ -104,6 +104,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/gst/matroska/ebml-write.c b/gst/matroska/ebml-write.c
index 138f470c..08868dbc 100644
--- a/gst/matroska/ebml-write.c
+++ b/gst/matroska/ebml-write.c
@@ -349,7 +349,7 @@ gst_ebml_write_element_size (guint8 ** data_inout, guint64 size)
if (size != GST_EBML_SIZE_UNKNOWN) {
/* how many bytes? - use mask-1 because an all-1 bitset is not allowed */
- while ((size >> ((bytes - 1) * 8)) >= (mask - 1) && bytes <= 8) {
+ while (bytes <= 8 && (size >> ((bytes - 1) * 8)) >= (mask - 1)) {
mask >>= 1;
bytes++;
}
@@ -530,7 +530,7 @@ gst_ebml_write_get_uint_size (guint64 num)
guint size = 1;
/* get size */
- while (num >= (G_GINT64_CONSTANT (1) << (size * 8)) && size < 8) {
+ while (size < 8 && num >= (G_GINT64_CONSTANT (1) << (size * 8))) {
size++;
}
diff --git a/gst/matroska/matroska-mux.c b/gst/matroska/matroska-mux.c
index 1009bd3a..76328fc0 100644
--- a/gst/matroska/matroska-mux.c
+++ b/gst/matroska/matroska-mux.c
@@ -809,6 +809,7 @@ gst_matroska_mux_handle_sink_event (GstCollectPads * pads,
lang_code = gst_tag_get_language_code_iso_639_2B (lang);
if (lang_code) {
GST_INFO_OBJECT (pad, "Setting language to '%s'", lang_code);
+ g_free (context->language);
context->language = g_strdup (lang_code);
} else {
GST_WARNING_OBJECT (pad, "Did not get language code for '%s'", lang);
@@ -1022,14 +1023,16 @@ skip_details:
gst_matroska_mux_set_codec_id (context,
GST_MATROSKA_CODEC_ID_VIDEO_UNCOMPRESSED);
fstr = gst_structure_get_string (structure, "format");
- if (fstr && strlen (fstr) == 4)
- videocontext->fourcc = GST_STR_FOURCC (fstr);
- else if (!strcmp (fstr, "GRAY8"))
- videocontext->fourcc = GST_MAKE_FOURCC ('Y', '8', '0', '0');
- else if (!strcmp (fstr, "BGR"))
- videocontext->fourcc = GST_MAKE_FOURCC ('B', 'G', 'R', 24);
- else if (!strcmp (fstr, "RGB"))
- videocontext->fourcc = GST_MAKE_FOURCC ('R', 'G', 'B', 24);
+ if (fstr) {
+ if (strlen (fstr) == 4)
+ videocontext->fourcc = GST_STR_FOURCC (fstr);
+ else if (!strcmp (fstr, "GRAY8"))
+ videocontext->fourcc = GST_MAKE_FOURCC ('Y', '8', '0', '0');
+ else if (!strcmp (fstr, "BGR"))
+ videocontext->fourcc = GST_MAKE_FOURCC ('B', 'G', 'R', 24);
+ else if (!strcmp (fstr, "RGB"))
+ videocontext->fourcc = GST_MAKE_FOURCC ('R', 'G', 'B', 24);
+ }
} else if (!strcmp (mimetype, "video/x-huffyuv") /* MS/VfW compatibility cases */
||!strcmp (mimetype, "video/x-divx")
|| !strcmp (mimetype, "video/x-dv")
diff --git a/gst/matroska/matroska-read-common.c b/gst/matroska/matroska-read-common.c
index da707207..ae5ea463 100644
--- a/gst/matroska/matroska-read-common.c
+++ b/gst/matroska/matroska-read-common.c
@@ -1200,7 +1200,7 @@ gst_matroska_read_common_parse_header (GstMatroskaReadCommon * common,
while (gst_ebml_read_has_remaining (ebml, 1, TRUE)) {
ret = gst_ebml_peek_id (ebml, &id);
if (ret != GST_FLOW_OK)
- return ret;
+ goto exit_error;
switch (id) {
/* is our read version uptodate? */
@@ -1209,7 +1209,7 @@ gst_matroska_read_common_parse_header (GstMatroskaReadCommon * common,
ret = gst_ebml_read_uint (ebml, &id, &num);
if (ret != GST_FLOW_OK)
- return ret;
+ goto exit_error;
if (num != GST_EBML_VERSION) {
GST_ERROR_OBJECT (ebml, "Unsupported EBML version %" G_GUINT64_FORMAT,
num);
@@ -1226,7 +1226,7 @@ gst_matroska_read_common_parse_header (GstMatroskaReadCommon * common,
ret = gst_ebml_read_uint (ebml, &id, &num);
if (ret != GST_FLOW_OK)
- return ret;
+ goto exit_error;
if (num > sizeof (guint64)) {
GST_ERROR_OBJECT (ebml,
"Unsupported EBML maximum size %" G_GUINT64_FORMAT, num);
@@ -1242,7 +1242,7 @@ gst_matroska_read_common_parse_header (GstMatroskaReadCommon * common,
ret = gst_ebml_read_uint (ebml, &id, &num);
if (ret != GST_FLOW_OK)
- return ret;
+ goto exit_error;
if (num > sizeof (guint32)) {
GST_ERROR_OBJECT (ebml,
"Unsupported EBML maximum ID %" G_GUINT64_FORMAT, num);
@@ -1257,7 +1257,7 @@ gst_matroska_read_common_parse_header (GstMatroskaReadCommon * common,
ret = gst_ebml_read_ascii (ebml, &id, &text);
if (ret != GST_FLOW_OK)
- return ret;
+ goto exit_error;
GST_DEBUG_OBJECT (ebml, "EbmlDocType: %s", GST_STR_NULL (text));
@@ -1272,7 +1272,7 @@ gst_matroska_read_common_parse_header (GstMatroskaReadCommon * common,
ret = gst_ebml_read_uint (ebml, &id, &num);
if (ret != GST_FLOW_OK)
- return ret;
+ goto exit_error;
version = num;
GST_DEBUG_OBJECT (ebml, "EbmlReadVersion: %" G_GUINT64_FORMAT, num);
break;
@@ -1282,7 +1282,7 @@ gst_matroska_read_common_parse_header (GstMatroskaReadCommon * common,
ret = gst_matroska_read_common_parse_skip (common, ebml,
"EBML header", id);
if (ret != GST_FLOW_OK)
- return ret;
+ goto exit_error;
break;
/* we ignore these two, as they don't tell us anything we care about */
@@ -1290,7 +1290,7 @@ gst_matroska_read_common_parse_header (GstMatroskaReadCommon * common,
case GST_EBML_ID_DOCTYPEVERSION:
ret = gst_ebml_read_skip (ebml);
if (ret != GST_FLOW_OK)
- return ret;
+ goto exit_error;
break;
}
}
@@ -1316,14 +1316,16 @@ exit:
GST_STR_NULL (doctype), version));
ret = GST_FLOW_ERROR;
}
- g_free (doctype);
} else {
GST_ELEMENT_ERROR (common, STREAM, WRONG_TYPE, (NULL),
("Input is not a matroska stream (doctype=%s)", doctype));
ret = GST_FLOW_ERROR;
- g_free (doctype);
}
+exit_error:
+
+ g_free (doctype);
+
return ret;
}
diff --git a/gst/monoscope/Makefile.in b/gst/monoscope/Makefile.in
index 86f0d9b7..a3ac565f 100644
--- a/gst/monoscope/Makefile.in
+++ b/gst/monoscope/Makefile.in
@@ -104,6 +104,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/gst/multifile/Makefile.in b/gst/multifile/Makefile.in
index 878e345f..2294fbb2 100644
--- a/gst/multifile/Makefile.in
+++ b/gst/multifile/Makefile.in
@@ -104,6 +104,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/gst/multipart/Makefile.in b/gst/multipart/Makefile.in
index 9a3d8f3f..013bb870 100644
--- a/gst/multipart/Makefile.in
+++ b/gst/multipart/Makefile.in
@@ -104,6 +104,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/gst/replaygain/Makefile.in b/gst/replaygain/Makefile.in
index 1111c8d8..11f7d05a 100644
--- a/gst/replaygain/Makefile.in
+++ b/gst/replaygain/Makefile.in
@@ -104,6 +104,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/gst/rtp/Makefile.in b/gst/rtp/Makefile.in
index 00bb0604..84609419 100644
--- a/gst/rtp/Makefile.in
+++ b/gst/rtp/Makefile.in
@@ -104,6 +104,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/gst/rtp/README b/gst/rtp/README
index 94549d70..5042bd54 100644
--- a/gst/rtp/README
+++ b/gst/rtp/README
@@ -181,7 +181,7 @@ of the sender.
Some pipelines to illustrate the process:
- gst-launch-1.0 v4l2src ! ffenc_h263p ! rtph263ppay ! udpsink
+ gst-launch-1.0 v4l2src ! videoconvert ! avenc_h263p ! rtph263ppay ! udpsink
v4l2src puts a GStreamer timestamp on the video frames base on the current
running_time. The encoder encodes and passed the timestamp on. The payloader
@@ -206,7 +206,7 @@ following pipeline:
gst-launch-1.0 udpsrc caps="application/x-rtp, media=(string)video,
clock-rate=(int)90000, encoding-name=(string)H263-1998" ! rtph263pdepay !
- ffdec_h263 ! xvimagesink
+ avdec_h263 ! autovideosink
It is important that the depayloader copies the incomming GStreamer timestamp
directly to the depayloaded output buffer. It should never attempt to perform
@@ -239,7 +239,7 @@ The following pipeline illustrates a receiver with a jitterbuffer.
gst-launch-1.0 udpsrc caps="application/x-rtp, media=(string)video,
clock-rate=(int)90000, encoding-name=(string)H263-1998" !
- gstrtpjitterbuffer latency=100 ! rtph263pdepay ! ffdec_h263 ! xvimagesink
+ rtpjitterbuffer latency=100 ! rtph263pdepay ! avdec_h263 ! autovideosink
The latency property on the jitterbuffer controls the amount of delay (in
milliseconds) to apply to the outgoing packets. A higher latency will produce
@@ -271,7 +271,7 @@ for example).
Some gst-launch-1.0 lines:
- gst-launch-0.10 -v videotestsrc ! ffenc_h263p ! rtph263ppay ! udpsink
+ gst-launch-1.0 -v videotestsrc ! videoconvert ! avenc_h263p ! rtph263ppay ! udpsink
Setting pipeline to PAUSED ...
/pipeline0/videotestsrc0.src: caps = video/x-raw, format=(string)I420,
@@ -289,10 +289,10 @@ Some gst-launch-1.0 lines:
Write down the caps on the udpsink and set them as the caps of the UDP
receiver:
- gst-launch-0.10 -v udpsrc caps="application/x-rtp, media=(string)video,
+ gst-launch-1.0 -v udpsrc caps="application/x-rtp, media=(string)video,
payload=(int)96, clock-rate=(int)90000, encoding-name=(string)H263-1998,
ssrc=(guint)527842345, clock-base=(guint)1150776941, seqnum-base=(guint)30982"
- ! rtph263pdepay ! ffdec_h263 ! xvimagesink
+ ! rtph263pdepay ! avdec_h263 ! autovideosink
The receiver now displays an h263 image. Since there is no jitterbuffer in the
pipeline, frames will be displayed at the time when they are received. This can
@@ -302,7 +302,7 @@ Some gst-launch-1.0 lines:
Stream a quicktime file with mpeg4 video and AAC audio on port 5000 and port
5002.
- gst-launch-0.10 -v filesrc location=~/data/sincity.mp4 ! qtdemux name=d ! queue ! rtpmp4vpay ! udpsink port=5000
+ gst-launch-1.0 -v filesrc location=~/data/sincity.mp4 ! qtdemux name=d ! queue ! rtpmp4vpay ! udpsink port=5000
d. ! queue ! rtpmp4gpay ! udpsink port=5002
....
/pipeline0/udpsink0.sink: caps = application/x-rtp, media=(string)video,
@@ -324,7 +324,7 @@ Some gst-launch-1.0 lines:
clock-rate=(int)90000, encoding-name=(string)MP4V-ES, ssrc=(guint)1162703703,
clock-base=(guint)816135835, seqnum-base=(guint)9294, profile-level-id=(string)3,
config=(string)000001b003000001b50900000100000001200086c5d4c307d314043c1463000001b25876694430303334"
- ! rtpmp4vdepay ! ffdec_mpeg4 ! xvimagesink sync=false
+ ! rtpmp4vdepay ! ffdec_mpeg4 ! autovideosink sync=false
udpsrc port=5002 caps="application/x-rtp, media=(string)audio, payload=(int)96,
clock-rate=(int)44100, encoding-name=(string)MPEG4-GENERIC, ssrc=(guint)3246149898,
clock-base=(guint)4134514058, seqnum-base=(guint)57633, encoding-params=(string)2,
diff --git a/gst/rtpmanager/Makefile.in b/gst/rtpmanager/Makefile.in
index 743fe2ae..0620d787 100644
--- a/gst/rtpmanager/Makefile.in
+++ b/gst/rtpmanager/Makefile.in
@@ -104,6 +104,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/gst/rtpmanager/gstrtpbin.c b/gst/rtpmanager/gstrtpbin.c
index a087c462..9cc7d6ef 100644
--- a/gst/rtpmanager/gstrtpbin.c
+++ b/gst/rtpmanager/gstrtpbin.c
@@ -67,7 +67,7 @@
* #GstRtpBin::request-rtp-decoder, #GstRtpBin::request-rtcp-encoder and
* #GstRtpBin::request-rtp-decoder) to dynamically request for RTP and RTCP encoders
* and decoders in order to support SRTP. The encoders must provide the pads
- * rtp_sink_\%d and rtp_src_\%d for RTP and rtcp_sink_\%d and rtcp_src_\%d for
+ * rtp_sink_\%u and rtp_src_\%u for RTP and rtcp_sink_\%u and rtcp_src_\%u for
* RTCP. The session number will be used in the pad name. The decoders must provide
* rtp_sink and rtp_src for RTP and rtcp_sink and rtcp_src for RTCP. The decoders will
* be placed before the #GstRtpSession element, thus they must support SSRC demuxing
diff --git a/gst/rtpmanager/gstrtpjitterbuffer.c b/gst/rtpmanager/gstrtpjitterbuffer.c
index 1459e91c..9e454928 100644
--- a/gst/rtpmanager/gstrtpjitterbuffer.c
+++ b/gst/rtpmanager/gstrtpjitterbuffer.c
@@ -2299,8 +2299,9 @@ gst_rtp_jitter_buffer_chain (GstPad * pad, GstObject * parent,
}
}
- GST_DEBUG_OBJECT (jitterbuffer, "Pushed packet #%d, now %d packets, head: %d",
- seqnum, rtp_jitter_buffer_num_packets (priv->jbuf), head);
+ GST_DEBUG_OBJECT (jitterbuffer,
+ "Pushed packet #%d, now %d packets, head: %d, " "percent %d", seqnum,
+ rtp_jitter_buffer_num_packets (priv->jbuf), head, percent);
msg = check_buffering_percent (jitterbuffer, percent);
@@ -2757,7 +2758,7 @@ do_lost_timeout (GstRtpJitterBuffer * jitterbuffer, TimerData * timer,
{
GstRtpJitterBufferPrivate *priv = jitterbuffer->priv;
GstClockTime duration, timestamp;
- guint seqnum, lost_packets, num_rtx_retry;
+ guint seqnum, lost_packets, num_rtx_retry, next_in_seqnum;
gboolean late, head;
GstEvent *event;
RTPJitterBufferItem *item;
@@ -2781,6 +2782,12 @@ do_lost_timeout (GstRtpJitterBuffer * jitterbuffer, TimerData * timer,
priv->num_late += lost_packets;
priv->num_rtx_failed += num_rtx_retry;
+ next_in_seqnum = (seqnum + lost_packets) & 0xffff;
+
+ /* we now only accept seqnum bigger than this */
+ if (gst_rtp_buffer_compare_seqnum (priv->next_in_seqnum, next_in_seqnum) > 0)
+ priv->next_in_seqnum = next_in_seqnum;
+
/* create paket lost event */
event = gst_event_new_custom (GST_EVENT_CUSTOM_DOWNSTREAM,
gst_structure_new ("GstRTPPacketLost",
@@ -2826,7 +2833,10 @@ do_deadline_timeout (GstRtpJitterBuffer * jitterbuffer, TimerData * timer,
GST_INFO_OBJECT (jitterbuffer, "got deadline timeout");
- priv->next_seqnum = timer->seqnum;
+ /* timer seqnum might have been obsoleted by caps seqnum-base,
+ * only mess with current ongoing seqnum if still unknown */
+ if (priv->next_seqnum == -1)
+ priv->next_seqnum = timer->seqnum;
remove_timer (jitterbuffer, timer);
JBUF_SIGNAL_EVENT (priv);
diff --git a/gst/rtpmanager/gstrtpmux.c b/gst/rtpmanager/gstrtpmux.c
index 1fdfad54..4cd06ab9 100644
--- a/gst/rtpmanager/gstrtpmux.c
+++ b/gst/rtpmanager/gstrtpmux.c
@@ -566,12 +566,7 @@ gst_rtp_mux_setcaps (GstPad * pad, GstRTPMux * rtp_mux, GstCaps * caps)
"setting caps %" GST_PTR_FORMAT " on src pad..", caps);
ret = gst_pad_set_caps (rtp_mux->srcpad, caps);
- if (rtp_mux->ssrc == -1) {
- if (gst_structure_has_field_typed (structure, "ssrc", G_TYPE_UINT)) {
- rtp_mux->current_ssrc = g_value_get_uint
- (gst_structure_get_value (structure, "ssrc"));
- }
- }
+ gst_structure_get_uint (structure, "ssrc", &rtp_mux->current_ssrc);
gst_caps_unref (caps);
diff --git a/gst/rtpmanager/gstrtprtxreceive.c b/gst/rtpmanager/gstrtprtxreceive.c
index bb0f7e43..52f6b017 100644
--- a/gst/rtpmanager/gstrtprtxreceive.c
+++ b/gst/rtpmanager/gstrtprtxreceive.c
@@ -122,6 +122,8 @@
#include "gstrtprtxreceive.h"
+#define ASSOC_TIMEOUT (GST_SECOND)
+
GST_DEBUG_CATEGORY_STATIC (gst_rtp_rtx_receive_debug);
#define GST_CAT_DEFAULT gst_rtp_rtx_receive_debug
@@ -237,6 +239,29 @@ gst_rtp_rtx_receive_finalize (GObject * object)
G_OBJECT_CLASS (gst_rtp_rtx_receive_parent_class)->finalize (object);
}
+typedef struct
+{
+ guint32 ssrc;
+ GstClockTime time;
+} SsrcAssoc;
+
+static SsrcAssoc *
+ssrc_assoc_new (guint32 ssrc, GstClockTime time)
+{
+ SsrcAssoc *assoc = g_slice_new (SsrcAssoc);
+
+ assoc->ssrc = ssrc;
+ assoc->time = time;
+
+ return assoc;
+}
+
+static void
+ssrc_assoc_free (SsrcAssoc * assoc)
+{
+ g_slice_free (SsrcAssoc, assoc);
+}
+
static void
gst_rtp_rtx_receive_init (GstRtpRtxReceive * rtx)
{
@@ -261,7 +286,8 @@ gst_rtp_rtx_receive_init (GstRtpRtxReceive * rtx)
gst_element_add_pad (GST_ELEMENT (rtx), rtx->sinkpad);
rtx->ssrc2_ssrc1_map = g_hash_table_new (g_direct_hash, g_direct_equal);
- rtx->seqnum_ssrc1_map = g_hash_table_new (g_direct_hash, g_direct_equal);
+ rtx->seqnum_ssrc1_map = g_hash_table_new_full (g_direct_hash, g_direct_equal,
+ NULL, (GDestroyNotify) ssrc_assoc_free);
rtx->rtx_pt_map = g_hash_table_new (g_direct_hash, g_direct_equal);
}
@@ -282,7 +308,6 @@ gst_rtp_rtx_receive_src_event (GstPad * pad, GstObject * parent,
if (gst_structure_has_name (s, "GstRTPRetransmissionRequest")) {
guint seqnum = 0;
guint ssrc = 0;
- gpointer ssrc1 = 0;
gpointer ssrc2 = 0;
/* retrieve seqnum of the packet that need to be restransmisted */
@@ -314,12 +339,14 @@ gst_rtp_rtx_receive_src_event (GstPad * pad, GstObject * parent,
GST_DEBUG_OBJECT (rtx, "Retransmited stream %" G_GUINT32_FORMAT
" already associated to its master", GPOINTER_TO_UINT (ssrc2));
} else {
+ SsrcAssoc *assoc;
+
/* not already associated but also we have to check that we have not
* already considered this request.
*/
if (g_hash_table_lookup_extended (rtx->seqnum_ssrc1_map,
- GUINT_TO_POINTER (seqnum), NULL, &ssrc1)) {
- if (GPOINTER_TO_UINT (ssrc1) == ssrc) {
+ GUINT_TO_POINTER (seqnum), NULL, (gpointer *) & assoc)) {
+ if (assoc->ssrc == ssrc) {
/* do nothing because we have already considered this request
* The jitter may be too impatient of the rtx packet has been
* lost too.
@@ -329,34 +356,45 @@ gst_rtp_rtx_receive_src_event (GstPad * pad, GstObject * parent,
GST_DEBUG_OBJECT (rtx, "Duplicated request seqnum: %"
G_GUINT32_FORMAT ", ssrc1: %" G_GUINT32_FORMAT, seqnum, ssrc);
} else {
- /* From RFC 4588:
- * the receiver MUST NOT have two outstanding requests for the
- * same packet sequence number in two different original streams
- * before the association is resolved. Otherwise it's impossible
- * to associate a rtx stream and its master stream
+
+ /* If the association attempt is larger than ASSOC_TIMEOUT,
+ * then we give up on it, and try this one.
*/
- GST_DEBUG_OBJECT (rtx,
- "reject request for seqnum %" G_GUINT32_FORMAT
- "of master stream %" G_GUINT32_FORMAT, seqnum, ssrc);
- res = TRUE;
-
- /* remove seqnum in order to reuse the spot */
- g_hash_table_remove (rtx->seqnum_ssrc1_map,
- GUINT_TO_POINTER (seqnum));
-
- /* do not forward the event as we are rejecting this request */
- GST_OBJECT_UNLOCK (rtx);
- gst_event_unref (event);
- return res;
+ if (!GST_CLOCK_TIME_IS_VALID (rtx->last_time) ||
+ !GST_CLOCK_TIME_IS_VALID (assoc->time) ||
+ assoc->time + ASSOC_TIMEOUT < rtx->last_time) {
+ /* From RFC 4588:
+ * the receiver MUST NOT have two outstanding requests for the
+ * same packet sequence number in two different original streams
+ * before the association is resolved. Otherwise it's impossible
+ * to associate a rtx stream and its master stream
+ */
+
+ /* remove seqnum in order to reuse the spot */
+ g_hash_table_remove (rtx->seqnum_ssrc1_map,
+ GUINT_TO_POINTER (seqnum));
+ goto retransmit;
+ } else {
+ GST_DEBUG_OBJECT (rtx,
+ "reject request for seqnum %" G_GUINT32_FORMAT
+ " of master stream %" G_GUINT32_FORMAT, seqnum, ssrc);
+
+ /* do not forward the event as we are rejecting this request */
+ GST_OBJECT_UNLOCK (rtx);
+ gst_event_unref (event);
+ return TRUE;
+ }
}
} else {
+ retransmit:
/* the request has not been already considered
* insert it for the first time */
GST_DEBUG_OBJECT (rtx,
"packet number %" G_GUINT32_FORMAT " of master stream %"
G_GUINT32_FORMAT " needs to be retransmited", seqnum, ssrc);
g_hash_table_insert (rtx->seqnum_ssrc1_map,
- GUINT_TO_POINTER (seqnum), GUINT_TO_POINTER (ssrc));
+ GUINT_TO_POINTER (seqnum),
+ ssrc_assoc_new (ssrc, rtx->last_time));
}
}
@@ -463,6 +501,8 @@ gst_rtp_rtx_receive_chain (GstPad * pad, GstObject * parent, GstBuffer * buffer)
/* check if we have a retransmission packet (this information comes from SDP) */
GST_OBJECT_LOCK (rtx);
+ rtx->last_time = GST_BUFFER_PTS (buffer);
+
is_rtx =
g_hash_table_lookup_extended (rtx->rtx_pt_map,
GUINT_TO_POINTER (payload_type), NULL, NULL);
@@ -488,17 +528,25 @@ gst_rtp_rtx_receive_chain (GstPad * pad, GstObject * parent, GstBuffer * buffer)
GPOINTER_TO_UINT (ssrc1));
ssrc2 = ssrc;
} else {
+ SsrcAssoc *assoc;
+
/* the current retransmisted packet has its rtx stream not already
* associated to a master stream, so retrieve it from our request
* history */
if (g_hash_table_lookup_extended (rtx->seqnum_ssrc1_map,
- GUINT_TO_POINTER (orign_seqnum), NULL, &ssrc1)) {
+ GUINT_TO_POINTER (orign_seqnum), NULL, (gpointer *) & assoc)) {
GST_DEBUG_OBJECT (rtx,
"associate retransmisted stream %" G_GUINT32_FORMAT
" to master stream %" G_GUINT32_FORMAT " thanks to packet %"
- G_GUINT16_FORMAT "", ssrc, GPOINTER_TO_UINT (ssrc1), orign_seqnum);
+ G_GUINT16_FORMAT "", ssrc, assoc->ssrc, orign_seqnum);
+ ssrc1 = GUINT_TO_POINTER (assoc->ssrc);
ssrc2 = ssrc;
+ /* just put a guard */
+ if (GPOINTER_TO_UINT (ssrc1) == ssrc2)
+ GST_WARNING_OBJECT (rtx, "RTX receiver ssrc2_ssrc1_map bad state, "
+ "ssrc %" G_GUINT32_FORMAT " are the same\n", ssrc);
+
/* free the spot so that this seqnum can be used to do another
* association */
g_hash_table_remove (rtx->seqnum_ssrc1_map,
@@ -508,17 +556,13 @@ gst_rtp_rtx_receive_chain (GstPad * pad, GstObject * parent, GstBuffer * buffer)
g_hash_table_insert (rtx->ssrc2_ssrc1_map, GUINT_TO_POINTER (ssrc2),
ssrc1);
- /* just put a guard */
- if (GPOINTER_TO_UINT (ssrc1) == ssrc2)
- GST_WARNING_OBJECT (rtx, "RTX receiver ssrc2_ssrc1_map bad state, "
- "ssrc %" G_GUINT32_FORMAT " are the same\n", ssrc);
-
/* also do the association between master stream and rtx stream
* every ssrc are unique so we can use the same hash table
* for both retrieving the ssrc1 from ssrc2 and also ssrc2 from ssrc1
*/
g_hash_table_insert (rtx->ssrc2_ssrc1_map, ssrc1,
GUINT_TO_POINTER (ssrc2));
+
} else {
/* we are not able to associate this rtx packet with a master stream */
GST_DEBUG_OBJECT (rtx,
diff --git a/gst/rtpmanager/gstrtprtxreceive.h b/gst/rtpmanager/gstrtprtxreceive.h
index c6b9cdf4..cf6c4a9f 100644
--- a/gst/rtpmanager/gstrtprtxreceive.h
+++ b/gst/rtpmanager/gstrtprtxreceive.h
@@ -63,6 +63,8 @@ struct _GstRtpRtxReceive
guint num_rtx_requests;
guint num_rtx_packets;
guint num_rtx_assoc_packets;
+
+ GstClockTime last_time;
};
struct _GstRtpRtxReceiveClass
diff --git a/gst/rtpmanager/rtpjitterbuffer.c b/gst/rtpmanager/rtpjitterbuffer.c
index 1f05cd41..19a1ef36 100644
--- a/gst/rtpmanager/rtpjitterbuffer.c
+++ b/gst/rtpmanager/rtpjitterbuffer.c
@@ -664,7 +664,7 @@ gboolean
rtp_jitter_buffer_insert (RTPJitterBuffer * jbuf, RTPJitterBufferItem * item,
gboolean * head, gint * percent)
{
- GList *list;
+ GList *list, *event = NULL;
guint32 rtptime;
guint16 seqnum;
GstClockTime dts;
@@ -686,8 +686,14 @@ rtp_jitter_buffer_insert (RTPJitterBuffer * jbuf, RTPJitterBufferItem * item,
gint gap;
RTPJitterBufferItem *qitem = (RTPJitterBufferItem *) list;
- if (qitem->seqnum == -1)
- break;
+ if (qitem->seqnum == -1) {
+ /* keep a pointer to the first consecutive event if not already
+ * set. we will insert the packet after the event if we can't find
+ * a packet with lower sequence number before the event. */
+ if (event == NULL)
+ event = list;
+ continue;
+ }
qseq = qitem->seqnum;
@@ -701,8 +707,17 @@ rtp_jitter_buffer_insert (RTPJitterBuffer * jbuf, RTPJitterBufferItem * item,
/* seqnum > qseq, we can stop looking */
if (G_LIKELY (gap < 0))
break;
+
+ /* if we've found a packet with greater sequence number, cleanup the
+ * event pointer as the packet will be inserted before the event */
+ event = NULL;
}
+ /* if event is set it means that packets before the event had smaller
+ * sequence number, so we will insert our packet after the event */
+ if (event)
+ list = event;
+
dts = item->dts;
if (item->rtptime == -1)
goto append;
diff --git a/gst/rtpmanager/rtpsession.c b/gst/rtpmanager/rtpsession.c
index c2942724..7e2aa0af 100644
--- a/gst/rtpmanager/rtpsession.c
+++ b/gst/rtpmanager/rtpsession.c
@@ -100,11 +100,6 @@ enum
(avg) = ((val) + (15 * (avg))) >> 4;
-/* The number RTCP intervals after which to timeout entries in the
- * collision table
- */
-#define RTCP_INTERVAL_COLLISION_TIMEOUT 10
-
/* GObject vmethods */
static void rtp_session_finalize (GObject * object);
static void rtp_session_set_property (GObject * object, guint prop_id,
@@ -122,7 +117,7 @@ static guint32 rtp_session_create_new_ssrc (RTPSession * sess);
static RTPSource *obtain_source (RTPSession * sess, guint32 ssrc,
gboolean * created, RTPPacketInfo * pinfo, gboolean rtp);
static RTPSource *obtain_internal_source (RTPSession * sess,
- guint32 ssrc, gboolean * created);
+ guint32 ssrc, gboolean * created, GstClockTime current_time);
static GstFlowReturn rtp_session_schedule_bye_locked (RTPSession * sess,
GstClockTime current_time);
static GstClockTime calculate_rtcp_interval (RTPSession * sess,
@@ -546,6 +541,9 @@ rtp_session_finalize (GObject * object)
gst_structure_free (sess->sdes);
+ g_list_free_full (sess->conflicting_addresses,
+ (GDestroyNotify) rtp_conflicting_address_free);
+
for (i = 0; i < 32; i++)
g_hash_table_destroy (sess->ssrcs[i]);
@@ -1207,6 +1205,43 @@ static RTPSourceCallbacks callbacks = {
(RTPSourceClockRate) source_clock_rate,
};
+
+/**
+ * rtp_session_find_conflicting_address:
+ * @session: The session the packet came in
+ * @address: address to check for
+ * @time: The time when the packet that is possibly in conflict arrived
+ *
+ * Checks if an address which has a conflict is already known. If it is
+ * a known conflict, remember the time
+ *
+ * Returns: TRUE if it was a known conflict, FALSE otherwise
+ */
+static gboolean
+rtp_session_find_conflicting_address (RTPSession * session,
+ GSocketAddress * address, GstClockTime time)
+{
+ return find_conflicting_address (session->conflicting_addresses, address,
+ time);
+}
+
+/**
+ * rtp_session_add_conflicting_address:
+ * @session: The session the packet came in
+ * @address: address to remember
+ * @time: The time when the packet that is in conflict arrived
+ *
+ * Adds a new conflict address
+ */
+static void
+rtp_session_add_conflicting_address (RTPSession * sess,
+ GSocketAddress * address, GstClockTime time)
+{
+ sess->conflicting_addresses =
+ add_conflicting_address (sess->conflicting_addresses, address, time);
+}
+
+
static gboolean
check_collision (RTPSession * sess, RTPSource * source,
RTPPacketInfo * pinfo, gboolean rtp)
@@ -1292,7 +1327,7 @@ check_collision (RTPSession * sess, RTPSource * source,
*/
} else {
/* This is sending with our ssrc, is it an address we already know */
- if (rtp_source_find_conflicting_address (source, pinfo->address,
+ if (rtp_session_find_conflicting_address (sess, pinfo->address,
pinfo->current_time)) {
/* Its a known conflict, its probably a loop, not a collision
* lets just drop the incoming packet
@@ -1300,7 +1335,7 @@ check_collision (RTPSession * sess, RTPSource * source,
GST_DEBUG ("Our packets are being looped back to us, dropping");
} else {
/* Its a new collision, lets change our SSRC */
- rtp_source_add_conflicting_address (source, pinfo->address,
+ rtp_session_add_conflicting_address (sess, pinfo->address,
pinfo->current_time);
GST_DEBUG ("Collision for SSRC %x", ssrc);
@@ -1491,7 +1526,8 @@ obtain_source (RTPSession * sess, guint32 ssrc, gboolean * created,
/* must be called with the session lock, the returned source needs to be
* unreffed after usage. */
static RTPSource *
-obtain_internal_source (RTPSession * sess, guint32 ssrc, gboolean * created)
+obtain_internal_source (RTPSession * sess, guint32 ssrc, gboolean * created,
+ GstClockTime current_time)
{
RTPSource *source;
@@ -1513,6 +1549,11 @@ obtain_internal_source (RTPSession * sess, guint32 ssrc, gboolean * created)
} else {
*created = FALSE;
}
+ /* update last activity */
+ if (current_time != GST_CLOCK_TIME_NONE) {
+ source->last_activity = current_time;
+ source->last_rtp_activity = current_time;
+ }
g_object_ref (source);
return source;
@@ -2602,7 +2643,7 @@ rtp_session_update_send_caps (RTPSession * sess, GstCaps * caps)
gboolean created;
RTP_SESSION_LOCK (sess);
- source = obtain_internal_source (sess, ssrc, &created);
+ source = obtain_internal_source (sess, ssrc, &created, GST_CLOCK_TIME_NONE);
if (source) {
rtp_source_update_caps (source, caps);
g_object_unref (source);
@@ -2645,10 +2686,7 @@ rtp_session_send_rtp (RTPSession * sess, gpointer data, gboolean is_list,
current_time, running_time, -1))
goto invalid_packet;
- source = obtain_internal_source (sess, pinfo.ssrc, &created);
-
- /* update last activity */
- source->last_rtp_activity = current_time;
+ source = obtain_internal_source (sess, pinfo.ssrc, &created, current_time);
prevsender = RTP_SOURCE_IS_SENDER (source);
oldrate = source->bitrate;
@@ -3179,8 +3217,6 @@ session_cleanup (const gchar * key, RTPSource * source, ReportData * data)
if (source->internal) {
GST_DEBUG ("Timing out collisions for %x", source->ssrc);
rtp_source_timeout (source, data->current_time,
- /* "a relatively long time" -- RFC 3550 section 8.2 */
- RTP_STATS_MIN_INTERVAL * GST_SECOND * 10,
data->running_time - sess->rtcp_feedback_retention_window);
}
@@ -3214,26 +3250,41 @@ session_cleanup (const gchar * key, RTPSource * source, ReportData * data)
GST_LOG ("timeout base interval %" GST_TIME_FORMAT,
GST_TIME_ARGS (binterval));
- if (!source->internal) {
- if (source->marked_bye) {
- /* if we received a BYE from the source, remove the source after some
- * time. */
- if (data->current_time > source->bye_time &&
- data->current_time - source->bye_time > sess->stats.bye_timeout) {
- GST_DEBUG ("removing BYE source %08x", source->ssrc);
- remove = TRUE;
- byetimeout = TRUE;
- }
+ if (!source->internal && source->marked_bye) {
+ /* if we received a BYE from the source, remove the source after some
+ * time. */
+ if (data->current_time > source->bye_time &&
+ data->current_time - source->bye_time > sess->stats.bye_timeout) {
+ GST_DEBUG ("removing BYE source %08x", source->ssrc);
+ remove = TRUE;
+ byetimeout = TRUE;
}
- /* sources that were inactive for more than 5 times the deterministic reporting
- * interval get timed out. the min timeout is 5 seconds. */
- /* mind old time that might pre-date last time going to PLAYING */
- btime = MAX (source->last_activity, sess->start_time);
- if (data->current_time > btime) {
- interval = MAX (binterval * 5, 5 * GST_SECOND);
- if (data->current_time - btime > interval) {
- GST_DEBUG ("removing timeout source %08x, last %" GST_TIME_FORMAT,
- source->ssrc, GST_TIME_ARGS (btime));
+ }
+
+ if (source->internal && source->sent_bye) {
+ GST_DEBUG ("removing internal source that has sent BYE %08x", source->ssrc);
+ remove = TRUE;
+ }
+
+ /* sources that were inactive for more than 5 times the deterministic reporting
+ * interval get timed out. the min timeout is 5 seconds. */
+ /* mind old time that might pre-date last time going to PLAYING */
+ btime = MAX (source->last_activity, sess->start_time);
+ if (data->current_time > btime) {
+ interval = MAX (binterval * 5, 5 * GST_SECOND);
+ if (data->current_time - btime > interval) {
+ GST_DEBUG ("removing timeout source %08x, last %" GST_TIME_FORMAT,
+ source->ssrc, GST_TIME_ARGS (btime));
+ if (source->internal) {
+ /* this is an internal source that is not using our suggested ssrc.
+ * since there must be another source using this ssrc, we can remove
+ * this one instead of making it a receiver forever */
+ if (source->ssrc != sess->suggested_ssrc) {
+ rtp_source_mark_bye (source, "timed out");
+ /* do not schedule bye here, since we are inside the RTCP timeout
+ * processing and scheduling bye will interfere with SR/RR sending */
+ }
+ } else {
remove = TRUE;
}
}
@@ -3247,16 +3298,9 @@ session_cleanup (const gchar * key, RTPSource * source, ReportData * data)
if (data->current_time > btime) {
interval = MAX (binterval * 2, 5 * GST_SECOND);
if (data->current_time - btime > interval) {
- if (source->internal && source->sent_bye) {
- /* an internal source is BYE and stopped sending RTP, remove */
- GST_DEBUG ("internal BYE source %08x timed out, last %"
- GST_TIME_FORMAT, source->ssrc, GST_TIME_ARGS (btime));
- remove = TRUE;
- } else {
- GST_DEBUG ("sender source %08x timed out and became receiver, last %"
- GST_TIME_FORMAT, source->ssrc, GST_TIME_ARGS (btime));
- sendertimeout = TRUE;
- }
+ GST_DEBUG ("sender source %08x timed out and became receiver, last %"
+ GST_TIME_FORMAT, source->ssrc, GST_TIME_ARGS (btime));
+ sendertimeout = TRUE;
}
}
}
@@ -3618,10 +3662,14 @@ rtp_session_on_timeout (RTPSession * sess, GstClockTime current_time,
RTPSource *source;
gboolean created;
- source = obtain_internal_source (sess, sess->suggested_ssrc, &created);
+ source = obtain_internal_source (sess, sess->suggested_ssrc, &created,
+ current_time);
g_object_unref (source);
}
+ sess->conflicting_addresses =
+ timeout_conflicting_addresses (sess->conflicting_addresses, current_time);
+
/* Make a local copy of the hashtable. We need to do this because the
* cleanup stage below releases the session lock. */
table_copy = g_hash_table_new_full (NULL, NULL, NULL,
diff --git a/gst/rtpmanager/rtpsession.h b/gst/rtpmanager/rtpsession.h
index 87388aec..b567ee46 100644
--- a/gst/rtpmanager/rtpsession.h
+++ b/gst/rtpmanager/rtpsession.h
@@ -204,6 +204,7 @@ typedef struct {
* @callbacks: callbacks
* @user_data: user data passed in callbacks
* @stats: session statistics
+ * @conflicting_addresses: GList of conflicting addresses
*
* The RTP session manager object
*/
@@ -269,6 +270,8 @@ struct _RTPSession {
gboolean last_keyframe_all_headers;
gboolean is_doing_ptp;
+
+ GList *conflicting_addresses;
};
/**
diff --git a/gst/rtpmanager/rtpsource.c b/gst/rtpmanager/rtpsource.c
index 9a56955c..d47c85fb 100644
--- a/gst/rtpmanager/rtpsource.c
+++ b/gst/rtpmanager/rtpsource.c
@@ -267,11 +267,11 @@ rtp_source_init (RTPSource * src)
rtp_source_reset (src);
}
-static void
+void
rtp_conflicting_address_free (RTPConflictingAddress * addr)
{
g_object_unref (addr->address);
- g_free (addr);
+ g_slice_free (RTPConflictingAddress, addr);
}
static void
@@ -292,10 +292,8 @@ rtp_source_finalize (GObject * object)
gst_caps_replace (&src->caps, NULL);
- g_list_foreach (src->conflicting_addresses,
- (GFunc) rtp_conflicting_address_free, NULL);
- g_list_free (src->conflicting_addresses);
-
+ g_list_free_full (src->conflicting_addresses,
+ (GDestroyNotify) rtp_conflicting_address_free);
while ((buffer = g_queue_pop_head (src->retained_feedback)))
gst_buffer_unref (buffer);
g_queue_free (src->retained_feedback);
@@ -1600,6 +1598,67 @@ rtp_source_get_last_rb (RTPSource * src, guint8 * fractionlost,
return TRUE;
}
+gboolean
+find_conflicting_address (GList * conflicting_addresses,
+ GSocketAddress * address, GstClockTime time)
+{
+ GList *item;
+
+ for (item = conflicting_addresses; item; item = g_list_next (item)) {
+ RTPConflictingAddress *known_conflict = item->data;
+
+ if (__g_socket_address_equal (address, known_conflict->address)) {
+ known_conflict->time = time;
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+GList *
+add_conflicting_address (GList * conflicting_addresses,
+ GSocketAddress * address, GstClockTime time)
+{
+ RTPConflictingAddress *new_conflict;
+
+ new_conflict = g_slice_new (RTPConflictingAddress);
+
+ new_conflict->address = G_SOCKET_ADDRESS (g_object_ref (address));
+ new_conflict->time = time;
+
+ return g_list_prepend (conflicting_addresses, new_conflict);
+}
+
+GList *
+timeout_conflicting_addresses (GList * conflicting_addresses,
+ GstClockTime current_time)
+{
+ GList *item;
+ /* "a relatively long time" -- RFC 3550 section 8.2 */
+ const GstClockTime collision_timeout =
+ RTP_STATS_MIN_INTERVAL * GST_SECOND * 10;
+
+ item = g_list_first (conflicting_addresses);
+ while (item) {
+ RTPConflictingAddress *known_conflict = item->data;
+ GList *next_item = g_list_next (item);
+
+ if (known_conflict->time < current_time - collision_timeout) {
+ gchar *buf;
+
+ conflicting_addresses = g_list_delete_link (conflicting_addresses, item);
+ buf = __g_socket_address_to_string (known_conflict->address);
+ GST_DEBUG ("collision %p timed out: %s", known_conflict, buf);
+ g_free (buf);
+ rtp_conflicting_address_free (known_conflict);
+ }
+ item = next_item;
+ }
+
+ return conflicting_addresses;
+}
+
/**
* rtp_source_find_conflicting_address:
* @src: The source the packet came in
@@ -1615,19 +1674,7 @@ gboolean
rtp_source_find_conflicting_address (RTPSource * src, GSocketAddress * address,
GstClockTime time)
{
- GList *item;
-
- for (item = g_list_first (src->conflicting_addresses);
- item; item = g_list_next (item)) {
- RTPConflictingAddress *known_conflict = item->data;
-
- if (__g_socket_address_equal (address, known_conflict->address)) {
- known_conflict->time = time;
- return TRUE;
- }
- }
-
- return FALSE;
+ return find_conflicting_address (src->conflicting_addresses, address, time);
}
/**
@@ -1642,22 +1689,14 @@ void
rtp_source_add_conflicting_address (RTPSource * src,
GSocketAddress * address, GstClockTime time)
{
- RTPConflictingAddress *new_conflict;
-
- new_conflict = g_new0 (RTPConflictingAddress, 1);
-
- new_conflict->address = G_SOCKET_ADDRESS (g_object_ref (address));
- new_conflict->time = time;
-
- src->conflicting_addresses = g_list_prepend (src->conflicting_addresses,
- new_conflict);
+ src->conflicting_addresses =
+ add_conflicting_address (src->conflicting_addresses, address, time);
}
/**
* rtp_source_timeout:
* @src: The #RTPSource
* @current_time: The current time
- * @collision_timeout: The amount of time after which a collision is timed out
* @feedback_retention_window: The running time before which retained feedback
* packets have to be discarded
*
@@ -1666,29 +1705,12 @@ rtp_source_add_conflicting_address (RTPSource * src,
*/
void
rtp_source_timeout (RTPSource * src, GstClockTime current_time,
- GstClockTime collision_timeout, GstClockTime feedback_retention_window)
+ GstClockTime feedback_retention_window)
{
- GList *item;
GstRTCPPacket *pkt;
- item = g_list_first (src->conflicting_addresses);
- while (item) {
- RTPConflictingAddress *known_conflict = item->data;
- GList *next_item = g_list_next (item);
-
- if (known_conflict->time < current_time - collision_timeout) {
- gchar *buf;
-
- src->conflicting_addresses =
- g_list_delete_link (src->conflicting_addresses, item);
- buf = __g_socket_address_to_string (known_conflict->address);
- GST_DEBUG ("collision %p timed out: %s", known_conflict, buf);
- g_free (buf);
- g_object_unref (known_conflict->address);
- g_free (known_conflict);
- }
- item = next_item;
- }
+ src->conflicting_addresses =
+ timeout_conflicting_addresses (src->conflicting_addresses, current_time);
/* Time out AVPF packets that are older than the desired length */
while ((pkt = g_queue_peek_tail (src->retained_feedback)) &&
diff --git a/gst/rtpmanager/rtpsource.h b/gst/rtpmanager/rtpsource.h
index 9af7d8ac..ed4adc9a 100644
--- a/gst/rtpmanager/rtpsource.h
+++ b/gst/rtpmanager/rtpsource.h
@@ -266,9 +266,20 @@ void rtp_source_add_conflicting_address (RTPSource * src,
GSocketAddress *address,
GstClockTime time);
+gboolean find_conflicting_address (GList * conflicting_address,
+ GSocketAddress * address,
+ GstClockTime time);
+
+GList * add_conflicting_address (GList * conflicting_addresses,
+ GSocketAddress * address,
+ GstClockTime time);
+GList * timeout_conflicting_addresses (GList * conflicting_addresses,
+ GstClockTime current_time);
+
+void rtp_conflicting_address_free (RTPConflictingAddress * addr);
+
void rtp_source_timeout (RTPSource * src,
GstClockTime current_time,
- GstClockTime collision_timeout,
GstClockTime feedback_retention_window);
void rtp_source_retain_rtcp_packet (RTPSource * src,
diff --git a/gst/rtsp/Makefile.in b/gst/rtsp/Makefile.in
index 98c1eab3..ff558301 100644
--- a/gst/rtsp/Makefile.in
+++ b/gst/rtsp/Makefile.in
@@ -104,6 +104,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/gst/rtsp/gstrtspsrc.c b/gst/rtsp/gstrtspsrc.c
index ae875bf8..ffb0dee1 100644
--- a/gst/rtsp/gstrtspsrc.c
+++ b/gst/rtsp/gstrtspsrc.c
@@ -1427,6 +1427,7 @@ gst_rtspsrc_create_stream (GstRTSPSrc * src, GstSDPMessage * sdp, gint idx)
stream->discont = TRUE;
stream->seqbase = -1;
stream->timebase = -1;
+ stream->send_ssrc = g_random_int ();
stream->profile = GST_RTSP_PROFILE_AVP;
stream->ptmap = g_array_new (FALSE, FALSE, sizeof (PtMapItem));
g_array_set_clear_func (stream->ptmap, (GDestroyNotify) clear_ptmap_item);
@@ -5838,7 +5839,6 @@ gst_rtspsrc_stream_make_keymgmt (GstRTSPSrc * src, GstRTSPStream * stream)
gst_mikey_message_set_info (msg, GST_MIKEY_VERSION, GST_MIKEY_TYPE_PSK_INIT,
FALSE, GST_MIKEY_PRF_MIKEY_1, g_random_int (), GST_MIKEY_MAP_TYPE_SRTP);
/* add policy '0' for our SSRC */
- stream->send_ssrc = g_random_int ();
gst_mikey_message_add_cs_srtp (msg, 0, stream->send_ssrc, 0);
/* timestamp is now */
gst_mikey_message_add_t_now_ntp_utc (msg);
diff --git a/gst/shapewipe/Makefile.in b/gst/shapewipe/Makefile.in
index ec7c3aab..6968f5d8 100644
--- a/gst/shapewipe/Makefile.in
+++ b/gst/shapewipe/Makefile.in
@@ -104,6 +104,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/gst/smpte/Makefile.in b/gst/smpte/Makefile.in
index 96a4b5b6..53e199fb 100644
--- a/gst/smpte/Makefile.in
+++ b/gst/smpte/Makefile.in
@@ -104,6 +104,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/gst/spectrum/Makefile.in b/gst/spectrum/Makefile.in
index 56fa9bd6..5f19f69c 100644
--- a/gst/spectrum/Makefile.in
+++ b/gst/spectrum/Makefile.in
@@ -104,6 +104,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/gst/udp/Makefile.in b/gst/udp/Makefile.in
index 5c9f98b7..e0b028d2 100644
--- a/gst/udp/Makefile.in
+++ b/gst/udp/Makefile.in
@@ -104,6 +104,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/gst/videobox/Makefile.in b/gst/videobox/Makefile.in
index 4720f26b..d64a451a 100644
--- a/gst/videobox/Makefile.in
+++ b/gst/videobox/Makefile.in
@@ -127,6 +127,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/gst/videocrop/Makefile.in b/gst/videocrop/Makefile.in
index 98894afa..d74a0ec7 100644
--- a/gst/videocrop/Makefile.in
+++ b/gst/videocrop/Makefile.in
@@ -104,6 +104,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/gst/videofilter/Makefile.in b/gst/videofilter/Makefile.in
index 6792d568..1f419d1a 100644
--- a/gst/videofilter/Makefile.in
+++ b/gst/videofilter/Makefile.in
@@ -104,6 +104,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/gst/videomixer/Makefile.in b/gst/videomixer/Makefile.in
index 2cc893ec..7f59ab7e 100644
--- a/gst/videomixer/Makefile.in
+++ b/gst/videomixer/Makefile.in
@@ -127,6 +127,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/gst/videomixer/videomixerorc-dist.c b/gst/videomixer/videomixerorc-dist.c
index b8002c75..05c18637 100644
--- a/gst/videomixer/videomixerorc-dist.c
+++ b/gst/videomixer/videomixerorc-dist.c
@@ -1890,7 +1890,7 @@ video_mixer_orc_overlay_argb (guint8 * ORC_RESTRICT d1, int d1_stride,
static const orc_uint8 bc[] = {
1, 7, 9, 28, 118, 105, 100, 101, 111, 95, 109, 105, 120, 101, 114, 95,
111, 114, 99, 95, 111, 118, 101, 114, 108, 97, 121, 95, 97, 114, 103,
- 98,
+ 98,
11, 4, 4, 12, 4, 4, 14, 4, 255, 255, 255, 255, 14, 4, 255, 0,
0, 0, 14, 4, 0, 255, 255, 255, 14, 4, 8, 0, 0, 0, 16, 2,
20, 4, 20, 2, 20, 1, 20, 8, 20, 8, 20, 8, 20, 4, 20, 8,
@@ -2456,7 +2456,7 @@ video_mixer_orc_overlay_bgra (guint8 * ORC_RESTRICT d1, int d1_stride,
static const orc_uint8 bc[] = {
1, 7, 9, 28, 118, 105, 100, 101, 111, 95, 109, 105, 120, 101, 114, 95,
111, 114, 99, 95, 111, 118, 101, 114, 108, 97, 121, 95, 98, 103, 114,
- 97,
+ 97,
11, 4, 4, 12, 4, 4, 14, 4, 255, 255, 255, 255, 14, 4, 0, 0,
0, 255, 14, 4, 255, 255, 255, 0, 14, 4, 24, 0, 0, 0, 14, 4,
8, 0, 0, 0, 16, 2, 20, 4, 20, 4, 20, 2, 20, 1, 20, 8,
@@ -2665,7 +2665,7 @@ videomixer_video_convert_orc_memcpy_2d (guint8 * ORC_RESTRICT d1, int d1_stride,
static const orc_uint8 bc[] = {
1, 7, 9, 38, 118, 105, 100, 101, 111, 109, 105, 120, 101, 114, 95, 118,
105, 100, 101, 111, 95, 99, 111, 110, 118, 101, 114, 116, 95, 111, 114,
- 99,
+ 99,
95, 109, 101, 109, 99, 112, 121, 95, 50, 100, 11, 1, 1, 12, 1, 1,
42, 0, 4, 2, 0,
};
@@ -2887,9 +2887,9 @@ videomixer_video_convert_orc_convert_I420_UYVY (guint8 * ORC_RESTRICT d1,
#if 1
static const orc_uint8 bc[] = {
1, 9, 46, 118, 105, 100, 101, 111, 109, 105, 120, 101, 114, 95, 118,
- 105,
+ 105,
100, 101, 111, 95, 99, 111, 110, 118, 101, 114, 116, 95, 111, 114, 99,
- 95,
+ 95,
99, 111, 110, 118, 101, 114, 116, 95, 73, 52, 50, 48, 95, 85, 89, 86,
89, 11, 4, 4, 11, 4, 4, 12, 2, 2, 12, 2, 2, 12, 1, 1,
12, 1, 1, 20, 2, 196, 32, 6, 7, 21, 1, 196, 0, 32, 4, 21,
@@ -3123,9 +3123,9 @@ videomixer_video_convert_orc_convert_I420_YUY2 (guint8 * ORC_RESTRICT d1,
#if 1
static const orc_uint8 bc[] = {
1, 9, 46, 118, 105, 100, 101, 111, 109, 105, 120, 101, 114, 95, 118,
- 105,
+ 105,
100, 101, 111, 95, 99, 111, 110, 118, 101, 114, 116, 95, 111, 114, 99,
- 95,
+ 95,
99, 111, 110, 118, 101, 114, 116, 95, 73, 52, 50, 48, 95, 89, 85, 89,
50, 11, 4, 4, 11, 4, 4, 12, 2, 2, 12, 2, 2, 12, 1, 1,
12, 1, 1, 20, 2, 196, 32, 6, 7, 21, 1, 196, 0, 4, 32, 21,
@@ -3395,9 +3395,9 @@ videomixer_video_convert_orc_convert_I420_AYUV (guint8 * ORC_RESTRICT d1,
#if 1
static const orc_uint8 bc[] = {
1, 9, 46, 118, 105, 100, 101, 111, 109, 105, 120, 101, 114, 95, 118,
- 105,
+ 105,
100, 101, 111, 95, 99, 111, 110, 118, 101, 114, 116, 95, 111, 114, 99,
- 95,
+ 95,
99, 111, 110, 118, 101, 114, 116, 95, 73, 52, 50, 48, 95, 65, 89, 85,
86, 11, 4, 4, 11, 4, 4, 12, 1, 1, 12, 1, 1, 12, 1, 1,
12, 1, 1, 14, 1, 255, 0, 0, 0, 20, 2, 20, 2, 20, 1, 20,
@@ -3654,9 +3654,9 @@ videomixer_video_convert_orc_convert_YUY2_I420 (guint8 * ORC_RESTRICT d1,
#if 1
static const orc_uint8 bc[] = {
1, 9, 46, 118, 105, 100, 101, 111, 109, 105, 120, 101, 114, 95, 118,
- 105,
+ 105,
100, 101, 111, 95, 99, 111, 110, 118, 101, 114, 116, 95, 111, 114, 99,
- 95,
+ 95,
99, 111, 110, 118, 101, 114, 116, 95, 89, 85, 89, 50, 95, 73, 52, 50,
48, 11, 2, 2, 11, 2, 2, 11, 1, 1, 11, 1, 1, 12, 4, 4,
12, 4, 4, 20, 2, 20, 2, 20, 2, 21, 1, 199, 32, 34, 4, 97,
@@ -3801,7 +3801,7 @@ videomixer_video_convert_orc_convert_UYVY_YUY2 (guint8 * ORC_RESTRICT d1,
static const orc_uint8 bc[] = {
1, 7, 9, 46, 118, 105, 100, 101, 111, 109, 105, 120, 101, 114, 95, 118,
105, 100, 101, 111, 95, 99, 111, 110, 118, 101, 114, 116, 95, 111, 114,
- 99,
+ 99,
95, 99, 111, 110, 118, 101, 114, 116, 95, 85, 89, 86, 89, 95, 89, 85,
89, 50, 11, 4, 4, 12, 4, 4, 21, 1, 183, 0, 4, 2, 0,
};
@@ -3946,7 +3946,7 @@ videomixer_video_convert_orc_planar_chroma_420_422 (guint8 * ORC_RESTRICT d1,
static const orc_uint8 bc[] = {
1, 7, 9, 50, 118, 105, 100, 101, 111, 109, 105, 120, 101, 114, 95, 118,
105, 100, 101, 111, 95, 99, 111, 110, 118, 101, 114, 116, 95, 111, 114,
- 99,
+ 99,
95, 112, 108, 97, 110, 97, 114, 95, 99, 104, 114, 111, 109, 97, 95, 52,
50, 48, 95, 52, 50, 50, 11, 1, 1, 11, 1, 1, 12, 1, 1, 42,
0, 4, 42, 1, 4, 2, 0,
@@ -4085,7 +4085,7 @@ videomixer_video_convert_orc_planar_chroma_420_444 (guint8 * ORC_RESTRICT d1,
static const orc_uint8 bc[] = {
1, 7, 9, 50, 118, 105, 100, 101, 111, 109, 105, 120, 101, 114, 95, 118,
105, 100, 101, 111, 95, 99, 111, 110, 118, 101, 114, 116, 95, 111, 114,
- 99,
+ 99,
95, 112, 108, 97, 110, 97, 114, 95, 99, 104, 114, 111, 109, 97, 95, 52,
50, 48, 95, 52, 52, 52, 11, 2, 2, 11, 2, 2, 12, 1, 1, 20,
2, 151, 32, 4, 97, 0, 32, 97, 1, 32, 2, 0,
@@ -4217,7 +4217,7 @@ videomixer_video_convert_orc_planar_chroma_422_444 (guint8 * ORC_RESTRICT d1,
static const orc_uint8 bc[] = {
1, 7, 9, 50, 118, 105, 100, 101, 111, 109, 105, 120, 101, 114, 95, 118,
105, 100, 101, 111, 95, 99, 111, 110, 118, 101, 114, 116, 95, 111, 114,
- 99,
+ 99,
95, 112, 108, 97, 110, 97, 114, 95, 99, 104, 114, 111, 109, 97, 95, 52,
50, 50, 95, 52, 52, 52, 11, 2, 2, 12, 1, 1, 20, 2, 151, 32,
4, 97, 0, 32, 2, 0,
@@ -4362,7 +4362,7 @@ videomixer_video_convert_orc_planar_chroma_444_422 (guint8 * ORC_RESTRICT d1,
static const orc_uint8 bc[] = {
1, 7, 9, 50, 118, 105, 100, 101, 111, 109, 105, 120, 101, 114, 95, 118,
105, 100, 101, 111, 95, 99, 111, 110, 118, 101, 114, 116, 95, 111, 114,
- 99,
+ 99,
95, 112, 108, 97, 110, 97, 114, 95, 99, 104, 114, 111, 109, 97, 95, 52,
52, 52, 95, 52, 50, 50, 11, 1, 1, 12, 2, 2, 20, 1, 20, 1,
199, 32, 33, 4, 39, 0, 32, 33, 2, 0,
@@ -4532,7 +4532,7 @@ videomixer_video_convert_orc_planar_chroma_444_420 (guint8 * ORC_RESTRICT d1,
static const orc_uint8 bc[] = {
1, 7, 9, 50, 118, 105, 100, 101, 111, 109, 105, 120, 101, 114, 95, 118,
105, 100, 101, 111, 95, 99, 111, 110, 118, 101, 114, 116, 95, 111, 114,
- 99,
+ 99,
95, 112, 108, 97, 110, 97, 114, 95, 99, 104, 114, 111, 109, 97, 95, 52,
52, 52, 95, 52, 50, 48, 11, 1, 1, 12, 2, 2, 12, 2, 2, 20,
2, 20, 1, 20, 1, 21, 1, 39, 32, 4, 5, 199, 33, 34, 32, 39,
@@ -4679,7 +4679,7 @@ videomixer_video_convert_orc_planar_chroma_422_420 (guint8 * ORC_RESTRICT d1,
static const orc_uint8 bc[] = {
1, 7, 9, 50, 118, 105, 100, 101, 111, 109, 105, 120, 101, 114, 95, 118,
105, 100, 101, 111, 95, 99, 111, 110, 118, 101, 114, 116, 95, 111, 114,
- 99,
+ 99,
95, 112, 108, 97, 110, 97, 114, 95, 99, 104, 114, 111, 109, 97, 95, 52,
50, 50, 95, 52, 50, 48, 11, 1, 1, 12, 1, 1, 12, 1, 1, 39,
0, 4, 5, 2, 0,
@@ -4918,7 +4918,7 @@ videomixer_video_convert_orc_convert_YUY2_AYUV (guint8 * ORC_RESTRICT d1,
static const orc_uint8 bc[] = {
1, 7, 9, 46, 118, 105, 100, 101, 111, 109, 105, 120, 101, 114, 95, 118,
105, 100, 101, 111, 95, 99, 111, 110, 118, 101, 114, 116, 95, 111, 114,
- 99,
+ 99,
95, 99, 111, 110, 118, 101, 114, 116, 95, 89, 85, 89, 50, 95, 65, 89,
85, 86, 11, 8, 8, 12, 4, 4, 14, 2, 255, 0, 0, 0, 20, 2,
20, 2, 20, 4, 20, 4, 21, 1, 199, 33, 32, 4, 21, 1, 196, 34,
@@ -5166,7 +5166,7 @@ videomixer_video_convert_orc_convert_UYVY_AYUV (guint8 * ORC_RESTRICT d1,
static const orc_uint8 bc[] = {
1, 7, 9, 46, 118, 105, 100, 101, 111, 109, 105, 120, 101, 114, 95, 118,
105, 100, 101, 111, 95, 99, 111, 110, 118, 101, 114, 116, 95, 111, 114,
- 99,
+ 99,
95, 99, 111, 110, 118, 101, 114, 116, 95, 85, 89, 86, 89, 95, 65, 89,
85, 86, 11, 8, 8, 12, 4, 4, 14, 2, 255, 0, 0, 0, 20, 2,
20, 2, 20, 4, 20, 4, 21, 1, 199, 32, 33, 4, 21, 1, 196, 34,
@@ -5364,7 +5364,7 @@ videomixer_video_convert_orc_convert_YUY2_Y42B (guint8 * ORC_RESTRICT d1,
static const orc_uint8 bc[] = {
1, 7, 9, 46, 118, 105, 100, 101, 111, 109, 105, 120, 101, 114, 95, 118,
105, 100, 101, 111, 95, 99, 111, 110, 118, 101, 114, 116, 95, 111, 114,
- 99,
+ 99,
95, 99, 111, 110, 118, 101, 114, 116, 95, 89, 85, 89, 50, 95, 89, 52,
50, 66, 11, 2, 2, 11, 1, 1, 11, 1, 1, 12, 4, 4, 20, 2,
21, 1, 199, 32, 0, 4, 199, 2, 1, 32, 2, 0,
@@ -5559,7 +5559,7 @@ videomixer_video_convert_orc_convert_UYVY_Y42B (guint8 * ORC_RESTRICT d1,
static const orc_uint8 bc[] = {
1, 7, 9, 46, 118, 105, 100, 101, 111, 109, 105, 120, 101, 114, 95, 118,
105, 100, 101, 111, 95, 99, 111, 110, 118, 101, 114, 116, 95, 111, 114,
- 99,
+ 99,
95, 99, 111, 110, 118, 101, 114, 116, 95, 85, 89, 86, 89, 95, 89, 52,
50, 66, 11, 2, 2, 11, 1, 1, 11, 1, 1, 12, 4, 4, 20, 2,
21, 1, 199, 0, 32, 4, 199, 2, 1, 32, 2, 0,
@@ -5766,7 +5766,7 @@ videomixer_video_convert_orc_convert_YUY2_Y444 (guint8 * ORC_RESTRICT d1,
static const orc_uint8 bc[] = {
1, 7, 9, 46, 118, 105, 100, 101, 111, 109, 105, 120, 101, 114, 95, 118,
105, 100, 101, 111, 95, 99, 111, 110, 118, 101, 114, 116, 95, 111, 114,
- 99,
+ 99,
95, 99, 111, 110, 118, 101, 114, 116, 95, 89, 85, 89, 50, 95, 89, 52,
52, 52, 11, 2, 2, 11, 2, 2, 11, 2, 2, 12, 4, 4, 20, 2,
20, 1, 20, 1, 21, 1, 199, 32, 0, 4, 199, 34, 33, 32, 151, 1,
@@ -5980,7 +5980,7 @@ videomixer_video_convert_orc_convert_UYVY_Y444 (guint8 * ORC_RESTRICT d1,
static const orc_uint8 bc[] = {
1, 7, 9, 46, 118, 105, 100, 101, 111, 109, 105, 120, 101, 114, 95, 118,
105, 100, 101, 111, 95, 99, 111, 110, 118, 101, 114, 116, 95, 111, 114,
- 99,
+ 99,
95, 99, 111, 110, 118, 101, 114, 116, 95, 85, 89, 86, 89, 95, 89, 52,
52, 52, 11, 2, 2, 11, 2, 2, 11, 2, 2, 12, 4, 4, 20, 2,
20, 1, 20, 1, 21, 1, 199, 0, 32, 4, 199, 34, 33, 32, 151, 1,
@@ -6230,9 +6230,9 @@ videomixer_video_convert_orc_convert_UYVY_I420 (guint8 * ORC_RESTRICT d1,
#if 1
static const orc_uint8 bc[] = {
1, 9, 46, 118, 105, 100, 101, 111, 109, 105, 120, 101, 114, 95, 118,
- 105,
+ 105,
100, 101, 111, 95, 99, 111, 110, 118, 101, 114, 116, 95, 111, 114, 99,
- 95,
+ 95,
99, 111, 110, 118, 101, 114, 116, 95, 85, 89, 86, 89, 95, 73, 52, 50,
48, 11, 2, 2, 11, 2, 2, 11, 1, 1, 11, 1, 1, 12, 4, 4,
12, 4, 4, 20, 2, 20, 2, 20, 2, 21, 1, 199, 34, 32, 4, 97,
@@ -6615,7 +6615,7 @@ videomixer_video_convert_orc_convert_AYUV_I420 (guint8 * ORC_RESTRICT d1,
static const orc_uint8 bc[] = {
1, 7, 9, 46, 118, 105, 100, 101, 111, 109, 105, 120, 101, 114, 95, 118,
105, 100, 101, 111, 95, 99, 111, 110, 118, 101, 114, 116, 95, 111, 114,
- 99,
+ 99,
95, 99, 111, 110, 118, 101, 114, 116, 95, 65, 89, 85, 86, 95, 73, 52,
50, 48, 11, 2, 2, 11, 2, 2, 11, 1, 1, 11, 1, 1, 12, 8,
8, 12, 8, 8, 20, 4, 20, 4, 20, 4, 20, 4, 20, 2, 20, 2,
@@ -6887,7 +6887,7 @@ videomixer_video_convert_orc_convert_AYUV_YUY2 (guint8 * ORC_RESTRICT d1,
static const orc_uint8 bc[] = {
1, 7, 9, 46, 118, 105, 100, 101, 111, 109, 105, 120, 101, 114, 95, 118,
105, 100, 101, 111, 95, 99, 111, 110, 118, 101, 114, 116, 95, 111, 114,
- 99,
+ 99,
95, 99, 111, 110, 118, 101, 114, 116, 95, 65, 89, 85, 86, 95, 89, 85,
89, 50, 11, 4, 4, 12, 8, 8, 20, 2, 20, 2, 20, 2, 20, 4,
20, 4, 21, 1, 198, 36, 35, 4, 198, 33, 34, 36, 21, 1, 39, 33,
@@ -7131,7 +7131,7 @@ videomixer_video_convert_orc_convert_AYUV_UYVY (guint8 * ORC_RESTRICT d1,
static const orc_uint8 bc[] = {
1, 7, 9, 46, 118, 105, 100, 101, 111, 109, 105, 120, 101, 114, 95, 118,
105, 100, 101, 111, 95, 99, 111, 110, 118, 101, 114, 116, 95, 111, 114,
- 99,
+ 99,
95, 99, 111, 110, 118, 101, 114, 116, 95, 65, 89, 85, 86, 95, 85, 89,
86, 89, 11, 4, 4, 12, 8, 8, 20, 2, 20, 2, 20, 2, 20, 4,
20, 4, 21, 1, 198, 36, 35, 4, 198, 33, 34, 36, 21, 1, 39, 33,
@@ -7385,7 +7385,7 @@ videomixer_video_convert_orc_convert_AYUV_Y42B (guint8 * ORC_RESTRICT d1,
static const orc_uint8 bc[] = {
1, 7, 9, 46, 118, 105, 100, 101, 111, 109, 105, 120, 101, 114, 95, 118,
105, 100, 101, 111, 95, 99, 111, 110, 118, 101, 114, 116, 95, 111, 114,
- 99,
+ 99,
95, 99, 111, 110, 118, 101, 114, 116, 95, 65, 89, 85, 86, 95, 89, 52,
50, 66, 11, 2, 2, 11, 1, 1, 11, 1, 1, 12, 8, 8, 20, 4,
20, 4, 20, 2, 20, 2, 21, 1, 198, 33, 32, 4, 198, 34, 35, 33,
@@ -7593,7 +7593,7 @@ videomixer_video_convert_orc_convert_AYUV_Y444 (guint8 * ORC_RESTRICT d1,
static const orc_uint8 bc[] = {
1, 7, 9, 46, 118, 105, 100, 101, 111, 109, 105, 120, 101, 114, 95, 118,
105, 100, 101, 111, 95, 99, 111, 110, 118, 101, 114, 116, 95, 111, 114,
- 99,
+ 99,
95, 99, 111, 110, 118, 101, 114, 116, 95, 65, 89, 85, 86, 95, 89, 52,
52, 52, 11, 1, 1, 11, 1, 1, 11, 1, 1, 12, 4, 4, 20, 2,
20, 2, 198, 33, 32, 4, 199, 2, 1, 33, 189, 0, 32, 2, 0,
@@ -7791,7 +7791,7 @@ videomixer_video_convert_orc_convert_Y42B_YUY2 (guint8 * ORC_RESTRICT d1,
static const orc_uint8 bc[] = {
1, 7, 9, 46, 118, 105, 100, 101, 111, 109, 105, 120, 101, 114, 95, 118,
105, 100, 101, 111, 95, 99, 111, 110, 118, 101, 114, 116, 95, 111, 114,
- 99,
+ 99,
95, 99, 111, 110, 118, 101, 114, 116, 95, 89, 52, 50, 66, 95, 89, 85,
89, 50, 11, 4, 4, 12, 2, 2, 12, 1, 1, 12, 1, 1, 20, 2,
196, 32, 5, 6, 21, 1, 196, 0, 4, 32, 2, 0,
@@ -7986,7 +7986,7 @@ videomixer_video_convert_orc_convert_Y42B_UYVY (guint8 * ORC_RESTRICT d1,
static const orc_uint8 bc[] = {
1, 7, 9, 46, 118, 105, 100, 101, 111, 109, 105, 120, 101, 114, 95, 118,
105, 100, 101, 111, 95, 99, 111, 110, 118, 101, 114, 116, 95, 111, 114,
- 99,
+ 99,
95, 99, 111, 110, 118, 101, 114, 116, 95, 89, 52, 50, 66, 95, 85, 89,
86, 89, 11, 4, 4, 12, 2, 2, 12, 1, 1, 12, 1, 1, 20, 2,
196, 32, 5, 6, 21, 1, 196, 0, 32, 4, 2, 0,
@@ -8241,7 +8241,7 @@ videomixer_video_convert_orc_convert_Y42B_AYUV (guint8 * ORC_RESTRICT d1,
static const orc_uint8 bc[] = {
1, 7, 9, 46, 118, 105, 100, 101, 111, 109, 105, 120, 101, 114, 95, 118,
105, 100, 101, 111, 95, 99, 111, 110, 118, 101, 114, 116, 95, 111, 114,
- 99,
+ 99,
95, 99, 111, 110, 118, 101, 114, 116, 95, 89, 52, 50, 66, 95, 65, 89,
85, 86, 11, 8, 8, 12, 2, 2, 12, 1, 1, 12, 1, 1, 14, 1,
255, 0, 0, 0, 20, 2, 20, 2, 20, 4, 20, 4, 196, 32, 5, 6,
@@ -8488,7 +8488,7 @@ videomixer_video_convert_orc_convert_Y444_YUY2 (guint8 * ORC_RESTRICT d1,
static const orc_uint8 bc[] = {
1, 7, 9, 46, 118, 105, 100, 101, 111, 109, 105, 120, 101, 114, 95, 118,
105, 100, 101, 111, 95, 99, 111, 110, 118, 101, 114, 116, 95, 111, 114,
- 99,
+ 99,
95, 99, 111, 110, 118, 101, 114, 116, 95, 89, 52, 52, 52, 95, 89, 85,
89, 50, 11, 4, 4, 12, 2, 2, 12, 2, 2, 12, 2, 2, 20, 2,
20, 4, 20, 2, 20, 2, 21, 1, 196, 33, 5, 6, 198, 34, 35, 33,
@@ -8733,7 +8733,7 @@ videomixer_video_convert_orc_convert_Y444_UYVY (guint8 * ORC_RESTRICT d1,
static const orc_uint8 bc[] = {
1, 7, 9, 46, 118, 105, 100, 101, 111, 109, 105, 120, 101, 114, 95, 118,
105, 100, 101, 111, 95, 99, 111, 110, 118, 101, 114, 116, 95, 111, 114,
- 99,
+ 99,
95, 99, 111, 110, 118, 101, 114, 116, 95, 89, 52, 52, 52, 95, 85, 89,
86, 89, 11, 4, 4, 12, 2, 2, 12, 2, 2, 12, 2, 2, 20, 2,
20, 4, 20, 2, 20, 2, 21, 1, 196, 33, 5, 6, 198, 34, 35, 33,
@@ -8954,7 +8954,7 @@ videomixer_video_convert_orc_convert_Y444_AYUV (guint8 * ORC_RESTRICT d1,
static const orc_uint8 bc[] = {
1, 7, 9, 46, 118, 105, 100, 101, 111, 109, 105, 120, 101, 114, 95, 118,
105, 100, 101, 111, 95, 99, 111, 110, 118, 101, 114, 116, 95, 111, 114,
- 99,
+ 99,
95, 99, 111, 110, 118, 101, 114, 116, 95, 89, 52, 52, 52, 95, 65, 89,
85, 86, 11, 4, 4, 12, 1, 1, 12, 1, 1, 12, 1, 1, 14, 1,
255, 0, 0, 0, 20, 2, 20, 2, 196, 32, 5, 6, 196, 33, 16, 4,
@@ -9478,7 +9478,7 @@ videomixer_video_convert_orc_convert_AYUV_ARGB (guint8 * ORC_RESTRICT d1,
static const orc_uint8 bc[] = {
1, 7, 9, 46, 118, 105, 100, 101, 111, 109, 105, 120, 101, 114, 95, 118,
105, 100, 101, 111, 95, 99, 111, 110, 118, 101, 114, 116, 95, 111, 114,
- 99,
+ 99,
95, 99, 111, 110, 118, 101, 114, 116, 95, 65, 89, 85, 86, 95, 65, 82,
71, 66, 11, 4, 4, 12, 4, 4, 14, 1, 8, 0, 0, 0, 14, 4,
128, 0, 0, 0, 14, 4, 42, 0, 0, 0, 14, 4, 103, 0, 0, 0,
@@ -10089,7 +10089,7 @@ videomixer_video_convert_orc_convert_AYUV_BGRA (guint8 * ORC_RESTRICT d1,
static const orc_uint8 bc[] = {
1, 7, 9, 46, 118, 105, 100, 101, 111, 109, 105, 120, 101, 114, 95, 118,
105, 100, 101, 111, 95, 99, 111, 110, 118, 101, 114, 116, 95, 111, 114,
- 99,
+ 99,
95, 99, 111, 110, 118, 101, 114, 116, 95, 65, 89, 85, 86, 95, 66, 71,
82, 65, 11, 4, 4, 12, 4, 4, 14, 1, 8, 0, 0, 0, 14, 4,
128, 0, 0, 0, 14, 4, 42, 0, 0, 0, 14, 4, 103, 0, 0, 0,
@@ -10700,7 +10700,7 @@ videomixer_video_convert_orc_convert_AYUV_ABGR (guint8 * ORC_RESTRICT d1,
static const orc_uint8 bc[] = {
1, 7, 9, 46, 118, 105, 100, 101, 111, 109, 105, 120, 101, 114, 95, 118,
105, 100, 101, 111, 95, 99, 111, 110, 118, 101, 114, 116, 95, 111, 114,
- 99,
+ 99,
95, 99, 111, 110, 118, 101, 114, 116, 95, 65, 89, 85, 86, 95, 65, 66,
71, 82, 11, 4, 4, 12, 4, 4, 14, 1, 8, 0, 0, 0, 14, 4,
128, 0, 0, 0, 14, 4, 42, 0, 0, 0, 14, 4, 103, 0, 0, 0,
@@ -11311,7 +11311,7 @@ videomixer_video_convert_orc_convert_AYUV_RGBA (guint8 * ORC_RESTRICT d1,
static const orc_uint8 bc[] = {
1, 7, 9, 46, 118, 105, 100, 101, 111, 109, 105, 120, 101, 114, 95, 118,
105, 100, 101, 111, 95, 99, 111, 110, 118, 101, 114, 116, 95, 111, 114,
- 99,
+ 99,
95, 99, 111, 110, 118, 101, 114, 116, 95, 65, 89, 85, 86, 95, 82, 71,
66, 65, 11, 4, 4, 12, 4, 4, 14, 1, 8, 0, 0, 0, 14, 4,
128, 0, 0, 0, 14, 4, 42, 0, 0, 0, 14, 4, 103, 0, 0, 0,
@@ -11932,9 +11932,9 @@ videomixer_video_convert_orc_convert_I420_BGRA (guint8 * ORC_RESTRICT d1,
#if 1
static const orc_uint8 bc[] = {
1, 9, 46, 118, 105, 100, 101, 111, 109, 105, 120, 101, 114, 95, 118,
- 105,
+ 105,
100, 101, 111, 95, 99, 111, 110, 118, 101, 114, 116, 95, 111, 114, 99,
- 95,
+ 95,
99, 111, 110, 118, 101, 114, 116, 95, 73, 52, 50, 48, 95, 66, 71, 82,
65, 11, 4, 4, 12, 1, 1, 12, 1, 1, 12, 1, 1, 14, 1, 8,
0, 0, 0, 14, 1, 128, 0, 0, 0, 14, 4, 42, 0, 0, 0, 14,
@@ -12597,9 +12597,9 @@ videomixer_video_convert_orc_convert_I420_BGRA_avg (guint8 * ORC_RESTRICT d1,
#if 1
static const orc_uint8 bc[] = {
1, 9, 50, 118, 105, 100, 101, 111, 109, 105, 120, 101, 114, 95, 118,
- 105,
+ 105,
100, 101, 111, 95, 99, 111, 110, 118, 101, 114, 116, 95, 111, 114, 99,
- 95,
+ 95,
99, 111, 110, 118, 101, 114, 116, 95, 73, 52, 50, 48, 95, 66, 71, 82,
65, 95, 97, 118, 103, 11, 4, 4, 12, 1, 1, 12, 1, 1, 12, 1,
1, 12, 1, 1, 12, 1, 1, 14, 1, 8, 0, 0, 0, 14, 1, 128,
@@ -12909,9 +12909,9 @@ videomixer_video_convert_orc_getline_I420 (guint8 * ORC_RESTRICT d1,
#if 1
static const orc_uint8 bc[] = {
1, 9, 41, 118, 105, 100, 101, 111, 109, 105, 120, 101, 114, 95, 118,
- 105,
+ 105,
100, 101, 111, 95, 99, 111, 110, 118, 101, 114, 116, 95, 111, 114, 99,
- 95,
+ 95,
103, 101, 116, 108, 105, 110, 101, 95, 73, 52, 50, 48, 11, 4, 4, 12,
1, 1, 12, 1, 1, 12, 1, 1, 14, 1, 255, 0, 0, 0, 20, 2,
20, 2, 20, 1, 20, 1, 45, 34, 5, 45, 35, 6, 196, 32, 34, 35,
@@ -13160,9 +13160,9 @@ videomixer_video_convert_orc_getline_YUV9 (guint8 * ORC_RESTRICT d1,
#if 1
static const orc_uint8 bc[] = {
1, 9, 41, 118, 105, 100, 101, 111, 109, 105, 120, 101, 114, 95, 118,
- 105,
+ 105,
100, 101, 111, 95, 99, 111, 110, 118, 101, 114, 116, 95, 111, 114, 99,
- 95,
+ 95,
103, 101, 116, 108, 105, 110, 101, 95, 89, 85, 86, 57, 11, 8, 8, 12,
2, 2, 12, 1, 1, 12, 1, 1, 14, 1, 255, 0, 0, 0, 20, 2,
20, 4, 20, 4, 20, 1, 20, 1, 45, 35, 5, 45, 36, 6, 196, 32,
@@ -13407,9 +13407,9 @@ videomixer_video_convert_orc_getline_YUY2 (guint8 * ORC_RESTRICT d1,
#if 1
static const orc_uint8 bc[] = {
1, 9, 41, 118, 105, 100, 101, 111, 109, 105, 120, 101, 114, 95, 118,
- 105,
+ 105,
100, 101, 111, 95, 99, 111, 110, 118, 101, 114, 116, 95, 111, 114, 99,
- 95,
+ 95,
103, 101, 116, 108, 105, 110, 101, 95, 89, 85, 89, 50, 11, 8, 8, 12,
4, 4, 14, 2, 255, 0, 0, 0, 20, 2, 20, 2, 20, 4, 20, 4,
21, 1, 199, 33, 32, 4, 21, 1, 196, 34, 16, 32, 195, 35, 33, 33,
@@ -13644,9 +13644,9 @@ videomixer_video_convert_orc_getline_UYVY (guint8 * ORC_RESTRICT d1,
#if 1
static const orc_uint8 bc[] = {
1, 9, 41, 118, 105, 100, 101, 111, 109, 105, 120, 101, 114, 95, 118,
- 105,
+ 105,
100, 101, 111, 95, 99, 111, 110, 118, 101, 114, 116, 95, 111, 114, 99,
- 95,
+ 95,
103, 101, 116, 108, 105, 110, 101, 95, 85, 89, 86, 89, 11, 8, 8, 12,
4, 4, 14, 2, 255, 0, 0, 0, 20, 2, 20, 2, 20, 4, 20, 4,
21, 1, 199, 32, 33, 4, 21, 1, 196, 34, 16, 32, 195, 35, 33, 33,
@@ -13887,9 +13887,9 @@ videomixer_video_convert_orc_getline_YVYU (guint8 * ORC_RESTRICT d1,
#if 1
static const orc_uint8 bc[] = {
1, 9, 41, 118, 105, 100, 101, 111, 109, 105, 120, 101, 114, 95, 118,
- 105,
+ 105,
100, 101, 111, 95, 99, 111, 110, 118, 101, 114, 116, 95, 111, 114, 99,
- 95,
+ 95,
103, 101, 116, 108, 105, 110, 101, 95, 89, 86, 89, 85, 11, 8, 8, 12,
4, 4, 14, 2, 255, 0, 0, 0, 20, 2, 20, 2, 20, 4, 20, 4,
21, 1, 199, 33, 32, 4, 183, 33, 33, 21, 1, 196, 34, 16, 32, 195,
@@ -14134,9 +14134,9 @@ videomixer_video_convert_orc_getline_Y42B (guint8 * ORC_RESTRICT d1,
#if 1
static const orc_uint8 bc[] = {
1, 9, 41, 118, 105, 100, 101, 111, 109, 105, 120, 101, 114, 95, 118,
- 105,
+ 105,
100, 101, 111, 95, 99, 111, 110, 118, 101, 114, 116, 95, 111, 114, 99,
- 95,
+ 95,
103, 101, 116, 108, 105, 110, 101, 95, 89, 52, 50, 66, 11, 8, 8, 12,
2, 2, 12, 1, 1, 12, 1, 1, 14, 1, 255, 0, 0, 0, 20, 2,
20, 2, 20, 4, 20, 4, 196, 32, 5, 6, 21, 1, 196, 35, 16, 4,
@@ -14341,9 +14341,9 @@ videomixer_video_convert_orc_getline_Y444 (guint8 * ORC_RESTRICT d1,
#if 1
static const orc_uint8 bc[] = {
1, 9, 41, 118, 105, 100, 101, 111, 109, 105, 120, 101, 114, 95, 118,
- 105,
+ 105,
100, 101, 111, 95, 99, 111, 110, 118, 101, 114, 116, 95, 111, 114, 99,
- 95,
+ 95,
103, 101, 116, 108, 105, 110, 101, 95, 89, 52, 52, 52, 11, 4, 4, 12,
1, 1, 12, 1, 1, 12, 1, 1, 14, 1, 255, 0, 0, 0, 20, 2,
20, 2, 196, 32, 5, 6, 196, 33, 16, 4, 195, 0, 33, 32, 2, 0,
@@ -14520,9 +14520,9 @@ videomixer_video_convert_orc_getline_Y800 (guint8 * ORC_RESTRICT d1,
#if 1
static const orc_uint8 bc[] = {
1, 9, 41, 118, 105, 100, 101, 111, 109, 105, 120, 101, 114, 95, 118,
- 105,
+ 105,
100, 101, 111, 95, 99, 111, 110, 118, 101, 114, 116, 95, 111, 114, 99,
- 95,
+ 95,
103, 101, 116, 108, 105, 110, 101, 95, 89, 56, 48, 48, 11, 4, 4, 12,
1, 1, 14, 1, 255, 0, 0, 0, 14, 2, 128, 128, 0, 0, 20, 2,
196, 32, 16, 4, 195, 0, 32, 17, 2, 0,
@@ -14697,9 +14697,9 @@ videomixer_video_convert_orc_getline_Y16 (guint8 * ORC_RESTRICT d1,
#if 1
static const orc_uint8 bc[] = {
1, 9, 40, 118, 105, 100, 101, 111, 109, 105, 120, 101, 114, 95, 118,
- 105,
+ 105,
100, 101, 111, 95, 99, 111, 110, 118, 101, 114, 116, 95, 111, 114, 99,
- 95,
+ 95,
103, 101, 116, 108, 105, 110, 101, 95, 89, 49, 54, 11, 4, 4, 12, 2,
2, 14, 1, 255, 0, 0, 0, 14, 2, 128, 128, 0, 0, 20, 2, 20,
1, 158, 33, 4, 196, 32, 16, 33, 195, 0, 32, 17, 2, 0,
@@ -14818,9 +14818,9 @@ videomixer_video_convert_orc_getline_BGRA (guint8 * ORC_RESTRICT d1,
#if 1
static const orc_uint8 bc[] = {
1, 9, 41, 118, 105, 100, 101, 111, 109, 105, 120, 101, 114, 95, 118,
- 105,
+ 105,
100, 101, 111, 95, 99, 111, 110, 118, 101, 114, 116, 95, 111, 114, 99,
- 95,
+ 95,
103, 101, 116, 108, 105, 110, 101, 95, 66, 71, 82, 65, 11, 4, 4, 12,
4, 4, 184, 0, 4, 2, 0,
};
@@ -15026,9 +15026,9 @@ videomixer_video_convert_orc_getline_ABGR (guint8 * ORC_RESTRICT d1,
#if 1
static const orc_uint8 bc[] = {
1, 9, 41, 118, 105, 100, 101, 111, 109, 105, 120, 101, 114, 95, 118,
- 105,
+ 105,
100, 101, 111, 95, 99, 111, 110, 118, 101, 114, 116, 95, 111, 114, 99,
- 95,
+ 95,
103, 101, 116, 108, 105, 110, 101, 95, 65, 66, 71, 82, 11, 4, 4, 12,
4, 4, 20, 1, 20, 1, 20, 1, 20, 1, 20, 2, 20, 2, 20, 2,
20, 2, 198, 36, 37, 4, 199, 33, 34, 36, 199, 35, 32, 37, 196, 38,
@@ -15254,9 +15254,9 @@ videomixer_video_convert_orc_getline_RGBA (guint8 * ORC_RESTRICT d1,
#if 1
static const orc_uint8 bc[] = {
1, 9, 41, 118, 105, 100, 101, 111, 109, 105, 120, 101, 114, 95, 118,
- 105,
+ 105,
100, 101, 111, 95, 99, 111, 110, 118, 101, 114, 116, 95, 111, 114, 99,
- 95,
+ 95,
103, 101, 116, 108, 105, 110, 101, 95, 82, 71, 66, 65, 11, 4, 4, 12,
4, 4, 20, 1, 20, 1, 20, 1, 20, 1, 20, 2, 20, 2, 20, 2,
20, 2, 198, 37, 36, 4, 199, 34, 33, 36, 199, 32, 35, 37, 196, 38,
@@ -15484,9 +15484,9 @@ videomixer_video_convert_orc_getline_NV12 (guint8 * ORC_RESTRICT d1,
#if 1
static const orc_uint8 bc[] = {
1, 9, 41, 118, 105, 100, 101, 111, 109, 105, 120, 101, 114, 95, 118,
- 105,
+ 105,
100, 101, 111, 95, 99, 111, 110, 118, 101, 114, 116, 95, 111, 114, 99,
- 95,
+ 95,
103, 101, 116, 108, 105, 110, 101, 95, 78, 86, 49, 50, 11, 8, 8, 12,
2, 2, 12, 2, 2, 14, 1, 255, 0, 0, 0, 20, 4, 20, 4, 195,
33, 5, 5, 21, 1, 196, 32, 16, 4, 21, 1, 195, 0, 32, 33, 2,
@@ -15705,9 +15705,9 @@ videomixer_video_convert_orc_getline_NV21 (guint8 * ORC_RESTRICT d1,
#if 1
static const orc_uint8 bc[] = {
1, 9, 41, 118, 105, 100, 101, 111, 109, 105, 120, 101, 114, 95, 118,
- 105,
+ 105,
100, 101, 111, 95, 99, 111, 110, 118, 101, 114, 116, 95, 111, 114, 99,
- 95,
+ 95,
103, 101, 116, 108, 105, 110, 101, 95, 78, 86, 50, 49, 11, 8, 8, 12,
2, 2, 12, 2, 2, 14, 1, 255, 0, 0, 0, 20, 2, 20, 4, 20,
4, 183, 32, 5, 195, 34, 32, 32, 21, 1, 196, 33, 16, 4, 21, 1,
@@ -15905,9 +15905,9 @@ videomixer_video_convert_orc_getline_A420 (guint8 * ORC_RESTRICT d1,
#if 1
static const orc_uint8 bc[] = {
1, 9, 41, 118, 105, 100, 101, 111, 109, 105, 120, 101, 114, 95, 118,
- 105,
+ 105,
100, 101, 111, 95, 99, 111, 110, 118, 101, 114, 116, 95, 111, 114, 99,
- 95,
+ 95,
103, 101, 116, 108, 105, 110, 101, 95, 65, 52, 50, 48, 11, 4, 4, 12,
1, 1, 12, 1, 1, 12, 1, 1, 12, 1, 1, 20, 2, 20, 2, 20,
1, 20, 1, 45, 34, 5, 45, 35, 6, 196, 32, 34, 35, 196, 33, 7,
@@ -16181,9 +16181,9 @@ videomixer_video_convert_orc_putline_I420 (guint8 * ORC_RESTRICT d1,
#if 1
static const orc_uint8 bc[] = {
1, 9, 41, 118, 105, 100, 101, 111, 109, 105, 120, 101, 114, 95, 118,
- 105,
+ 105,
100, 101, 111, 95, 99, 111, 110, 118, 101, 114, 116, 95, 111, 114, 99,
- 95,
+ 95,
112, 117, 116, 108, 105, 110, 101, 95, 73, 52, 50, 48, 11, 2, 2, 11,
1, 1, 11, 1, 1, 12, 8, 8, 20, 4, 20, 4, 20, 2, 20, 2,
20, 1, 20, 1, 21, 1, 198, 33, 32, 4, 21, 1, 189, 0, 32, 21,
@@ -16420,9 +16420,9 @@ videomixer_video_convert_orc_putline_YUY2 (guint8 * ORC_RESTRICT d1,
#if 1
static const orc_uint8 bc[] = {
1, 9, 41, 118, 105, 100, 101, 111, 109, 105, 120, 101, 114, 95, 118,
- 105,
+ 105,
100, 101, 111, 95, 99, 111, 110, 118, 101, 114, 116, 95, 111, 114, 99,
- 95,
+ 95,
112, 117, 116, 108, 105, 110, 101, 95, 89, 85, 89, 50, 11, 4, 4, 12,
8, 8, 20, 2, 20, 2, 20, 2, 20, 4, 20, 4, 21, 1, 198, 36,
35, 4, 198, 33, 34, 36, 21, 1, 39, 33, 33, 34, 21, 1, 189, 32,
@@ -16655,9 +16655,9 @@ videomixer_video_convert_orc_putline_YVYU (guint8 * ORC_RESTRICT d1,
#if 1
static const orc_uint8 bc[] = {
1, 9, 41, 118, 105, 100, 101, 111, 109, 105, 120, 101, 114, 95, 118,
- 105,
+ 105,
100, 101, 111, 95, 99, 111, 110, 118, 101, 114, 116, 95, 111, 114, 99,
- 95,
+ 95,
112, 117, 116, 108, 105, 110, 101, 95, 89, 86, 89, 85, 11, 4, 4, 12,
8, 8, 20, 2, 20, 2, 20, 2, 20, 4, 20, 4, 21, 1, 198, 36,
35, 4, 198, 33, 34, 36, 21, 1, 39, 33, 33, 34, 21, 1, 189, 32,
@@ -16886,9 +16886,9 @@ videomixer_video_convert_orc_putline_UYVY (guint8 * ORC_RESTRICT d1,
#if 1
static const orc_uint8 bc[] = {
1, 9, 41, 118, 105, 100, 101, 111, 109, 105, 120, 101, 114, 95, 118,
- 105,
+ 105,
100, 101, 111, 95, 99, 111, 110, 118, 101, 114, 116, 95, 111, 114, 99,
- 95,
+ 95,
112, 117, 116, 108, 105, 110, 101, 95, 85, 89, 86, 89, 11, 4, 4, 12,
8, 8, 20, 2, 20, 2, 20, 2, 20, 4, 20, 4, 21, 1, 198, 36,
35, 4, 198, 33, 34, 36, 21, 1, 39, 33, 33, 34, 21, 1, 189, 32,
@@ -17123,9 +17123,9 @@ videomixer_video_convert_orc_putline_Y42B (guint8 * ORC_RESTRICT d1,
#if 1
static const orc_uint8 bc[] = {
1, 9, 41, 118, 105, 100, 101, 111, 109, 105, 120, 101, 114, 95, 118,
- 105,
+ 105,
100, 101, 111, 95, 99, 111, 110, 118, 101, 114, 116, 95, 111, 114, 99,
- 95,
+ 95,
112, 117, 116, 108, 105, 110, 101, 95, 89, 52, 50, 66, 11, 2, 2, 11,
1, 1, 11, 1, 1, 12, 8, 8, 20, 4, 20, 4, 20, 2, 20, 2,
21, 1, 198, 33, 32, 4, 198, 34, 35, 33, 21, 1, 39, 34, 34, 35,
@@ -17315,9 +17315,9 @@ videomixer_video_convert_orc_putline_Y444 (guint8 * ORC_RESTRICT d1,
#if 1
static const orc_uint8 bc[] = {
1, 9, 41, 118, 105, 100, 101, 111, 109, 105, 120, 101, 114, 95, 118,
- 105,
+ 105,
100, 101, 111, 95, 99, 111, 110, 118, 101, 114, 116, 95, 111, 114, 99,
- 95,
+ 95,
112, 117, 116, 108, 105, 110, 101, 95, 89, 52, 52, 52, 11, 1, 1, 11,
1, 1, 11, 1, 1, 12, 4, 4, 20, 2, 20, 2, 198, 33, 32, 4,
199, 2, 1, 33, 189, 0, 32, 2, 0,
@@ -17460,9 +17460,9 @@ videomixer_video_convert_orc_putline_Y800 (guint8 * ORC_RESTRICT d1,
#if 1
static const orc_uint8 bc[] = {
1, 9, 41, 118, 105, 100, 101, 111, 109, 105, 120, 101, 114, 95, 118,
- 105,
+ 105,
100, 101, 111, 95, 99, 111, 110, 118, 101, 114, 116, 95, 111, 114, 99,
- 95,
+ 95,
112, 117, 116, 108, 105, 110, 101, 95, 89, 56, 48, 48, 11, 1, 1, 12,
4, 4, 20, 2, 190, 32, 4, 189, 0, 32, 2, 0,
};
@@ -17608,9 +17608,9 @@ videomixer_video_convert_orc_putline_Y16 (guint8 * ORC_RESTRICT d1,
#if 1
static const orc_uint8 bc[] = {
1, 9, 40, 118, 105, 100, 101, 111, 109, 105, 120, 101, 114, 95, 118,
- 105,
+ 105,
100, 101, 111, 95, 99, 111, 110, 118, 101, 114, 116, 95, 111, 114, 99,
- 95,
+ 95,
112, 117, 116, 108, 105, 110, 101, 95, 89, 49, 54, 11, 2, 2, 12, 4,
4, 14, 4, 8, 0, 0, 0, 20, 2, 20, 1, 190, 32, 4, 189, 33,
32, 150, 32, 33, 93, 0, 32, 16, 2, 0,
@@ -17730,9 +17730,9 @@ videomixer_video_convert_orc_putline_BGRA (guint8 * ORC_RESTRICT d1,
#if 1
static const orc_uint8 bc[] = {
1, 9, 41, 118, 105, 100, 101, 111, 109, 105, 120, 101, 114, 95, 118,
- 105,
+ 105,
100, 101, 111, 95, 99, 111, 110, 118, 101, 114, 116, 95, 111, 114, 99,
- 95,
+ 95,
112, 117, 116, 108, 105, 110, 101, 95, 66, 71, 82, 65, 11, 4, 4, 12,
4, 4, 184, 0, 4, 2, 0,
};
@@ -17938,9 +17938,9 @@ videomixer_video_convert_orc_putline_ABGR (guint8 * ORC_RESTRICT d1,
#if 1
static const orc_uint8 bc[] = {
1, 9, 41, 118, 105, 100, 101, 111, 109, 105, 120, 101, 114, 95, 118,
- 105,
+ 105,
100, 101, 111, 95, 99, 111, 110, 118, 101, 114, 116, 95, 111, 114, 99,
- 95,
+ 95,
112, 117, 116, 108, 105, 110, 101, 95, 65, 66, 71, 82, 11, 4, 4, 12,
4, 4, 20, 1, 20, 1, 20, 1, 20, 1, 20, 2, 20, 2, 20, 2,
20, 2, 198, 39, 38, 4, 199, 35, 34, 39, 199, 33, 32, 38, 196, 37,
@@ -18166,9 +18166,9 @@ videomixer_video_convert_orc_putline_RGBA (guint8 * ORC_RESTRICT d1,
#if 1
static const orc_uint8 bc[] = {
1, 9, 41, 118, 105, 100, 101, 111, 109, 105, 120, 101, 114, 95, 118,
- 105,
+ 105,
100, 101, 111, 95, 99, 111, 110, 118, 101, 114, 116, 95, 111, 114, 99,
- 95,
+ 95,
112, 117, 116, 108, 105, 110, 101, 95, 82, 71, 66, 65, 11, 4, 4, 12,
4, 4, 20, 1, 20, 1, 20, 1, 20, 1, 20, 2, 20, 2, 20, 2,
20, 2, 198, 39, 38, 4, 199, 35, 34, 39, 199, 33, 32, 38, 196, 37,
@@ -18380,9 +18380,9 @@ videomixer_video_convert_orc_putline_NV12 (guint8 * ORC_RESTRICT d1,
#if 1
static const orc_uint8 bc[] = {
1, 9, 41, 118, 105, 100, 101, 111, 109, 105, 120, 101, 114, 95, 118,
- 105,
+ 105,
100, 101, 111, 95, 99, 111, 110, 118, 101, 114, 116, 95, 111, 114, 99,
- 95,
+ 95,
112, 117, 116, 108, 105, 110, 101, 95, 78, 86, 49, 50, 11, 2, 2, 11,
2, 2, 12, 8, 8, 20, 4, 20, 4, 20, 2, 20, 2, 21, 1, 198,
33, 32, 4, 21, 1, 189, 0, 32, 198, 34, 35, 33, 21, 1, 39, 1,
@@ -18594,9 +18594,9 @@ videomixer_video_convert_orc_putline_NV21 (guint8 * ORC_RESTRICT d1,
#if 1
static const orc_uint8 bc[] = {
1, 9, 41, 118, 105, 100, 101, 111, 109, 105, 120, 101, 114, 95, 118,
- 105,
+ 105,
100, 101, 111, 95, 99, 111, 110, 118, 101, 114, 116, 95, 111, 114, 99,
- 95,
+ 95,
112, 117, 116, 108, 105, 110, 101, 95, 78, 86, 50, 49, 11, 2, 2, 11,
2, 2, 12, 8, 8, 20, 4, 20, 4, 20, 2, 20, 2, 20, 2, 21,
1, 198, 33, 32, 4, 21, 1, 189, 0, 32, 198, 34, 35, 33, 21, 1,
@@ -18899,9 +18899,9 @@ videomixer_video_convert_orc_putline_A420 (guint8 * ORC_RESTRICT d1,
#if 1
static const orc_uint8 bc[] = {
1, 9, 41, 118, 105, 100, 101, 111, 109, 105, 120, 101, 114, 95, 118,
- 105,
+ 105,
100, 101, 111, 95, 99, 111, 110, 118, 101, 114, 116, 95, 111, 114, 99,
- 95,
+ 95,
112, 117, 116, 108, 105, 110, 101, 95, 65, 52, 50, 48, 11, 2, 2, 11,
1, 1, 11, 1, 1, 11, 2, 2, 12, 8, 8, 20, 4, 20, 4, 20,
2, 20, 2, 20, 1, 20, 1, 21, 1, 198, 33, 32, 4, 21, 1, 189,
diff --git a/gst/wavenc/Makefile.in b/gst/wavenc/Makefile.in
index 0b7be521..142aa8c0 100644
--- a/gst/wavenc/Makefile.in
+++ b/gst/wavenc/Makefile.in
@@ -104,6 +104,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/gst/wavparse/Makefile.in b/gst/wavparse/Makefile.in
index e8204b0c..568ca4f8 100644
--- a/gst/wavparse/Makefile.in
+++ b/gst/wavparse/Makefile.in
@@ -104,6 +104,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/gst/y4m/Makefile.in b/gst/y4m/Makefile.in
index a9f37612..8ec8dfe3 100644
--- a/gst/y4m/Makefile.in
+++ b/gst/y4m/Makefile.in
@@ -104,6 +104,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/m4/Makefile.in b/m4/Makefile.in
index fb266b54..16fdaec3 100644
--- a/m4/Makefile.in
+++ b/m4/Makefile.in
@@ -101,6 +101,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/pkgconfig/Makefile.in b/pkgconfig/Makefile.in
index 6b75f643..20e6c7dd 100644
--- a/pkgconfig/Makefile.in
+++ b/pkgconfig/Makefile.in
@@ -102,6 +102,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/po/af.gmo b/po/af.gmo
index 1cc87eeb..74c7195a 100644
--- a/po/af.gmo
+++ b/po/af.gmo
Binary files differ
diff --git a/po/af.po b/po/af.po
index aa419775..7dde409a 100644
--- a/po/af.po
+++ b/po/af.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gst-plugins 0.7.6\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2014-05-03 18:00+0200\n"
+"POT-Creation-Date: 2014-05-21 12:10+0200\n"
"PO-Revision-Date: 2004-03-18 14:16+0200\n"
"Last-Translator: Petri Jooste <rkwjpj@puk.ac.za>\n"
"Language-Team: Afrikaans <i18n@af.org.za>\n"
@@ -244,9 +244,6 @@ msgstr "Kon nie buffers vanaf toestel \"%s\" verkry nie."
msgid "Video device did not accept new frame rate setting."
msgstr ""
-msgid "Video device could not create buffer pool."
-msgstr ""
-
msgid "Video device did not provide output format."
msgstr ""
@@ -259,6 +256,15 @@ msgstr ""
msgid "Video devices uses an unsupported pixel format."
msgstr ""
+msgid "Failed to configure internal buffer pool."
+msgstr ""
+
+msgid "Video device did not suggest any buffer size."
+msgstr ""
+
+msgid "No downstream pool to import from."
+msgstr ""
+
#, fuzzy, c-format
msgid "Failed to get settings of tuner %d on device '%s'."
msgstr "Kon nie genoeg buffers vanaf toestel \"%s\" kry nie."
diff --git a/po/az.gmo b/po/az.gmo
index f434577a..7233630a 100644
--- a/po/az.gmo
+++ b/po/az.gmo
Binary files differ
diff --git a/po/az.po b/po/az.po
index 21da434e..edf7b4fe 100644
--- a/po/az.po
+++ b/po/az.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gst-plugins-0.8.0\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2014-05-03 18:00+0200\n"
+"POT-Creation-Date: 2014-05-21 12:10+0200\n"
"PO-Revision-Date: 2004-03-19 18:29+0200\n"
"Last-Translator: Metin Amiroff <metin@karegen.com>\n"
"Language-Team: Azerbaijani <translation-team-az@lists.sourceforge.net>\n"
@@ -245,9 +245,6 @@ msgstr "\"%s\" avadanlığından bufferlər alına bilmədi."
msgid "Video device did not accept new frame rate setting."
msgstr ""
-msgid "Video device could not create buffer pool."
-msgstr ""
-
msgid "Video device did not provide output format."
msgstr ""
@@ -260,6 +257,15 @@ msgstr ""
msgid "Video devices uses an unsupported pixel format."
msgstr ""
+msgid "Failed to configure internal buffer pool."
+msgstr ""
+
+msgid "Video device did not suggest any buffer size."
+msgstr ""
+
+msgid "No downstream pool to import from."
+msgstr ""
+
#, fuzzy, c-format
msgid "Failed to get settings of tuner %d on device '%s'."
msgstr "\"%s\" avadanlığından kifayət qədər bufferlər alına bilmədi."
diff --git a/po/bg.gmo b/po/bg.gmo
index 3b4eac07..2c7b1187 100644
--- a/po/bg.gmo
+++ b/po/bg.gmo
Binary files differ
diff --git a/po/bg.po b/po/bg.po
index 181751f5..cb34d69b 100644
--- a/po/bg.po
+++ b/po/bg.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gst-plugins-good 0.10.28.2\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2014-05-03 18:00+0200\n"
+"POT-Creation-Date: 2014-05-21 12:10+0200\n"
"PO-Revision-Date: 2011-04-26 22:35+0300\n"
"Last-Translator: Alexander Shopov <ash@kambanaria.org>\n"
"Language-Team: Bulgarian <dict@fsa-bg.org>\n"
@@ -253,9 +253,6 @@ msgid "Video device did not accept new frame rate setting."
msgstr ""
"Устройството за видео вход не приема новите настройки за честотата на кадри."
-msgid "Video device could not create buffer pool."
-msgstr ""
-
#, fuzzy
msgid "Video device did not provide output format."
msgstr ""
@@ -271,6 +268,17 @@ msgstr "Драйверът за устройството „%s“ не подд
msgid "Video devices uses an unsupported pixel format."
msgstr ""
+msgid "Failed to configure internal buffer pool."
+msgstr ""
+
+#, fuzzy
+msgid "Video device did not suggest any buffer size."
+msgstr ""
+"Устройството за видео вход не приема новите настройки за честотата на кадри."
+
+msgid "No downstream pool to import from."
+msgstr ""
+
#, fuzzy, c-format
msgid "Failed to get settings of tuner %d on device '%s'."
msgstr "Неуспешно получаване на настройките на тунер %d на устройство „%s“."
diff --git a/po/ca.gmo b/po/ca.gmo
index 8a077ce0..42f33e60 100644
--- a/po/ca.gmo
+++ b/po/ca.gmo
Binary files differ
diff --git a/po/ca.po b/po/ca.po
index d67ca464..bd5467dc 100644
--- a/po/ca.po
+++ b/po/ca.po
@@ -9,7 +9,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gst-plugins-good 0.10.28.2\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2014-05-03 18:00+0200\n"
+"POT-Creation-Date: 2014-05-21 12:10+0200\n"
"PO-Revision-Date: 2012-01-01 14:19+0100\n"
"Last-Translator: Gil Forcada <gforcada@gnome.org>\n"
"Language-Team: Catalan <ca@dodds.net>\n"
@@ -264,9 +264,6 @@ msgstr ""
"El dispositiu d'entrada de vídeo no ha acceptat el paràmetre nou de "
"fotogrames per segon."
-msgid "Video device could not create buffer pool."
-msgstr ""
-
#, fuzzy
msgid "Video device did not provide output format."
msgstr ""
@@ -285,6 +282,18 @@ msgstr ""
msgid "Video devices uses an unsupported pixel format."
msgstr ""
+msgid "Failed to configure internal buffer pool."
+msgstr ""
+
+#, fuzzy
+msgid "Video device did not suggest any buffer size."
+msgstr ""
+"El dispositiu d'entrada de vídeo no ha acceptat el paràmetre nou de "
+"fotogrames per segon."
+
+msgid "No downstream pool to import from."
+msgstr ""
+
#, fuzzy, c-format
msgid "Failed to get settings of tuner %d on device '%s'."
msgstr ""
diff --git a/po/cs.gmo b/po/cs.gmo
index 0943c503..3c80eb4f 100644
--- a/po/cs.gmo
+++ b/po/cs.gmo
Binary files differ
diff --git a/po/cs.po b/po/cs.po
index 36f14896..ec92e447 100644
--- a/po/cs.po
+++ b/po/cs.po
@@ -10,7 +10,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gst-plugins-good-1.1.4\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2014-05-03 18:00+0200\n"
+"POT-Creation-Date: 2014-05-21 12:10+0200\n"
"PO-Revision-Date: 2013-09-18 19:18+0200\n"
"Last-Translator: Marek Černocký <marek@manet.cz>\n"
"Language-Team: Czech <translation-team-cs@lists.sourceforge.net>\n"
@@ -256,9 +256,6 @@ msgstr "Nezdařilo se zjištění parametrů na zařízení „%s“"
msgid "Video device did not accept new frame rate setting."
msgstr "Videozařízení nepřijalo nové nastavení snímkové rychlosti."
-msgid "Video device could not create buffer pool."
-msgstr "Videozařízení se nezdařilo vytvořit společnou vyrovnávací paměť."
-
#, fuzzy
msgid "Video device did not provide output format."
msgstr "Videozařízení nepřijalo nové nastavení snímkové rychlosti."
@@ -273,6 +270,17 @@ msgstr "Ovladač zařízení „%s“ nepodporuje V/V metodu %d"
msgid "Video devices uses an unsupported pixel format."
msgstr ""
+#, fuzzy
+msgid "Failed to configure internal buffer pool."
+msgstr "Videozařízení se nezdařilo vytvořit společnou vyrovnávací paměť."
+
+#, fuzzy
+msgid "Video device did not suggest any buffer size."
+msgstr "Videozařízení se nezdařilo vytvořit společnou vyrovnávací paměť."
+
+msgid "No downstream pool to import from."
+msgstr ""
+
#, c-format
msgid "Failed to get settings of tuner %d on device '%s'."
msgstr "Selhalo zjištění nastavení tuneru %d u zařízení „%s“."
diff --git a/po/da.gmo b/po/da.gmo
index beef331c..60f05e1c 100644
--- a/po/da.gmo
+++ b/po/da.gmo
Binary files differ
diff --git a/po/da.po b/po/da.po
index e47d69ba..96fcdc34 100644
--- a/po/da.po
+++ b/po/da.po
@@ -12,7 +12,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gst-plugins-good-1.2.1\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2014-05-03 18:00+0200\n"
+"POT-Creation-Date: 2014-05-21 12:10+0200\n"
"PO-Revision-Date: 2013-12-08 23:54+0200\n"
"Last-Translator: Joe Hansen <joedalton2@yahoo.dk>\n"
"Language-Team: Danish <dansk@dansk-gruppen.dk>\n"
@@ -259,9 +259,6 @@ msgstr "Kunne ikke hente parametre fra enhed »%s«"
msgid "Video device did not accept new frame rate setting."
msgstr "Videoenheden accepterede ikke ny indstilling for billedrate."
-msgid "Video device could not create buffer pool."
-msgstr "Videoenhed kunne ikke oprette mellemlagerkø."
-
#, fuzzy
msgid "Video device did not provide output format."
msgstr "Videoenheden accepterede ikke ny indstilling for billedrate."
@@ -276,6 +273,17 @@ msgstr "Driveren til enhed »%s« understøtter ikke IO-metoden %d"
msgid "Video devices uses an unsupported pixel format."
msgstr ""
+#, fuzzy
+msgid "Failed to configure internal buffer pool."
+msgstr "Videoenhed kunne ikke oprette mellemlagerkø."
+
+#, fuzzy
+msgid "Video device did not suggest any buffer size."
+msgstr "Videoenhed kunne ikke oprette mellemlagerkø."
+
+msgid "No downstream pool to import from."
+msgstr ""
+
#, c-format
msgid "Failed to get settings of tuner %d on device '%s'."
msgstr "Hentning af indstillinger for tuner %d på enhed »%s« fejlede."
diff --git a/po/de.gmo b/po/de.gmo
index d9587917..5a8f4ebc 100644
--- a/po/de.gmo
+++ b/po/de.gmo
Binary files differ
diff --git a/po/de.po b/po/de.po
index 805b082a..5bc42349 100644
--- a/po/de.po
+++ b/po/de.po
@@ -14,7 +14,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gst-plugins-good 1.1.4\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2014-05-03 18:00+0200\n"
+"POT-Creation-Date: 2014-05-21 12:10+0200\n"
"PO-Revision-Date: 2013-09-21 12:39+0100\n"
"Last-Translator: Christian Kirbach <christian.kirbach@gmail.com>\n"
"Language-Team: German <translation-team-de@lists.sourceforge.net>\n"
@@ -270,9 +270,6 @@ msgstr ""
"Das Video-Eingabegerät akzeptierte nicht die neue Einstellung zur "
"Bildwiederholungsrate."
-msgid "Video device could not create buffer pool."
-msgstr "Das Videogerät konnte keinen Puffer-Pool erstellen"
-
#, fuzzy
msgid "Video device did not provide output format."
msgstr ""
@@ -289,6 +286,17 @@ msgstr "Der Treiber von Gerät »%s« unterstützt nicht die EA-Methode %d"
msgid "Video devices uses an unsupported pixel format."
msgstr ""
+#, fuzzy
+msgid "Failed to configure internal buffer pool."
+msgstr "Das Videogerät konnte keinen Puffer-Pool erstellen"
+
+#, fuzzy
+msgid "Video device did not suggest any buffer size."
+msgstr "Das Videogerät konnte keinen Puffer-Pool erstellen"
+
+msgid "No downstream pool to import from."
+msgstr ""
+
#, c-format
msgid "Failed to get settings of tuner %d on device '%s'."
msgstr ""
diff --git a/po/el.gmo b/po/el.gmo
index 196ce016..6da46442 100644
--- a/po/el.gmo
+++ b/po/el.gmo
Binary files differ
diff --git a/po/el.po b/po/el.po
index 931373bd..577daba1 100644
--- a/po/el.po
+++ b/po/el.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gst-plugins-good 0.10.28.2\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2014-05-03 18:00+0200\n"
+"POT-Creation-Date: 2014-05-21 12:10+0200\n"
"PO-Revision-Date: 2012-05-05 19:05+0100\n"
"Last-Translator: Savvas Radevic <vicedar@gmail.com>\n"
"Language-Team: Greek <team@lists.gnome.gr>\n"
@@ -256,9 +256,6 @@ msgstr "Δεν ήταν δυνατή η ανάγνωση των παραμέτρ
msgid "Video device did not accept new frame rate setting."
msgstr "Η συσκευή εισόδου βίντεο δεν αποδέχθηκε τη νέα ρύθμιση ταχύτητας καρέ."
-msgid "Video device could not create buffer pool."
-msgstr ""
-
#, fuzzy
msgid "Video device did not provide output format."
msgstr "Η συσκευή εισόδου βίντεο δεν αποδέχθηκε τη νέα ρύθμιση ταχύτητας καρέ."
@@ -272,6 +269,16 @@ msgstr ""
msgid "Video devices uses an unsupported pixel format."
msgstr ""
+msgid "Failed to configure internal buffer pool."
+msgstr ""
+
+#, fuzzy
+msgid "Video device did not suggest any buffer size."
+msgstr "Η συσκευή εισόδου βίντεο δεν αποδέχθηκε τη νέα ρύθμιση ταχύτητας καρέ."
+
+msgid "No downstream pool to import from."
+msgstr ""
+
#, fuzzy, c-format
msgid "Failed to get settings of tuner %d on device '%s'."
msgstr "Αποτυχία ανάγνωσης των ρυθμίσεων δέκτη %d στην συσκευή '%s'."
diff --git a/po/en_GB.gmo b/po/en_GB.gmo
index 57c2c951..138dcdfe 100644
--- a/po/en_GB.gmo
+++ b/po/en_GB.gmo
Binary files differ
diff --git a/po/en_GB.po b/po/en_GB.po
index d5d9f591..f71db27a 100644
--- a/po/en_GB.po
+++ b/po/en_GB.po
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gst-plugins 0.8.1\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2014-05-03 18:00+0200\n"
+"POT-Creation-Date: 2014-05-21 12:10+0200\n"
"PO-Revision-Date: 2004-04-26 10:41-0400\n"
"Last-Translator: Gareth Owen <gowen72@yahoo.com>\n"
"Language-Team: English (British) <en_gb@li.org>\n"
@@ -244,9 +244,6 @@ msgstr "Could not get buffers from device \"%s\"."
msgid "Video device did not accept new frame rate setting."
msgstr ""
-msgid "Video device could not create buffer pool."
-msgstr ""
-
msgid "Video device did not provide output format."
msgstr ""
@@ -259,6 +256,15 @@ msgstr ""
msgid "Video devices uses an unsupported pixel format."
msgstr ""
+msgid "Failed to configure internal buffer pool."
+msgstr ""
+
+msgid "Video device did not suggest any buffer size."
+msgstr ""
+
+msgid "No downstream pool to import from."
+msgstr ""
+
#, fuzzy, c-format
msgid "Failed to get settings of tuner %d on device '%s'."
msgstr "Could not get enough buffers from device \"%s\"."
diff --git a/po/eo.gmo b/po/eo.gmo
index fcf1e5b3..ad7a95d9 100644
--- a/po/eo.gmo
+++ b/po/eo.gmo
Binary files differ
diff --git a/po/eo.po b/po/eo.po
index b631c335..29f96c7e 100644
--- a/po/eo.po
+++ b/po/eo.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gst-plugins-good 0.10.28.2\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2014-05-03 18:00+0200\n"
+"POT-Creation-Date: 2014-05-21 12:10+0200\n"
"PO-Revision-Date: 2011-06-04 21:48+0100\n"
"Last-Translator: Kristjan SCHMIDT <kristjan.schmidt@googlemail.com>\n"
"Language-Team: Esperanto <translation-team-eo@lists.sourceforge.net>\n"
@@ -240,9 +240,6 @@ msgstr ""
msgid "Video device did not accept new frame rate setting."
msgstr ""
-msgid "Video device could not create buffer pool."
-msgstr ""
-
msgid "Video device did not provide output format."
msgstr ""
@@ -255,6 +252,15 @@ msgstr ""
msgid "Video devices uses an unsupported pixel format."
msgstr ""
+msgid "Failed to configure internal buffer pool."
+msgstr ""
+
+msgid "Video device did not suggest any buffer size."
+msgstr ""
+
+msgid "No downstream pool to import from."
+msgstr ""
+
#, c-format
msgid "Failed to get settings of tuner %d on device '%s'."
msgstr ""
diff --git a/po/es.gmo b/po/es.gmo
index 45d70f5d..bea6c0c8 100644
--- a/po/es.gmo
+++ b/po/es.gmo
Binary files differ
diff --git a/po/es.po b/po/es.po
index c352b2b8..b3a7305f 100644
--- a/po/es.po
+++ b/po/es.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gst-plugins-good 0.10.26.2\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2014-05-03 18:00+0200\n"
+"POT-Creation-Date: 2014-05-21 12:10+0200\n"
"PO-Revision-Date: 2011-02-12 18:30+0100\n"
"Last-Translator: Jorge González González <aloriel@gmail.com>\n"
"Language-Team: Spanish <es@li.org>\n"
@@ -266,9 +266,6 @@ msgstr ""
"El dispositivo de entrada de vídeo no aceptó el ajuste de la nueva tasa de "
"fotogramas."
-msgid "Video device could not create buffer pool."
-msgstr ""
-
#, fuzzy
msgid "Video device did not provide output format."
msgstr ""
@@ -287,6 +284,18 @@ msgstr ""
msgid "Video devices uses an unsupported pixel format."
msgstr ""
+msgid "Failed to configure internal buffer pool."
+msgstr ""
+
+#, fuzzy
+msgid "Video device did not suggest any buffer size."
+msgstr ""
+"El dispositivo de entrada de vídeo no aceptó el ajuste de la nueva tasa de "
+"fotogramas."
+
+msgid "No downstream pool to import from."
+msgstr ""
+
#, fuzzy, c-format
msgid "Failed to get settings of tuner %d on device '%s'."
msgstr ""
diff --git a/po/eu.gmo b/po/eu.gmo
index ab510fe4..2529dfec 100644
--- a/po/eu.gmo
+++ b/po/eu.gmo
Binary files differ
diff --git a/po/eu.po b/po/eu.po
index d7dc2f57..2abc3e54 100644
--- a/po/eu.po
+++ b/po/eu.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gst-plugins-good-0.10.18.2\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2014-05-03 18:00+0200\n"
+"POT-Creation-Date: 2014-05-21 12:10+0200\n"
"PO-Revision-Date: 2010-03-25 12:37+0100\n"
"Last-Translator: Mikel Olasagasti Uranga <hey_neken@mundurat.net>\n"
"Language-Team: Basque <translation-team-eu@lists.sourceforge.net>\n"
@@ -264,9 +264,6 @@ msgstr ""
"Bideoaren sarrerako gailuak ez du fotograma-tamainaren ezarpen berria "
"onartzen."
-msgid "Video device could not create buffer pool."
-msgstr ""
-
#, fuzzy
msgid "Video device did not provide output format."
msgstr ""
@@ -284,6 +281,18 @@ msgstr ""
msgid "Video devices uses an unsupported pixel format."
msgstr ""
+msgid "Failed to configure internal buffer pool."
+msgstr ""
+
+#, fuzzy
+msgid "Video device did not suggest any buffer size."
+msgstr ""
+"Bideoaren sarrerako gailuak ez du fotograma-tamainaren ezarpen berria "
+"onartzen."
+
+msgid "No downstream pool to import from."
+msgstr ""
+
#, fuzzy, c-format
msgid "Failed to get settings of tuner %d on device '%s'."
msgstr ""
diff --git a/po/fi.gmo b/po/fi.gmo
index 71fb1f82..4956ea7e 100644
--- a/po/fi.gmo
+++ b/po/fi.gmo
Binary files differ
diff --git a/po/fi.po b/po/fi.po
index 6bfd4c72..bed2a609 100644
--- a/po/fi.po
+++ b/po/fi.po
@@ -11,7 +11,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gst-plugins-good 0.10.25.3\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2014-05-03 18:00+0200\n"
+"POT-Creation-Date: 2014-05-21 12:10+0200\n"
"PO-Revision-Date: 2010-11-17 23:03+0200\n"
"Last-Translator: Tommi Vainikainen <Tommi.Vainikainen@iki.fi>\n"
"Language-Team: Finnish <translation-team-fi@lists.sourceforge.net>\n"
@@ -259,9 +259,6 @@ msgstr "Laitteelta ”%s” ei voitu saada parametreja"
msgid "Video device did not accept new frame rate setting."
msgstr "Videosyötelaite ei hyväksy uutta kehysnopeusasetusta."
-msgid "Video device could not create buffer pool."
-msgstr ""
-
#, fuzzy
msgid "Video device did not provide output format."
msgstr "Videosyötelaite ei hyväksy uutta kehysnopeusasetusta."
@@ -276,6 +273,16 @@ msgstr "Laitteen ”%s” ajuri ei tue mitään tunnettua kaappaustapaa."
msgid "Video devices uses an unsupported pixel format."
msgstr ""
+msgid "Failed to configure internal buffer pool."
+msgstr ""
+
+#, fuzzy
+msgid "Video device did not suggest any buffer size."
+msgstr "Videosyötelaite ei hyväksy uutta kehysnopeusasetusta."
+
+msgid "No downstream pool to import from."
+msgstr ""
+
#, fuzzy, c-format
msgid "Failed to get settings of tuner %d on device '%s'."
msgstr "Virittimen %d asetuksia ei voitu lukea laitteelta ”%s”."
diff --git a/po/fr.gmo b/po/fr.gmo
index f9e0a311..a8c353b9 100644
--- a/po/fr.gmo
+++ b/po/fr.gmo
Binary files differ
diff --git a/po/fr.po b/po/fr.po
index ba2c0856..3c1f10c4 100644
--- a/po/fr.po
+++ b/po/fr.po
@@ -9,7 +9,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gst-plugins-good 0.10.28.2\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2014-05-03 18:00+0200\n"
+"POT-Creation-Date: 2014-05-21 12:10+0200\n"
"PO-Revision-Date: 2011-04-28 09:22+0200\n"
"Last-Translator: Claude Paroz <claude@2xlibre.net>\n"
"Language-Team: French <traduc@traduc.org>\n"
@@ -264,9 +264,6 @@ msgstr ""
"Le périphérique d'entrée vidéo n'a pas accepté le nouveau paramètre de "
"fréquence d'image."
-msgid "Video device could not create buffer pool."
-msgstr ""
-
#, fuzzy
msgid "Video device did not provide output format."
msgstr ""
@@ -285,6 +282,18 @@ msgstr ""
msgid "Video devices uses an unsupported pixel format."
msgstr ""
+msgid "Failed to configure internal buffer pool."
+msgstr ""
+
+#, fuzzy
+msgid "Video device did not suggest any buffer size."
+msgstr ""
+"Le périphérique d'entrée vidéo n'a pas accepté le nouveau paramètre de "
+"fréquence d'image."
+
+msgid "No downstream pool to import from."
+msgstr ""
+
#, fuzzy, c-format
msgid "Failed to get settings of tuner %d on device '%s'."
msgstr ""
diff --git a/po/gl.gmo b/po/gl.gmo
index 327ee716..56d00658 100644
--- a/po/gl.gmo
+++ b/po/gl.gmo
Binary files differ
diff --git a/po/gl.po b/po/gl.po
index 05d27b0f..1c560746 100644
--- a/po/gl.po
+++ b/po/gl.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gst-plugins-good 1.0.3\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2014-05-03 18:00+0200\n"
+"POT-Creation-Date: 2014-05-21 12:10+0200\n"
"PO-Revision-Date: 2012-12-15 03:46+0200\n"
"Last-Translator: Fran Dieguez <frandieguez@ubuntu.com>\n"
"Language-Team: Galician <proxecto@trasno.net>\n"
@@ -261,9 +261,6 @@ msgid "Video device did not accept new frame rate setting."
msgstr ""
"O dispositivo de vídeo non acepta a nova configuración de taxa de marcos."
-msgid "Video device could not create buffer pool."
-msgstr "O dispositivo de vídeo non pode crear un pool de búfer."
-
#, fuzzy
msgid "Video device did not provide output format."
msgstr ""
@@ -279,6 +276,17 @@ msgstr "O controlador do dispositivo «%s» non admite o método IO %d"
msgid "Video devices uses an unsupported pixel format."
msgstr ""
+#, fuzzy
+msgid "Failed to configure internal buffer pool."
+msgstr "O dispositivo de vídeo non pode crear un pool de búfer."
+
+#, fuzzy
+msgid "Video device did not suggest any buffer size."
+msgstr "O dispositivo de vídeo non pode crear un pool de búfer."
+
+msgid "No downstream pool to import from."
+msgstr ""
+
#, c-format
msgid "Failed to get settings of tuner %d on device '%s'."
msgstr ""
diff --git a/po/gst-plugins-good-1.0.pot b/po/gst-plugins-good-1.0.pot
index d66eb8b8..0d863d06 100644
--- a/po/gst-plugins-good-1.0.pot
+++ b/po/gst-plugins-good-1.0.pot
@@ -5,9 +5,9 @@
#, fuzzy
msgid ""
msgstr ""
-"Project-Id-Version: gst-plugins-good 1.3.1\n"
+"Project-Id-Version: gst-plugins-good 1.3.2\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2014-05-03 18:00+0200\n"
+"POT-Creation-Date: 2014-05-21 12:10+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -37,32 +37,32 @@ msgstr ""
msgid "Could not connect to server"
msgstr ""
-#: ext/soup/gstsouphttpsrc.c:850
+#: ext/soup/gstsouphttpsrc.c:859
msgid "No URL set."
msgstr ""
-#: ext/soup/gstsouphttpsrc.c:1103
+#: ext/soup/gstsouphttpsrc.c:1146
msgid "Server does not support seeking."
msgstr ""
-#: ext/soup/gstsouphttpsrc.c:1377
+#: ext/soup/gstsouphttpsrc.c:1420
msgid "Could not resolve server name."
msgstr ""
-#: ext/soup/gstsouphttpsrc.c:1383
+#: ext/soup/gstsouphttpsrc.c:1426
msgid "Could not establish connection to server."
msgstr ""
-#: ext/soup/gstsouphttpsrc.c:1388
+#: ext/soup/gstsouphttpsrc.c:1431
msgid "Secure connection setup failed."
msgstr ""
-#: ext/soup/gstsouphttpsrc.c:1398
+#: ext/soup/gstsouphttpsrc.c:1441
msgid ""
"A network error occured, or the server closed the connection unexpectedly."
msgstr ""
-#: ext/soup/gstsouphttpsrc.c:1405
+#: ext/soup/gstsouphttpsrc.c:1448
msgid "Server sent bad data."
msgstr ""
@@ -78,36 +78,36 @@ msgstr ""
msgid "This file contains no playable streams."
msgstr ""
-#: gst/isomp4/qtdemux.c:621 gst/isomp4/qtdemux.c:4700
-#: gst/isomp4/qtdemux.c:4767 gst/isomp4/qtdemux.c:5003
+#: gst/isomp4/qtdemux.c:621 gst/isomp4/qtdemux.c:4705
+#: gst/isomp4/qtdemux.c:4772 gst/isomp4/qtdemux.c:5008
msgid "This file is invalid and cannot be played."
msgstr ""
-#: gst/isomp4/qtdemux.c:2296
+#: gst/isomp4/qtdemux.c:2301
msgid "Cannot play stream because it is encrypted with PlayReady DRM."
msgstr ""
-#: gst/isomp4/qtdemux.c:2859 gst/isomp4/qtdemux.c:2935
-#: gst/isomp4/qtdemux.c:2978 gst/isomp4/qtdemux.c:5705
-#: gst/isomp4/qtdemux.c:5712 gst/isomp4/qtdemux.c:6354
-#: gst/isomp4/qtdemux.c:6783 gst/isomp4/qtdemux.c:6790
-#: gst/isomp4/qtdemux.c:8620
+#: gst/isomp4/qtdemux.c:2864 gst/isomp4/qtdemux.c:2940
+#: gst/isomp4/qtdemux.c:2983 gst/isomp4/qtdemux.c:5710
+#: gst/isomp4/qtdemux.c:5717 gst/isomp4/qtdemux.c:6359
+#: gst/isomp4/qtdemux.c:6788 gst/isomp4/qtdemux.c:6795
+#: gst/isomp4/qtdemux.c:8627
msgid "This file is corrupt and cannot be played."
msgstr ""
-#: gst/isomp4/qtdemux.c:3069
+#: gst/isomp4/qtdemux.c:3074
msgid "Invalid atom size."
msgstr ""
-#: gst/isomp4/qtdemux.c:3137
+#: gst/isomp4/qtdemux.c:3142
msgid "This file is incomplete and cannot be played."
msgstr ""
-#: gst/isomp4/qtdemux.c:7443
+#: gst/isomp4/qtdemux.c:7448
msgid "The video in this file might not play correctly."
msgstr ""
-#: gst/isomp4/qtdemux.c:8661
+#: gst/isomp4/qtdemux.c:8668
#, c-format
msgid "This file contains too many streams. Only playing first %d"
msgstr ""
@@ -252,85 +252,93 @@ msgstr ""
msgid "AUX 2 Out"
msgstr ""
-#: sys/v4l2/gstv4l2bufferpool.c:1401
+#: sys/v4l2/gstv4l2bufferpool.c:1476
#, c-format
msgid "Error reading %d bytes from device '%s'."
msgstr ""
-#: sys/v4l2/gstv4l2object.c:1032
+#: sys/v4l2/gstv4l2object.c:1062
#, c-format
msgid "Failed to enumerate possible video formats device '%s' can work with"
msgstr ""
-#: sys/v4l2/gstv4l2object.c:2210
+#: sys/v4l2/gstv4l2object.c:2297
#, c-format
msgid "Could not map buffers from device '%s'"
msgstr ""
-#: sys/v4l2/gstv4l2object.c:2218
+#: sys/v4l2/gstv4l2object.c:2305
#, c-format
msgid "The driver of device '%s' does not support the IO method %d"
msgstr ""
-#: sys/v4l2/gstv4l2object.c:2225
+#: sys/v4l2/gstv4l2object.c:2312
#, c-format
msgid "The driver of device '%s' does not support any known IO method."
msgstr ""
-#: sys/v4l2/gstv4l2object.c:2559
+#: sys/v4l2/gstv4l2object.c:2805
#, c-format
msgid "Device '%s' does not support video capture"
msgstr ""
-#: sys/v4l2/gstv4l2object.c:2568
+#: sys/v4l2/gstv4l2object.c:2814
#, c-format
msgid "Device '%s' is busy"
msgstr ""
-#: sys/v4l2/gstv4l2object.c:2574 sys/v4l2/gstv4l2object.c:2585
+#: sys/v4l2/gstv4l2object.c:2820 sys/v4l2/gstv4l2object.c:2831
#, c-format
msgid "Device '%s' cannot capture at %dx%d"
msgstr ""
-#: sys/v4l2/gstv4l2object.c:2594
+#: sys/v4l2/gstv4l2object.c:2840
#, c-format
msgid "Device '%s' cannot capture in the specified format"
msgstr ""
-#: sys/v4l2/gstv4l2object.c:2605
+#: sys/v4l2/gstv4l2object.c:2851
#, c-format
msgid "Device '%s' does support non-contiguous planes"
msgstr ""
-#: sys/v4l2/gstv4l2object.c:2615
+#: sys/v4l2/gstv4l2object.c:2861
#, c-format
msgid "Could not get parameters on device '%s'"
msgstr ""
-#: sys/v4l2/gstv4l2object.c:2623
+#: sys/v4l2/gstv4l2object.c:2869
msgid "Video device did not accept new frame rate setting."
msgstr ""
-#: sys/v4l2/gstv4l2object.c:2630 sys/v4l2/gstv4l2object.c:3029
-msgid "Video device could not create buffer pool."
-msgstr ""
-
-#: sys/v4l2/gstv4l2object.c:2725
+#: sys/v4l2/gstv4l2object.c:2962
msgid "Video device did not provide output format."
msgstr ""
-#: sys/v4l2/gstv4l2object.c:2731
+#: sys/v4l2/gstv4l2object.c:2968
msgid "Video device returned invalid dimensions."
msgstr ""
-#: sys/v4l2/gstv4l2object.c:2739
+#: sys/v4l2/gstv4l2object.c:2976
msgid "Video devices uses an unsupported interlacing method."
msgstr ""
-#: sys/v4l2/gstv4l2object.c:2746
+#: sys/v4l2/gstv4l2object.c:2983
msgid "Video devices uses an unsupported pixel format."
msgstr ""
+#: sys/v4l2/gstv4l2object.c:3364
+msgid "Failed to configure internal buffer pool."
+msgstr ""
+
+#: sys/v4l2/gstv4l2object.c:3370
+msgid "Video device did not suggest any buffer size."
+msgstr ""
+
+#: sys/v4l2/gstv4l2object.c:3382
+msgid "No downstream pool to import from."
+msgstr ""
+
#: sys/v4l2/gstv4l2radio.c:138
#, c-format
msgid "Failed to get settings of tuner %d on device '%s'."
@@ -351,7 +359,7 @@ msgstr ""
msgid "Failed to get radio input on device '%s'. "
msgstr ""
-#: sys/v4l2/gstv4l2radio.c:202 sys/v4l2/v4l2_calls.c:1089
+#: sys/v4l2/gstv4l2radio.c:202 sys/v4l2/v4l2_calls.c:1092
#, c-format
msgid "Failed to set input %d on device %s."
msgstr ""
@@ -383,88 +391,88 @@ msgstr ""
msgid "Failed to query norm on device '%s'."
msgstr ""
-#: sys/v4l2/v4l2_calls.c:408
+#: sys/v4l2/v4l2_calls.c:411
#, c-format
msgid "Failed getting controls attributes on device '%s'."
msgstr ""
-#: sys/v4l2/v4l2_calls.c:613
+#: sys/v4l2/v4l2_calls.c:616
#, c-format
msgid "Cannot identify device '%s'."
msgstr ""
-#: sys/v4l2/v4l2_calls.c:620
+#: sys/v4l2/v4l2_calls.c:623
#, c-format
msgid "This isn't a device '%s'."
msgstr ""
-#: sys/v4l2/v4l2_calls.c:627
+#: sys/v4l2/v4l2_calls.c:630
#, c-format
msgid "Could not open device '%s' for reading and writing."
msgstr ""
-#: sys/v4l2/v4l2_calls.c:634
+#: sys/v4l2/v4l2_calls.c:637
#, c-format
msgid "Device '%s' is not a capture device."
msgstr ""
-#: sys/v4l2/v4l2_calls.c:642
+#: sys/v4l2/v4l2_calls.c:645
#, c-format
msgid "Device '%s' is not a output device."
msgstr ""
-#: sys/v4l2/v4l2_calls.c:650
+#: sys/v4l2/v4l2_calls.c:653
#, c-format
msgid "Device '%s' is not a M2M device."
msgstr ""
-#: sys/v4l2/v4l2_calls.c:712
+#: sys/v4l2/v4l2_calls.c:715
#, c-format
msgid "Could not dup device '%s' for reading and writing."
msgstr ""
-#: sys/v4l2/v4l2_calls.c:799
+#: sys/v4l2/v4l2_calls.c:802
#, c-format
msgid "Failed to set norm for device '%s'."
msgstr ""
-#: sys/v4l2/v4l2_calls.c:837
+#: sys/v4l2/v4l2_calls.c:840
#, c-format
msgid "Failed to get current tuner frequency for device '%s'."
msgstr ""
-#: sys/v4l2/v4l2_calls.c:879
+#: sys/v4l2/v4l2_calls.c:882
#, c-format
msgid "Failed to set current tuner frequency for device '%s' to %lu Hz."
msgstr ""
-#: sys/v4l2/v4l2_calls.c:913
+#: sys/v4l2/v4l2_calls.c:916
#, c-format
msgid "Failed to get signal strength for device '%s'."
msgstr ""
-#: sys/v4l2/v4l2_calls.c:949
+#: sys/v4l2/v4l2_calls.c:952
#, c-format
msgid "Failed to get value for control %d on device '%s'."
msgstr ""
-#: sys/v4l2/v4l2_calls.c:984
+#: sys/v4l2/v4l2_calls.c:987
#, c-format
msgid "Failed to set value %d for control %d on device '%s'."
msgstr ""
-#: sys/v4l2/v4l2_calls.c:1064
+#: sys/v4l2/v4l2_calls.c:1067
#, c-format
msgid "Failed to get current input on device '%s'. May be it is a radio device"
msgstr ""
-#: sys/v4l2/v4l2_calls.c:1121
+#: sys/v4l2/v4l2_calls.c:1124
#, c-format
msgid ""
"Failed to get current output on device '%s'. May be it is a radio device"
msgstr ""
-#: sys/v4l2/v4l2_calls.c:1146
+#: sys/v4l2/v4l2_calls.c:1149
#, c-format
msgid "Failed to set output %d on device %s."
msgstr ""
diff --git a/po/hr.gmo b/po/hr.gmo
index be5ac88c..680af9fa 100644
--- a/po/hr.gmo
+++ b/po/hr.gmo
Binary files differ
diff --git a/po/hr.po b/po/hr.po
index 40611cdf..bc441e86 100644
--- a/po/hr.po
+++ b/po/hr.po
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gst-plugins-good 0.10.28.2\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2014-05-03 18:00+0200\n"
+"POT-Creation-Date: 2014-05-21 12:10+0200\n"
"PO-Revision-Date: 2012-04-16 03:04+0200\n"
"Last-Translator: Tomislav Krznar <tomislav.krznar@gmail.com>\n"
"Language-Team: Croatian <lokalizacija@linux.hr>\n"
@@ -253,9 +253,6 @@ msgstr "Nisam uspio dobiti parametre uređaja „%s”"
msgid "Video device did not accept new frame rate setting."
msgstr "Ulazni video uređaj nije prihvatio nove postavke broja okvira."
-msgid "Video device could not create buffer pool."
-msgstr ""
-
#, fuzzy
msgid "Video device did not provide output format."
msgstr "Ulazni video uređaj nije prihvatio nove postavke broja okvira."
@@ -270,6 +267,16 @@ msgstr "Upravljački program uređaja „%s” ne podržava poznate metode snima
msgid "Video devices uses an unsupported pixel format."
msgstr ""
+msgid "Failed to configure internal buffer pool."
+msgstr ""
+
+#, fuzzy
+msgid "Video device did not suggest any buffer size."
+msgstr "Ulazni video uređaj nije prihvatio nove postavke broja okvira."
+
+msgid "No downstream pool to import from."
+msgstr ""
+
#, fuzzy, c-format
msgid "Failed to get settings of tuner %d on device '%s'."
msgstr "Nisam uspio dobiti postavke birača %d uređaja „%s”."
diff --git a/po/hu.gmo b/po/hu.gmo
index eb10c359..7d546e9a 100644
--- a/po/hu.gmo
+++ b/po/hu.gmo
Binary files differ
diff --git a/po/hu.po b/po/hu.po
index 1bd61557..7cbc1694 100644
--- a/po/hu.po
+++ b/po/hu.po
@@ -9,7 +9,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gst-plugins-good 1.2.1\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2014-05-03 18:00+0200\n"
+"POT-Creation-Date: 2014-05-21 12:10+0200\n"
"PO-Revision-Date: 2014-03-20 18:55+0100\n"
"Last-Translator: Balázs Úr <urbalazs@gmail.com>\n"
"Language-Team: Hungarian <translation-team-hu@lists.sourceforge.net>\n"
@@ -260,9 +260,6 @@ msgstr "Nem kérhetők le a(z) „%s” eszköz paraméterei"
msgid "Video device did not accept new frame rate setting."
msgstr "A videoeszköz nem fogadta el az új képkockasebesség-beállítást."
-msgid "Video device could not create buffer pool."
-msgstr "A videoeszköz nem tudott létrehozni puffertárolót."
-
#, fuzzy
msgid "Video device did not provide output format."
msgstr "A videoeszköz nem fogadta el az új képkockasebesség-beállítást."
@@ -277,6 +274,17 @@ msgstr "A(z) „%s” eszköz illesztőprogramja nem támogatja a(z) %d. IO mód
msgid "Video devices uses an unsupported pixel format."
msgstr ""
+#, fuzzy
+msgid "Failed to configure internal buffer pool."
+msgstr "A videoeszköz nem tudott létrehozni puffertárolót."
+
+#, fuzzy
+msgid "Video device did not suggest any buffer size."
+msgstr "A videoeszköz nem tudott létrehozni puffertárolót."
+
+msgid "No downstream pool to import from."
+msgstr ""
+
#, c-format
msgid "Failed to get settings of tuner %d on device '%s'."
msgstr "A(z) %d. tuner beállításának lekérése a(z) „%s” eszközön meghiúsult."
diff --git a/po/id.gmo b/po/id.gmo
index 12c8b919..d7b9bcc7 100644
--- a/po/id.gmo
+++ b/po/id.gmo
Binary files differ
diff --git a/po/id.po b/po/id.po
index e4dbcabf..381bd160 100644
--- a/po/id.po
+++ b/po/id.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gst-plugins-good 1.1.4\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2014-05-03 18:00+0200\n"
+"POT-Creation-Date: 2014-05-21 12:10+0200\n"
"PO-Revision-Date: 2013-10-15 16:26+0700\n"
"Last-Translator: Andika Triwidada <andika@gmail.com>\n"
"Language-Team: Indonesian <translation-team-id@lists.sourceforge.net>\n"
@@ -255,9 +255,6 @@ msgstr "Tak bisa mendapatkan parameter di divais '%s'"
msgid "Video device did not accept new frame rate setting."
msgstr "Divais video tak menerima pengaturan laju bingkai baru."
-msgid "Video device could not create buffer pool."
-msgstr "Divais video tak bisa membuat pul singgahan."
-
#, fuzzy
msgid "Video device did not provide output format."
msgstr "Divais video tak menerima pengaturan laju bingkai baru."
@@ -272,6 +269,17 @@ msgstr "Driver dari divais '%s' tak mendukung metode IO %d"
msgid "Video devices uses an unsupported pixel format."
msgstr ""
+#, fuzzy
+msgid "Failed to configure internal buffer pool."
+msgstr "Divais video tak bisa membuat pul singgahan."
+
+#, fuzzy
+msgid "Video device did not suggest any buffer size."
+msgstr "Divais video tak bisa membuat pul singgahan."
+
+msgid "No downstream pool to import from."
+msgstr ""
+
#, c-format
msgid "Failed to get settings of tuner %d on device '%s'."
msgstr "Gagal mendapatkan pengaturan tuner %d di divais '%s'."
diff --git a/po/it.gmo b/po/it.gmo
index 5cb829e6..6236c121 100644
--- a/po/it.gmo
+++ b/po/it.gmo
Binary files differ
diff --git a/po/it.po b/po/it.po
index 31719c83..48e93f60 100644
--- a/po/it.po
+++ b/po/it.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gst-plugins-good 0.10.25.3\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2014-05-03 18:00+0200\n"
+"POT-Creation-Date: 2014-05-21 12:10+0200\n"
"PO-Revision-Date: 2010-10-25 10:11+0200\n"
"Last-Translator: Luca Ferretti <elle.uca@infinito.it>\n"
"Language-Team: Italian <tp@lists.linux.it>\n"
@@ -257,9 +257,6 @@ msgid "Video device did not accept new frame rate setting."
msgstr ""
"Il device di ingresso video non accetta la nuova impostazione sul frame rate."
-msgid "Video device could not create buffer pool."
-msgstr ""
-
#, fuzzy
msgid "Video device did not provide output format."
msgstr ""
@@ -275,6 +272,17 @@ msgstr "Il driver del device «%s» non supporta alcun metodo di cattura noto."
msgid "Video devices uses an unsupported pixel format."
msgstr ""
+msgid "Failed to configure internal buffer pool."
+msgstr ""
+
+#, fuzzy
+msgid "Video device did not suggest any buffer size."
+msgstr ""
+"Il device di ingresso video non accetta la nuova impostazione sul frame rate."
+
+msgid "No downstream pool to import from."
+msgstr ""
+
#, fuzzy, c-format
msgid "Failed to get settings of tuner %d on device '%s'."
msgstr ""
diff --git a/po/ja.gmo b/po/ja.gmo
index 138c6df7..dcf41d69 100644
--- a/po/ja.gmo
+++ b/po/ja.gmo
Binary files differ
diff --git a/po/ja.po b/po/ja.po
index a3b04440..5271debc 100644
--- a/po/ja.po
+++ b/po/ja.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gst-plugins-good 1.0.3\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2014-05-03 18:00+0200\n"
+"POT-Creation-Date: 2014-05-21 12:10+0200\n"
"PO-Revision-Date: 2012-12-22 20:13+0900\n"
"Last-Translator: Takeshi Hamasaki <hmatrjp@users.sourceforge.jp>\n"
"Language-Team: Japanese <translation-team-ja@lists.sourceforge.net>\n"
@@ -266,9 +266,6 @@ msgstr "デバイス '%s' 上のパラメータを取得できません。"
msgid "Video device did not accept new frame rate setting."
msgstr "ビデオデバイスが新しいフレームレート設定を受け付けません。"
-msgid "Video device could not create buffer pool."
-msgstr "ビデオデバイスはバッファプールを作成できませんでした。"
-
#, fuzzy
msgid "Video device did not provide output format."
msgstr "ビデオデバイスが新しいフレームレート設定を受け付けません。"
@@ -283,6 +280,17 @@ msgstr "デバイス '%s' のドライバはIOメソッド%dをサポートし
msgid "Video devices uses an unsupported pixel format."
msgstr ""
+#, fuzzy
+msgid "Failed to configure internal buffer pool."
+msgstr "ビデオデバイスはバッファプールを作成できませんでした。"
+
+#, fuzzy
+msgid "Video device did not suggest any buffer size."
+msgstr "ビデオデバイスはバッファプールを作成できませんでした。"
+
+msgid "No downstream pool to import from."
+msgstr ""
+
#, c-format
msgid "Failed to get settings of tuner %d on device '%s'."
msgstr "デバイス '%2$s' 上のチューナー %1$d の設定の取得に失敗しました。"
diff --git a/po/lt.gmo b/po/lt.gmo
index 1d2856ee..3b1b17f7 100644
--- a/po/lt.gmo
+++ b/po/lt.gmo
Binary files differ
diff --git a/po/lt.po b/po/lt.po
index ddbfee41..00307524 100644
--- a/po/lt.po
+++ b/po/lt.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gst-plugins-good 0.10.23.2\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2014-05-03 18:00+0200\n"
+"POT-Creation-Date: 2014-05-21 12:10+0200\n"
"PO-Revision-Date: 2010-07-16 19:34+0300\n"
"Last-Translator: Žygimantas Beručka <uid0@akl.lt>\n"
"Language-Team: Lithuanian <komp_lt@konferencijos.lt>\n"
@@ -255,9 +255,6 @@ msgstr "Nepavyko įrenginio „%s“ parametrų"
msgid "Video device did not accept new frame rate setting."
msgstr "Vaizdo įvesties įrenginys nepriėmė naujų kadrų dažnio nustatymų."
-msgid "Video device could not create buffer pool."
-msgstr ""
-
#, fuzzy
msgid "Video device did not provide output format."
msgstr "Vaizdo įvesties įrenginys nepriėmė naujų kadrų dažnio nustatymų."
@@ -272,6 +269,16 @@ msgstr "Įrenginio „%s“ tvarkyklė nepalaiko jokių žinomų įrašymo būd
msgid "Video devices uses an unsupported pixel format."
msgstr ""
+msgid "Failed to configure internal buffer pool."
+msgstr ""
+
+#, fuzzy
+msgid "Video device did not suggest any buffer size."
+msgstr "Vaizdo įvesties įrenginys nepriėmė naujų kadrų dažnio nustatymų."
+
+msgid "No downstream pool to import from."
+msgstr ""
+
#, fuzzy, c-format
msgid "Failed to get settings of tuner %d on device '%s'."
msgstr "Nepavyko gauti derintuvo %d įrenginyje „%s“ parametrų."
diff --git a/po/lv.gmo b/po/lv.gmo
index f0df0faa..da0df571 100644
--- a/po/lv.gmo
+++ b/po/lv.gmo
Binary files differ
diff --git a/po/lv.po b/po/lv.po
index 143eb0ec..54bcea0c 100644
--- a/po/lv.po
+++ b/po/lv.po
@@ -9,7 +9,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gst-plugins-good 1.2.1\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2014-05-03 18:00+0200\n"
+"POT-Creation-Date: 2014-05-21 12:10+0200\n"
"PO-Revision-Date: 2014-04-20 16:38+0300\n"
"Last-Translator: Rihards Prieditis <rprieditis@gmail.com>\n"
"Language-Team: Latvian <translation-team-lv@lists.sourceforge.net>\n"
@@ -253,9 +253,6 @@ msgstr "Nevar nolasīt parametrus no ierīces “%s”"
msgid "Video device did not accept new frame rate setting."
msgstr "Video ierīce nepieņēma jaunos kadru ātruma iestatījumus."
-msgid "Video device could not create buffer pool."
-msgstr "Video ierīce nevarēja izveidot bufera pūlu."
-
#, fuzzy
msgid "Video device did not provide output format."
msgstr "Video ierīce nepieņēma jaunos kadru ātruma iestatījumus."
@@ -270,6 +267,17 @@ msgstr "Ierīces \"%s\" draiveris neatbalsta IO metodi %d"
msgid "Video devices uses an unsupported pixel format."
msgstr ""
+#, fuzzy
+msgid "Failed to configure internal buffer pool."
+msgstr "Video ierīce nevarēja izveidot bufera pūlu."
+
+#, fuzzy
+msgid "Video device did not suggest any buffer size."
+msgstr "Video ierīce nevarēja izveidot bufera pūlu."
+
+msgid "No downstream pool to import from."
+msgstr ""
+
#, c-format
msgid "Failed to get settings of tuner %d on device '%s'."
msgstr "Neizdevās saņemt skaņotāja %d iestatījumus no ierīces “%s”."
diff --git a/po/mt.gmo b/po/mt.gmo
index 31e1e3f6..a9caed31 100644
--- a/po/mt.gmo
+++ b/po/mt.gmo
Binary files differ
diff --git a/po/mt.po b/po/mt.po
index 6bedda9d..bd52aa5e 100644
--- a/po/mt.po
+++ b/po/mt.po
@@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gst-plugins-good-0.10.10.3\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2014-05-03 18:00+0200\n"
+"POT-Creation-Date: 2014-05-21 12:10+0200\n"
"PO-Revision-Date: 2008-10-26 19:09+0100\n"
"Last-Translator: Michel Bugeja <michelbugeja@rabatmalta.com>\n"
"Language-Team: Maltese <translation-team-mt@lists.sourceforge.net>\n"
@@ -251,9 +251,6 @@ msgid "Video device did not accept new frame rate setting."
msgstr ""
"Apparat li jaqra video input ma aċċettax is-settings ġodda tal-frame rate."
-msgid "Video device could not create buffer pool."
-msgstr ""
-
#, fuzzy
msgid "Video device did not provide output format."
msgstr ""
@@ -270,6 +267,17 @@ msgstr ""
msgid "Video devices uses an unsupported pixel format."
msgstr ""
+msgid "Failed to configure internal buffer pool."
+msgstr ""
+
+#, fuzzy
+msgid "Video device did not suggest any buffer size."
+msgstr ""
+"Apparat li jaqra video input ma aċċettax is-settings ġodda tal-frame rate."
+
+msgid "No downstream pool to import from."
+msgstr ""
+
#, fuzzy, c-format
msgid "Failed to get settings of tuner %d on device '%s'."
msgstr "Problema biex inġib settings tat-tuner %d fuq l-appart '%s'"
diff --git a/po/nb.gmo b/po/nb.gmo
index 314bb07d..f01008f8 100644
--- a/po/nb.gmo
+++ b/po/nb.gmo
Binary files differ
diff --git a/po/nb.po b/po/nb.po
index b5cde954..41fc4cc3 100644
--- a/po/nb.po
+++ b/po/nb.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gst-plugins-good 1.2.1\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2014-05-03 18:00+0200\n"
+"POT-Creation-Date: 2014-05-21 12:10+0200\n"
"PO-Revision-Date: 2014-01-22 17:49+0100\n"
"Last-Translator: Johnny A. Solbu <johnny@solbu.net>\n"
"Language-Team: Norwegian Bokmaal <i18n-nb@lister.ping.uio.no>\n"
@@ -251,9 +251,6 @@ msgstr "Kunne ikke få parametere på enheten «%s»."
msgid "Video device did not accept new frame rate setting."
msgstr "Videoenheten aksepterte ikke ny bildefrekvensinnstilling."
-msgid "Video device could not create buffer pool."
-msgstr "Videoenhet kan ikke opprette bufferkø"
-
#, fuzzy
msgid "Video device did not provide output format."
msgstr "Videoenheten aksepterte ikke ny bildefrekvensinnstilling."
@@ -268,6 +265,17 @@ msgstr "Driveren av enheten «%s» støtter ikke IO metoden %d"
msgid "Video devices uses an unsupported pixel format."
msgstr ""
+#, fuzzy
+msgid "Failed to configure internal buffer pool."
+msgstr "Videoenhet kan ikke opprette bufferkø"
+
+#, fuzzy
+msgid "Video device did not suggest any buffer size."
+msgstr "Videoenhet kan ikke opprette bufferkø"
+
+msgid "No downstream pool to import from."
+msgstr ""
+
#, c-format
msgid "Failed to get settings of tuner %d on device '%s'."
msgstr "Kunne ikke hente innstillingene fra mottakeren %d på enheten «%s»."
diff --git a/po/nl.gmo b/po/nl.gmo
index d1615400..741a49b4 100644
--- a/po/nl.gmo
+++ b/po/nl.gmo
Binary files differ
diff --git a/po/nl.po b/po/nl.po
index e66923a1..c8024d8d 100644
--- a/po/nl.po
+++ b/po/nl.po
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gst-plugins-good 1.1.4\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2014-05-03 18:00+0200\n"
+"POT-Creation-Date: 2014-05-21 12:10+0200\n"
"PO-Revision-Date: 2013-09-15 13:31+0200\n"
"Last-Translator: Freek de Kruijf <f.de.kruijf@gmail.com>\n"
"Language-Team: Dutch <vertaling@vrijschrift.org>\n"
@@ -254,9 +254,6 @@ msgstr "Kan de parameters op apparaat '%s' niet verkrijgen"
msgid "Video device did not accept new frame rate setting."
msgstr "Videoapparaat heeft de nieuwe frame-snelheid niet geaccepteerd."
-msgid "Video device could not create buffer pool."
-msgstr "Videoapparaat kon geen bufferpool aanmaken."
-
#, fuzzy
msgid "Video device did not provide output format."
msgstr "Videoapparaat heeft de nieuwe frame-snelheid niet geaccepteerd."
@@ -271,6 +268,17 @@ msgstr "Het stuurprogramma van apparaat '%s' ondersteunt de IO-methode %d niet"
msgid "Video devices uses an unsupported pixel format."
msgstr ""
+#, fuzzy
+msgid "Failed to configure internal buffer pool."
+msgstr "Videoapparaat kon geen bufferpool aanmaken."
+
+#, fuzzy
+msgid "Video device did not suggest any buffer size."
+msgstr "Videoapparaat kon geen bufferpool aanmaken."
+
+msgid "No downstream pool to import from."
+msgstr ""
+
#, c-format
msgid "Failed to get settings of tuner %d on device '%s'."
msgstr "Instellingen van tuner %d op apparaat '%s' ophalen is mislukt."
diff --git a/po/or.gmo b/po/or.gmo
index a46d03b0..436d886b 100644
--- a/po/or.gmo
+++ b/po/or.gmo
Binary files differ
diff --git a/po/or.po b/po/or.po
index 554f6812..c5b0ea1e 100644
--- a/po/or.po
+++ b/po/or.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gst-plugins-0.8.3\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2014-05-03 18:00+0200\n"
+"POT-Creation-Date: 2014-05-21 12:10+0200\n"
"PO-Revision-Date: 2004-09-27 13:32+0530\n"
"Last-Translator: Gora Mohanty <gora_mohanty@yahoo.co.in>\n"
"Language-Team: Oriya <gora_mohanty@yahoo.co.in>\n"
@@ -248,9 +248,6 @@ msgstr "\"%s\" ଯନ୍ତ୍ରରୁ ଅସ୍ଥାୟୀ ସଞ୍ଚୟ
msgid "Video device did not accept new frame rate setting."
msgstr ""
-msgid "Video device could not create buffer pool."
-msgstr ""
-
msgid "Video device did not provide output format."
msgstr ""
@@ -263,6 +260,15 @@ msgstr ""
msgid "Video devices uses an unsupported pixel format."
msgstr ""
+msgid "Failed to configure internal buffer pool."
+msgstr ""
+
+msgid "Video device did not suggest any buffer size."
+msgstr ""
+
+msgid "No downstream pool to import from."
+msgstr ""
+
#, fuzzy, c-format
msgid "Failed to get settings of tuner %d on device '%s'."
msgstr "\"%s\" ଯନ୍ତ୍ରରୁ ପର୍ଯ୍ଯାପ୍ତ ଅସ୍ଥାୟୀ ସଞ୍ଚୟ ସ୍ଥାନ ଆଣିହେଲା ନାହିଁ."
diff --git a/po/pl.gmo b/po/pl.gmo
index 92c727f0..28711628 100644
--- a/po/pl.gmo
+++ b/po/pl.gmo
Binary files differ
diff --git a/po/pl.po b/po/pl.po
index ae70fe2c..831975ef 100644
--- a/po/pl.po
+++ b/po/pl.po
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gst-plugins-good 1.1.4\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2014-05-03 18:00+0200\n"
+"POT-Creation-Date: 2014-05-21 12:10+0200\n"
"PO-Revision-Date: 2013-09-15 11:26+0200\n"
"Last-Translator: Jakub Bogusz <qboosh@pld-linux.org>\n"
"Language-Team: Polish <translation-team-pl@lists.sourceforge.net>\n"
@@ -252,9 +252,6 @@ msgid "Video device did not accept new frame rate setting."
msgstr ""
"Urządzenie obrazu nie przyjęło nowego ustawienia częstotliwości klatek."
-msgid "Video device could not create buffer pool."
-msgstr "Urzędzenie obrazu nie mogło utworzyć puli buforów."
-
#, fuzzy
msgid "Video device did not provide output format."
msgstr ""
@@ -270,6 +267,17 @@ msgstr "Sterownik urządzenia '%s' nie obsługuje metody we/wy %d"
msgid "Video devices uses an unsupported pixel format."
msgstr ""
+#, fuzzy
+msgid "Failed to configure internal buffer pool."
+msgstr "Urzędzenie obrazu nie mogło utworzyć puli buforów."
+
+#, fuzzy
+msgid "Video device did not suggest any buffer size."
+msgstr "Urzędzenie obrazu nie mogło utworzyć puli buforów."
+
+msgid "No downstream pool to import from."
+msgstr ""
+
#, c-format
msgid "Failed to get settings of tuner %d on device '%s'."
msgstr "Nie udało się uzyskać ustawień tunera %d urządzenia '%s'."
diff --git a/po/pt_BR.gmo b/po/pt_BR.gmo
index eba14c51..d2b1905b 100644
--- a/po/pt_BR.gmo
+++ b/po/pt_BR.gmo
Binary files differ
diff --git a/po/pt_BR.po b/po/pt_BR.po
index edd0c130..6f168530 100644
--- a/po/pt_BR.po
+++ b/po/pt_BR.po
@@ -11,7 +11,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gst-plugins-good-1.2.1\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2014-05-03 18:00+0200\n"
+"POT-Creation-Date: 2014-05-21 12:10+0200\n"
"PO-Revision-Date: 2013-12-29 17:48-0200\n"
"Last-Translator: Fabrício Godoy <skarllot@gmail.com>\n"
"Language-Team: Brazilian Portuguese <ldpbr-translation@lists.sourceforge."
@@ -262,9 +262,6 @@ msgstr "Não foi possível obter os parâmetros no dispositivo \"%s\""
msgid "Video device did not accept new frame rate setting."
msgstr "O dispositivo de vídeo não aceita definir uma nova taxa de quadros."
-msgid "Video device could not create buffer pool."
-msgstr "O dispositivo de vídeo não pôde reservar um buffer."
-
#, fuzzy
msgid "Video device did not provide output format."
msgstr "O dispositivo de vídeo não aceita definir uma nova taxa de quadros."
@@ -279,6 +276,17 @@ msgstr "O driver do dispositivo \"%s\" não tem suporte ao método %d de E/S"
msgid "Video devices uses an unsupported pixel format."
msgstr ""
+#, fuzzy
+msgid "Failed to configure internal buffer pool."
+msgstr "O dispositivo de vídeo não pôde reservar um buffer."
+
+#, fuzzy
+msgid "Video device did not suggest any buffer size."
+msgstr "O dispositivo de vídeo não pôde reservar um buffer."
+
+msgid "No downstream pool to import from."
+msgstr ""
+
#, c-format
msgid "Failed to get settings of tuner %d on device '%s'."
msgstr "Falha ao obter configurações do sintonizador %d no dispositivo \"%s\"."
diff --git a/po/ro.gmo b/po/ro.gmo
index 6f2078a3..62b216a4 100644
--- a/po/ro.gmo
+++ b/po/ro.gmo
Binary files differ
diff --git a/po/ro.po b/po/ro.po
index 8627528e..9821052d 100644
--- a/po/ro.po
+++ b/po/ro.po
@@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gst-plugins-good 0.10.23.2\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2014-05-03 18:00+0200\n"
+"POT-Creation-Date: 2014-05-21 12:10+0200\n"
"PO-Revision-Date: 2010-08-16 03:22+0300\n"
"Last-Translator: Lucian Adrian Grijincu <lucian.grijincu@gmail.com>\n"
"Language-Team: Romanian <translation-team-ro@lists.sourceforge.net>\n"
@@ -262,9 +262,6 @@ msgid "Video device did not accept new frame rate setting."
msgstr ""
"Dispozitivul de intrare video nu a acceptat noua configurare de rate cadre."
-msgid "Video device could not create buffer pool."
-msgstr ""
-
#, fuzzy
msgid "Video device did not provide output format."
msgstr ""
@@ -282,6 +279,17 @@ msgstr ""
msgid "Video devices uses an unsupported pixel format."
msgstr ""
+msgid "Failed to configure internal buffer pool."
+msgstr ""
+
+#, fuzzy
+msgid "Video device did not suggest any buffer size."
+msgstr ""
+"Dispozitivul de intrare video nu a acceptat noua configurare de rate cadre."
+
+msgid "No downstream pool to import from."
+msgstr ""
+
#, fuzzy, c-format
msgid "Failed to get settings of tuner %d on device '%s'."
msgstr ""
diff --git a/po/ru.gmo b/po/ru.gmo
index fc79f5f1..def8c09f 100644
--- a/po/ru.gmo
+++ b/po/ru.gmo
Binary files differ
diff --git a/po/ru.po b/po/ru.po
index e192a1cb..6176f554 100644
--- a/po/ru.po
+++ b/po/ru.po
@@ -9,7 +9,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gst-plugins-good 1.2.1\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2014-05-03 18:00+0200\n"
+"POT-Creation-Date: 2014-05-21 12:10+0200\n"
"PO-Revision-Date: 2013-12-08 12:55+0400\n"
"Last-Translator: Yuri Kozlov <yuray@komyakino.ru>\n"
"Language-Team: Russian <gnu@mx.ru>\n"
@@ -262,9 +262,6 @@ msgstr "Не удалось получить параметры устройст
msgid "Video device did not accept new frame rate setting."
msgstr "Видео-устройство не приняло новое значение настройки кадровой частоты."
-msgid "Video device could not create buffer pool."
-msgstr "Видео-устройство не может создать буферный пул."
-
#, fuzzy
msgid "Video device did not provide output format."
msgstr "Видео-устройство не приняло новое значение настройки кадровой частоты."
@@ -279,6 +276,17 @@ msgstr "Драйвер устройства «%s» не поддерживает
msgid "Video devices uses an unsupported pixel format."
msgstr ""
+#, fuzzy
+msgid "Failed to configure internal buffer pool."
+msgstr "Видео-устройство не может создать буферный пул."
+
+#, fuzzy
+msgid "Video device did not suggest any buffer size."
+msgstr "Видео-устройство не может создать буферный пул."
+
+msgid "No downstream pool to import from."
+msgstr ""
+
#, c-format
msgid "Failed to get settings of tuner %d on device '%s'."
msgstr "Не удалось получить настройки тюнера %d устройства «%s»."
diff --git a/po/sk.gmo b/po/sk.gmo
index 809c909d..2f9cedf8 100644
--- a/po/sk.gmo
+++ b/po/sk.gmo
Binary files differ
diff --git a/po/sk.po b/po/sk.po
index 21c306b2..3f37ae0c 100644
--- a/po/sk.po
+++ b/po/sk.po
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gst-plugins-good 1.2.1\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2014-05-03 18:00+0200\n"
+"POT-Creation-Date: 2014-05-21 12:10+0200\n"
"PO-Revision-Date: 2014-01-30 11:08+0100\n"
"Last-Translator: Peter Tuharsky <tuharsky@misbb.sk>\n"
"Language-Team: Slovak <sk-i18n@lists.linux.sk>\n"
@@ -254,9 +254,6 @@ msgstr "Nepodarilo sa získať parametre zariadenia '%s'"
msgid "Video device did not accept new frame rate setting."
msgstr "Video zariadenie odmietlo nové nastavenie frekvencie snímok."
-msgid "Video device could not create buffer pool."
-msgstr "Video zariadenie nemohlo vytvoriť oblasť vyrovnávacej pamäte."
-
#, fuzzy
msgid "Video device did not provide output format."
msgstr "Video zariadenie odmietlo nové nastavenie frekvencie snímok."
@@ -271,6 +268,17 @@ msgstr "Tento ovládač zariadenia '%s' nepodporuje IO metódu %d"
msgid "Video devices uses an unsupported pixel format."
msgstr ""
+#, fuzzy
+msgid "Failed to configure internal buffer pool."
+msgstr "Video zariadenie nemohlo vytvoriť oblasť vyrovnávacej pamäte."
+
+#, fuzzy
+msgid "Video device did not suggest any buffer size."
+msgstr "Video zariadenie nemohlo vytvoriť oblasť vyrovnávacej pamäte."
+
+msgid "No downstream pool to import from."
+msgstr ""
+
#, c-format
msgid "Failed to get settings of tuner %d on device '%s'."
msgstr "Nepodarilo sa získať nastavenie prijímača %d od zariadenia '%s'."
diff --git a/po/sl.gmo b/po/sl.gmo
index efa9a38e..a3ae907f 100644
--- a/po/sl.gmo
+++ b/po/sl.gmo
Binary files differ
diff --git a/po/sl.po b/po/sl.po
index b628aa4d..a581fed7 100644
--- a/po/sl.po
+++ b/po/sl.po
@@ -10,7 +10,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gst-plugins-good-1.2.1\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2014-05-03 18:00+0200\n"
+"POT-Creation-Date: 2014-05-21 12:10+0200\n"
"PO-Revision-Date: 2014-04-09 22:52+0100\n"
"Last-Translator: Klemen Košir <klemen913@gmail.com>\n"
"Language-Team: Slovenian <translation-team-sl@lists.sourceforge.net>\n"
@@ -256,9 +256,6 @@ msgstr "Ni mogoče pridobiti parametrov na napravi '%s'."
msgid "Video device did not accept new frame rate setting."
msgstr "Napravi ni mogoče določiti novih nastavitev hitrosti sličic."
-msgid "Video device could not create buffer pool."
-msgstr "Naprava ne more ustvariti zaloge medpomnilnika."
-
#, fuzzy
msgid "Video device did not provide output format."
msgstr "Napravi ni mogoče določiti novih nastavitev hitrosti sličic."
@@ -273,6 +270,17 @@ msgstr "Gonilnik naprave \"%s\" ne podpira nobenega načina I/O %d."
msgid "Video devices uses an unsupported pixel format."
msgstr ""
+#, fuzzy
+msgid "Failed to configure internal buffer pool."
+msgstr "Naprava ne more ustvariti zaloge medpomnilnika."
+
+#, fuzzy
+msgid "Video device did not suggest any buffer size."
+msgstr "Naprava ne more ustvariti zaloge medpomnilnika."
+
+msgid "No downstream pool to import from."
+msgstr ""
+
#, c-format
msgid "Failed to get settings of tuner %d on device '%s'."
msgstr ""
diff --git a/po/sq.gmo b/po/sq.gmo
index 5fc4d274..6e62dd08 100644
--- a/po/sq.gmo
+++ b/po/sq.gmo
Binary files differ
diff --git a/po/sq.po b/po/sq.po
index 71792c61..2061e2be 100644
--- a/po/sq.po
+++ b/po/sq.po
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gst-plugins 0.8.3\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2014-05-03 18:00+0200\n"
+"POT-Creation-Date: 2014-05-21 12:10+0200\n"
"PO-Revision-Date: 2004-08-07 20:29+0200\n"
"Last-Translator: Laurent Dhima <laurenti@alblinux.net>\n"
"Language-Team: Albanian <begraj@hotmail.com>\n"
@@ -244,9 +244,6 @@ msgstr "E pamundur marrja e buffers nga dispozitivi \"%s\"."
msgid "Video device did not accept new frame rate setting."
msgstr ""
-msgid "Video device could not create buffer pool."
-msgstr ""
-
msgid "Video device did not provide output format."
msgstr ""
@@ -259,6 +256,15 @@ msgstr ""
msgid "Video devices uses an unsupported pixel format."
msgstr ""
+msgid "Failed to configure internal buffer pool."
+msgstr ""
+
+msgid "Video device did not suggest any buffer size."
+msgstr ""
+
+msgid "No downstream pool to import from."
+msgstr ""
+
#, fuzzy, c-format
msgid "Failed to get settings of tuner %d on device '%s'."
msgstr "E pamundur marrja e buffers të mjaftueshëm nga dispozitivi \"%s\"."
diff --git a/po/sr.gmo b/po/sr.gmo
index d431335f..7c05ceb7 100644
--- a/po/sr.gmo
+++ b/po/sr.gmo
Binary files differ
diff --git a/po/sr.po b/po/sr.po
index b92f8947..0658a7cd 100644
--- a/po/sr.po
+++ b/po/sr.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gst-plugins-good-1.1.4\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2014-05-03 18:00+0200\n"
+"POT-Creation-Date: 2014-05-21 12:10+0200\n"
"PO-Revision-Date: 2013-10-04 12:15+0200\n"
"Last-Translator: Мирослав Николић <miroslavnikolic@rocketmail.com>\n"
"Language-Team: Serbian <(nothing)>\n"
@@ -255,9 +255,6 @@ msgstr "Не могу да добавим параметре на уређају
msgid "Video device did not accept new frame rate setting."
msgstr "Видео уређај не прихвата нове поставке протока кадрова."
-msgid "Video device could not create buffer pool."
-msgstr "Видео уређај не може да направи смештај међумеморије."
-
#, fuzzy
msgid "Video device did not provide output format."
msgstr "Видео уређај не прихвата нове поставке протока кадрова."
@@ -272,6 +269,17 @@ msgstr "Управљачки програм уређаја „%s“ не под
msgid "Video devices uses an unsupported pixel format."
msgstr ""
+#, fuzzy
+msgid "Failed to configure internal buffer pool."
+msgstr "Видео уређај не може да направи смештај међумеморије."
+
+#, fuzzy
+msgid "Video device did not suggest any buffer size."
+msgstr "Видео уређај не може да направи смештај међумеморије."
+
+msgid "No downstream pool to import from."
+msgstr ""
+
#, c-format
msgid "Failed to get settings of tuner %d on device '%s'."
msgstr "Нисам успео да добавим подешавања тјунера %d на уређају „%s“."
diff --git a/po/sv.gmo b/po/sv.gmo
index fc90dbee..4d4fcb67 100644
--- a/po/sv.gmo
+++ b/po/sv.gmo
Binary files differ
diff --git a/po/sv.po b/po/sv.po
index 2e521128..4a36f3ee 100644
--- a/po/sv.po
+++ b/po/sv.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gst-plugins-good 0.10.26.2\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2014-05-03 18:00+0200\n"
+"POT-Creation-Date: 2014-05-21 12:10+0200\n"
"PO-Revision-Date: 2011-01-09 19:36+0100\n"
"Last-Translator: Daniel Nylander <po@danielnylander.se>\n"
"Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n"
@@ -256,9 +256,6 @@ msgstr "Kunde inte få tag i parametrar på enheten \"%s\""
msgid "Video device did not accept new frame rate setting."
msgstr "Videoingångsenheten accepterade inte ny inställning för bildfrekvens."
-msgid "Video device could not create buffer pool."
-msgstr ""
-
#, fuzzy
msgid "Video device did not provide output format."
msgstr "Videoingångsenheten accepterade inte ny inställning för bildfrekvens."
@@ -273,6 +270,16 @@ msgstr "Drivrutinen för enheten \"%s\" saknar stöd för någon känd fångstme
msgid "Video devices uses an unsupported pixel format."
msgstr ""
+msgid "Failed to configure internal buffer pool."
+msgstr ""
+
+#, fuzzy
+msgid "Video device did not suggest any buffer size."
+msgstr "Videoingångsenheten accepterade inte ny inställning för bildfrekvens."
+
+msgid "No downstream pool to import from."
+msgstr ""
+
#, fuzzy, c-format
msgid "Failed to get settings of tuner %d on device '%s'."
msgstr ""
diff --git a/po/tr.gmo b/po/tr.gmo
index 0888d365..bb266c55 100644
--- a/po/tr.gmo
+++ b/po/tr.gmo
Binary files differ
diff --git a/po/tr.po b/po/tr.po
index f38fa900..13d74624 100644
--- a/po/tr.po
+++ b/po/tr.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gst-plugins-good 1.0.3\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2014-05-03 18:00+0200\n"
+"POT-Creation-Date: 2014-05-21 12:10+0200\n"
"PO-Revision-Date: 2013-03-10 13:05+0200\n"
"Last-Translator: Server Acim <serveracim@gmail.com>\n"
"Language-Team: Turkish <gnu-tr-u12a@lists.sourceforge.net>\n"
@@ -250,9 +250,6 @@ msgstr "Değiştirgeler aygıttan '%s' alınamıyor"
msgid "Video device did not accept new frame rate setting."
msgstr "Vidyo aygıtı yeni çerçeve oranı ayarlarını kabul etmedi."
-msgid "Video device could not create buffer pool."
-msgstr "Video aygıtı tampon havuzu yaratamadı."
-
#, fuzzy
msgid "Video device did not provide output format."
msgstr "Vidyo aygıtı yeni çerçeve oranı ayarlarını kabul etmedi."
@@ -267,6 +264,17 @@ msgstr "Bu aygıtın sürücüsü '%s' IO yöntemini desteklemiyor %d"
msgid "Video devices uses an unsupported pixel format."
msgstr ""
+#, fuzzy
+msgid "Failed to configure internal buffer pool."
+msgstr "Video aygıtı tampon havuzu yaratamadı."
+
+#, fuzzy
+msgid "Video device did not suggest any buffer size."
+msgstr "Video aygıtı tampon havuzu yaratamadı."
+
+msgid "No downstream pool to import from."
+msgstr ""
+
#, c-format
msgid "Failed to get settings of tuner %d on device '%s'."
msgstr "İstasyon ayarlarını bulma işlemi %d şu aygıtta '%s' başarılamadı."
diff --git a/po/uk.gmo b/po/uk.gmo
index 53dbcb15..8d0b0289 100644
--- a/po/uk.gmo
+++ b/po/uk.gmo
Binary files differ
diff --git a/po/uk.po b/po/uk.po
index 0befc669..5f808119 100644
--- a/po/uk.po
+++ b/po/uk.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gst-plugins-good 1.1.4\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2014-05-03 18:00+0200\n"
+"POT-Creation-Date: 2014-05-21 12:10+0200\n"
"PO-Revision-Date: 2013-09-14 22:23+0300\n"
"Last-Translator: Yuri Chornoivan <yurchor@ukr.net>\n"
"Language-Team: Ukrainian <translation-team-uk@lists.sourceforge.net>\n"
@@ -263,9 +263,6 @@ msgid "Video device did not accept new frame rate setting."
msgstr ""
"Відеопристроєм не підтримується нове значення параметра частоти кадрів."
-msgid "Video device could not create buffer pool."
-msgstr "Відеопристрою не вдалося створити сховище буферизованих даних."
-
#, fuzzy
msgid "Video device did not provide output format."
msgstr ""
@@ -281,6 +278,17 @@ msgstr "Драйвер пристрою «%s» не підтримує мето
msgid "Video devices uses an unsupported pixel format."
msgstr ""
+#, fuzzy
+msgid "Failed to configure internal buffer pool."
+msgstr "Відеопристрою не вдалося створити сховище буферизованих даних."
+
+#, fuzzy
+msgid "Video device did not suggest any buffer size."
+msgstr "Відеопристрою не вдалося створити сховище буферизованих даних."
+
+msgid "No downstream pool to import from."
+msgstr ""
+
#, c-format
msgid "Failed to get settings of tuner %d on device '%s'."
msgstr "Помилка під час спроби отримання даних щодо приймача %d пристрою «%s»."
diff --git a/po/vi.gmo b/po/vi.gmo
index 43b38374..fc8ae940 100644
--- a/po/vi.gmo
+++ b/po/vi.gmo
Binary files differ
diff --git a/po/vi.po b/po/vi.po
index 236e0cd9..2172b42a 100644
--- a/po/vi.po
+++ b/po/vi.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gst-plugins-good-1.1.4\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2014-05-03 18:00+0200\n"
+"POT-Creation-Date: 2014-05-21 12:10+0200\n"
"PO-Revision-Date: 2013-09-16 14:36+0700\n"
"Last-Translator: Trần Ngọc Quân <vnwildman@gmail.com>\n"
"Language-Team: Vietnamese <translation-team-vi@lists.sourceforge.net>\n"
@@ -259,9 +259,6 @@ msgstr "Không thể lấy các tham số về thiết bị “%s”."
msgid "Video device did not accept new frame rate setting."
msgstr "Thiết bị video không chấp nhận cài đặt về tốc độ khung hình mới."
-msgid "Video device could not create buffer pool."
-msgstr "Thiết bị video không thể tạo kho đệm."
-
#, fuzzy
msgid "Video device did not provide output format."
msgstr "Thiết bị video không chấp nhận cài đặt về tốc độ khung hình mới."
@@ -276,6 +273,17 @@ msgstr "Trình điều khiển của thiết bị “%s” không hỗ trợ ph
msgid "Video devices uses an unsupported pixel format."
msgstr ""
+#, fuzzy
+msgid "Failed to configure internal buffer pool."
+msgstr "Thiết bị video không thể tạo kho đệm."
+
+#, fuzzy
+msgid "Video device did not suggest any buffer size."
+msgstr "Thiết bị video không thể tạo kho đệm."
+
+msgid "No downstream pool to import from."
+msgstr ""
+
#, c-format
msgid "Failed to get settings of tuner %d on device '%s'."
msgstr ""
diff --git a/po/zh_CN.gmo b/po/zh_CN.gmo
index ae6e9df4..c6816cf9 100644
--- a/po/zh_CN.gmo
+++ b/po/zh_CN.gmo
Binary files differ
diff --git a/po/zh_CN.po b/po/zh_CN.po
index eb271955..11275154 100644
--- a/po/zh_CN.po
+++ b/po/zh_CN.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gst-plugins-good 0.10.16.2\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2014-05-03 18:00+0200\n"
+"POT-Creation-Date: 2014-05-21 12:10+0200\n"
"PO-Revision-Date: 2009-11-13 22:20+0800\n"
"Last-Translator: Ji ZhengYu <zhengyuji@gmail.com>\n"
"Language-Team: Chinese (simplified) <i18n-zh@googlegroups.com>\n"
@@ -251,9 +251,6 @@ msgstr "无法获取设备‘%s’的参数"
msgid "Video device did not accept new frame rate setting."
msgstr "视频输入设备不接受新的帧率设置。"
-msgid "Video device could not create buffer pool."
-msgstr ""
-
#, fuzzy
msgid "Video device did not provide output format."
msgstr "视频输入设备不接受新的帧率设置。"
@@ -267,6 +264,16 @@ msgstr ""
msgid "Video devices uses an unsupported pixel format."
msgstr ""
+msgid "Failed to configure internal buffer pool."
+msgstr ""
+
+#, fuzzy
+msgid "Video device did not suggest any buffer size."
+msgstr "视频输入设备不接受新的帧率设置。"
+
+msgid "No downstream pool to import from."
+msgstr ""
+
#, fuzzy, c-format
msgid "Failed to get settings of tuner %d on device '%s'."
msgstr "获取设备 %2$s 上的微调钮 %1$d 的设置时出错"
diff --git a/po/zh_HK.gmo b/po/zh_HK.gmo
index 61147f40..c7c60a99 100644
--- a/po/zh_HK.gmo
+++ b/po/zh_HK.gmo
Binary files differ
diff --git a/po/zh_HK.po b/po/zh_HK.po
index 132f0dd8..bd7bf836 100644
--- a/po/zh_HK.po
+++ b/po/zh_HK.po
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gst-plugins-good-0.10.2 0.10.2\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2014-05-03 18:00+0200\n"
+"POT-Creation-Date: 2014-05-21 12:10+0200\n"
"PO-Revision-Date: 2006-08-29 01:08+0800\n"
"Last-Translator: Abel Cheung <abelcheung@gmail.com>\n"
"Language-Team: Chinese (Hong Kong) <community@linuxhall.org>\n"
@@ -239,9 +239,6 @@ msgstr ""
msgid "Video device did not accept new frame rate setting."
msgstr ""
-msgid "Video device could not create buffer pool."
-msgstr ""
-
msgid "Video device did not provide output format."
msgstr ""
@@ -254,6 +251,15 @@ msgstr ""
msgid "Video devices uses an unsupported pixel format."
msgstr ""
+msgid "Failed to configure internal buffer pool."
+msgstr ""
+
+msgid "Video device did not suggest any buffer size."
+msgstr ""
+
+msgid "No downstream pool to import from."
+msgstr ""
+
#, c-format
msgid "Failed to get settings of tuner %d on device '%s'."
msgstr ""
diff --git a/po/zh_TW.gmo b/po/zh_TW.gmo
index 6cef7b21..b1af7483 100644
--- a/po/zh_TW.gmo
+++ b/po/zh_TW.gmo
Binary files differ
diff --git a/po/zh_TW.po b/po/zh_TW.po
index 8369c2d1..1e82da2c 100644
--- a/po/zh_TW.po
+++ b/po/zh_TW.po
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: gst-plugins-good-0.10.2 0.10.2\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2014-05-03 18:00+0200\n"
+"POT-Creation-Date: 2014-05-21 12:10+0200\n"
"PO-Revision-Date: 2006-08-29 01:08+0800\n"
"Last-Translator: Abel Cheung <abelcheung@gmail.com>\n"
"Language-Team: Chinese (traditional) <zh-l10n@linux.org.tw>\n"
@@ -239,9 +239,6 @@ msgstr ""
msgid "Video device did not accept new frame rate setting."
msgstr ""
-msgid "Video device could not create buffer pool."
-msgstr ""
-
msgid "Video device did not provide output format."
msgstr ""
@@ -254,6 +251,15 @@ msgstr ""
msgid "Video devices uses an unsupported pixel format."
msgstr ""
+msgid "Failed to configure internal buffer pool."
+msgstr ""
+
+msgid "Video device did not suggest any buffer size."
+msgstr ""
+
+msgid "No downstream pool to import from."
+msgstr ""
+
#, c-format
msgid "Failed to get settings of tuner %d on device '%s'."
msgstr ""
diff --git a/sys/Makefile.in b/sys/Makefile.in
index b8c435cd..927c652d 100644
--- a/sys/Makefile.in
+++ b/sys/Makefile.in
@@ -113,6 +113,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/sys/directsound/Makefile.in b/sys/directsound/Makefile.in
index 6ff8d4bc..fdcbd57a 100644
--- a/sys/directsound/Makefile.in
+++ b/sys/directsound/Makefile.in
@@ -104,6 +104,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/sys/oss/Makefile.in b/sys/oss/Makefile.in
index 823f7dbb..9e8ca19c 100644
--- a/sys/oss/Makefile.in
+++ b/sys/oss/Makefile.in
@@ -104,6 +104,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/sys/oss4/Makefile.in b/sys/oss4/Makefile.in
index c48d0b2a..6dc568ec 100644
--- a/sys/oss4/Makefile.in
+++ b/sys/oss4/Makefile.in
@@ -104,6 +104,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/sys/osxaudio/Makefile.in b/sys/osxaudio/Makefile.in
index 3ba5028c..25d02ac6 100644
--- a/sys/osxaudio/Makefile.in
+++ b/sys/osxaudio/Makefile.in
@@ -105,6 +105,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/sys/osxvideo/Makefile.in b/sys/osxvideo/Makefile.in
index 70f5440f..08201a6a 100644
--- a/sys/osxvideo/Makefile.in
+++ b/sys/osxvideo/Makefile.in
@@ -104,6 +104,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/sys/sunaudio/Makefile.in b/sys/sunaudio/Makefile.in
index cbcf4f83..cae03423 100644
--- a/sys/sunaudio/Makefile.in
+++ b/sys/sunaudio/Makefile.in
@@ -104,6 +104,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/sys/v4l2/Makefile.am b/sys/v4l2/Makefile.am
index dfde1f6c..061609ee 100644
--- a/sys/v4l2/Makefile.am
+++ b/sys/v4l2/Makefile.am
@@ -3,6 +3,7 @@ plugin_LTLIBRARIES = libgstvideo4linux2.la
include $(top_srcdir)/common/gst-glib-gen.mak
libgstvideo4linux2_la_SOURCES = gstv4l2.c \
+ gstv4l2allocator.c \
gstv4l2colorbalance.c \
gstv4l2devicemonitor.c \
gstv4l2object.c \
@@ -11,9 +12,11 @@ libgstvideo4linux2_la_SOURCES = gstv4l2.c \
gstv4l2src.c \
gstv4l2radio.c \
gstv4l2tuner.c \
+ gstv4l2transform.c \
gstv4l2videodec.c \
gstv4l2vidorient.c \
v4l2_calls.c \
+ v4l2-utils.c \
tuner.c \
tunerchannel.c \
tunernorm.c
@@ -41,6 +44,7 @@ noinst_HEADERS = \
ext/v4l2-common.h \
ext/v4l2-controls.h \
ext/videodev2.h \
+ gstv4l2allocator.h \
gstv4l2bufferpool.h \
gstv4l2colorbalance.h \
gstv4l2devicemonitor.h \
@@ -49,9 +53,11 @@ noinst_HEADERS = \
gstv4l2src.h \
gstv4l2radio.h \
gstv4l2tuner.h \
+ gstv4l2transform.h \
gstv4l2videodec.h \
gstv4l2vidorient.h \
v4l2_calls.h \
+ v4l2-utils.h \
tuner.h \
tunerchannel.h \
tunernorm.h
diff --git a/sys/v4l2/Makefile.in b/sys/v4l2/Makefile.in
index 3621e8c8..d1269344 100644
--- a/sys/v4l2/Makefile.in
+++ b/sys/v4l2/Makefile.in
@@ -113,6 +113,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
@@ -166,6 +167,7 @@ libgstvideo4linux2_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \
$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
$(am__DEPENDENCIES_1)
am_libgstvideo4linux2_la_OBJECTS = libgstvideo4linux2_la-gstv4l2.lo \
+ libgstvideo4linux2_la-gstv4l2allocator.lo \
libgstvideo4linux2_la-gstv4l2colorbalance.lo \
libgstvideo4linux2_la-gstv4l2devicemonitor.lo \
libgstvideo4linux2_la-gstv4l2object.lo \
@@ -174,9 +176,11 @@ am_libgstvideo4linux2_la_OBJECTS = libgstvideo4linux2_la-gstv4l2.lo \
libgstvideo4linux2_la-gstv4l2src.lo \
libgstvideo4linux2_la-gstv4l2radio.lo \
libgstvideo4linux2_la-gstv4l2tuner.lo \
+ libgstvideo4linux2_la-gstv4l2transform.lo \
libgstvideo4linux2_la-gstv4l2videodec.lo \
libgstvideo4linux2_la-gstv4l2vidorient.lo \
libgstvideo4linux2_la-v4l2_calls.lo \
+ libgstvideo4linux2_la-v4l2-utils.lo \
libgstvideo4linux2_la-tuner.lo \
libgstvideo4linux2_la-tunerchannel.lo \
libgstvideo4linux2_la-tunernorm.lo
@@ -580,6 +584,7 @@ top_srcdir = @top_srcdir@
plugin_LTLIBRARIES = libgstvideo4linux2.la
enum_headers = $(foreach h,$(glib_enum_headers),\n\#include \"$(h)\")
libgstvideo4linux2_la_SOURCES = gstv4l2.c \
+ gstv4l2allocator.c \
gstv4l2colorbalance.c \
gstv4l2devicemonitor.c \
gstv4l2object.c \
@@ -588,9 +593,11 @@ libgstvideo4linux2_la_SOURCES = gstv4l2.c \
gstv4l2src.c \
gstv4l2radio.c \
gstv4l2tuner.c \
+ gstv4l2transform.c \
gstv4l2videodec.c \
gstv4l2vidorient.c \
v4l2_calls.c \
+ v4l2-utils.c \
tuner.c \
tunerchannel.c \
tunernorm.c
@@ -618,6 +625,7 @@ noinst_HEADERS = \
ext/v4l2-common.h \
ext/v4l2-controls.h \
ext/videodev2.h \
+ gstv4l2allocator.h \
gstv4l2bufferpool.h \
gstv4l2colorbalance.h \
gstv4l2devicemonitor.h \
@@ -626,9 +634,11 @@ noinst_HEADERS = \
gstv4l2src.h \
gstv4l2radio.h \
gstv4l2tuner.h \
+ gstv4l2transform.h \
gstv4l2videodec.h \
gstv4l2vidorient.h \
v4l2_calls.h \
+ v4l2-utils.h \
tuner.h \
tunerchannel.h \
tunernorm.h
@@ -714,6 +724,7 @@ distclean-compile:
-rm -f *.tab.c
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideo4linux2_la-gstv4l2.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideo4linux2_la-gstv4l2allocator.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideo4linux2_la-gstv4l2bufferpool.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideo4linux2_la-gstv4l2colorbalance.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideo4linux2_la-gstv4l2devicemonitor.Plo@am__quote@
@@ -721,12 +732,14 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideo4linux2_la-gstv4l2radio.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideo4linux2_la-gstv4l2sink.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideo4linux2_la-gstv4l2src.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideo4linux2_la-gstv4l2transform.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideo4linux2_la-gstv4l2tuner.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideo4linux2_la-gstv4l2videodec.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideo4linux2_la-gstv4l2vidorient.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideo4linux2_la-tuner.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideo4linux2_la-tunerchannel.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideo4linux2_la-tunernorm.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideo4linux2_la-v4l2-utils.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideo4linux2_la-v4l2_calls.Plo@am__quote@
.c.o:
@@ -760,6 +773,13 @@ libgstvideo4linux2_la-gstv4l2.lo: gstv4l2.c
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideo4linux2_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideo4linux2_la_CFLAGS) $(CFLAGS) -c -o libgstvideo4linux2_la-gstv4l2.lo `test -f 'gstv4l2.c' || echo '$(srcdir)/'`gstv4l2.c
+libgstvideo4linux2_la-gstv4l2allocator.lo: gstv4l2allocator.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideo4linux2_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideo4linux2_la_CFLAGS) $(CFLAGS) -MT libgstvideo4linux2_la-gstv4l2allocator.lo -MD -MP -MF $(DEPDIR)/libgstvideo4linux2_la-gstv4l2allocator.Tpo -c -o libgstvideo4linux2_la-gstv4l2allocator.lo `test -f 'gstv4l2allocator.c' || echo '$(srcdir)/'`gstv4l2allocator.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvideo4linux2_la-gstv4l2allocator.Tpo $(DEPDIR)/libgstvideo4linux2_la-gstv4l2allocator.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstv4l2allocator.c' object='libgstvideo4linux2_la-gstv4l2allocator.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideo4linux2_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideo4linux2_la_CFLAGS) $(CFLAGS) -c -o libgstvideo4linux2_la-gstv4l2allocator.lo `test -f 'gstv4l2allocator.c' || echo '$(srcdir)/'`gstv4l2allocator.c
+
libgstvideo4linux2_la-gstv4l2colorbalance.lo: gstv4l2colorbalance.c
@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideo4linux2_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideo4linux2_la_CFLAGS) $(CFLAGS) -MT libgstvideo4linux2_la-gstv4l2colorbalance.lo -MD -MP -MF $(DEPDIR)/libgstvideo4linux2_la-gstv4l2colorbalance.Tpo -c -o libgstvideo4linux2_la-gstv4l2colorbalance.lo `test -f 'gstv4l2colorbalance.c' || echo '$(srcdir)/'`gstv4l2colorbalance.c
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvideo4linux2_la-gstv4l2colorbalance.Tpo $(DEPDIR)/libgstvideo4linux2_la-gstv4l2colorbalance.Plo
@@ -816,6 +836,13 @@ libgstvideo4linux2_la-gstv4l2tuner.lo: gstv4l2tuner.c
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideo4linux2_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideo4linux2_la_CFLAGS) $(CFLAGS) -c -o libgstvideo4linux2_la-gstv4l2tuner.lo `test -f 'gstv4l2tuner.c' || echo '$(srcdir)/'`gstv4l2tuner.c
+libgstvideo4linux2_la-gstv4l2transform.lo: gstv4l2transform.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideo4linux2_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideo4linux2_la_CFLAGS) $(CFLAGS) -MT libgstvideo4linux2_la-gstv4l2transform.lo -MD -MP -MF $(DEPDIR)/libgstvideo4linux2_la-gstv4l2transform.Tpo -c -o libgstvideo4linux2_la-gstv4l2transform.lo `test -f 'gstv4l2transform.c' || echo '$(srcdir)/'`gstv4l2transform.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvideo4linux2_la-gstv4l2transform.Tpo $(DEPDIR)/libgstvideo4linux2_la-gstv4l2transform.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='gstv4l2transform.c' object='libgstvideo4linux2_la-gstv4l2transform.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideo4linux2_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideo4linux2_la_CFLAGS) $(CFLAGS) -c -o libgstvideo4linux2_la-gstv4l2transform.lo `test -f 'gstv4l2transform.c' || echo '$(srcdir)/'`gstv4l2transform.c
+
libgstvideo4linux2_la-gstv4l2videodec.lo: gstv4l2videodec.c
@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideo4linux2_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideo4linux2_la_CFLAGS) $(CFLAGS) -MT libgstvideo4linux2_la-gstv4l2videodec.lo -MD -MP -MF $(DEPDIR)/libgstvideo4linux2_la-gstv4l2videodec.Tpo -c -o libgstvideo4linux2_la-gstv4l2videodec.lo `test -f 'gstv4l2videodec.c' || echo '$(srcdir)/'`gstv4l2videodec.c
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvideo4linux2_la-gstv4l2videodec.Tpo $(DEPDIR)/libgstvideo4linux2_la-gstv4l2videodec.Plo
@@ -837,6 +864,13 @@ libgstvideo4linux2_la-v4l2_calls.lo: v4l2_calls.c
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideo4linux2_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideo4linux2_la_CFLAGS) $(CFLAGS) -c -o libgstvideo4linux2_la-v4l2_calls.lo `test -f 'v4l2_calls.c' || echo '$(srcdir)/'`v4l2_calls.c
+libgstvideo4linux2_la-v4l2-utils.lo: v4l2-utils.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideo4linux2_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideo4linux2_la_CFLAGS) $(CFLAGS) -MT libgstvideo4linux2_la-v4l2-utils.lo -MD -MP -MF $(DEPDIR)/libgstvideo4linux2_la-v4l2-utils.Tpo -c -o libgstvideo4linux2_la-v4l2-utils.lo `test -f 'v4l2-utils.c' || echo '$(srcdir)/'`v4l2-utils.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvideo4linux2_la-v4l2-utils.Tpo $(DEPDIR)/libgstvideo4linux2_la-v4l2-utils.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='v4l2-utils.c' object='libgstvideo4linux2_la-v4l2-utils.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideo4linux2_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideo4linux2_la_CFLAGS) $(CFLAGS) -c -o libgstvideo4linux2_la-v4l2-utils.lo `test -f 'v4l2-utils.c' || echo '$(srcdir)/'`v4l2-utils.c
+
libgstvideo4linux2_la-tuner.lo: tuner.c
@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideo4linux2_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideo4linux2_la_CFLAGS) $(CFLAGS) -MT libgstvideo4linux2_la-tuner.lo -MD -MP -MF $(DEPDIR)/libgstvideo4linux2_la-tuner.Tpo -c -o libgstvideo4linux2_la-tuner.lo `test -f 'tuner.c' || echo '$(srcdir)/'`tuner.c
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libgstvideo4linux2_la-tuner.Tpo $(DEPDIR)/libgstvideo4linux2_la-tuner.Plo
diff --git a/sys/v4l2/gstv4l2.c b/sys/v4l2/gstv4l2.c
index a5361d74..d4871f8d 100644
--- a/sys/v4l2/gstv4l2.c
+++ b/sys/v4l2/gstv4l2.c
@@ -29,18 +29,164 @@
#include <gst/gst.h>
+#include <fcntl.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+#include "ext/videodev2.h"
+#include "v4l2-utils.h"
+
#include "gstv4l2object.h"
#include "gstv4l2src.h"
#include "gstv4l2sink.h"
#include "gstv4l2radio.h"
#include "gstv4l2videodec.h"
#include "gstv4l2devicemonitor.h"
-/* #include "gstv4l2jpegsrc.h" */
-/* #include "gstv4l2mjpegsrc.h" */
-/* #include "gstv4l2mjpegsink.h" */
+#include "gstv4l2transform.h"
/* used in v4l2_calls.c and v4l2src_calls.c */
GST_DEBUG_CATEGORY (v4l2_debug);
+#define GST_CAT_DEFAULT v4l2_debug
+
+/* This is a minimalist probe, for speed, we only enumerate formats */
+static GstCaps *
+gst_v4l2_probe_template_caps (const gchar * device, gint video_fd,
+ enum v4l2_buf_type type)
+{
+ gint n;
+ struct v4l2_fmtdesc format;
+ GstCaps *caps;
+
+ GST_DEBUG ("Getting %s format enumerations", device);
+ caps = gst_caps_new_empty ();
+
+ for (n = 0;; n++) {
+ GstStructure *template;
+
+ memset (&format, 0, sizeof (format));
+
+ format.index = n;
+ format.type = type;
+
+ if (ioctl (video_fd, VIDIOC_ENUM_FMT, &format) < 0)
+ break; /* end of enumeration */
+
+ GST_LOG ("index: %u", format.index);
+ GST_LOG ("type: %d", format.type);
+ GST_LOG ("flags: %08x", format.flags);
+ GST_LOG ("description: '%s'", format.description);
+ GST_LOG ("pixelformat: %" GST_FOURCC_FORMAT,
+ GST_FOURCC_ARGS (format.pixelformat));
+
+ template = gst_v4l2_object_v4l2fourcc_to_structure (format.pixelformat);
+
+ if (template) {
+ GstStructure *alt_t = NULL;
+
+ switch (format.pixelformat) {
+ case V4L2_PIX_FMT_RGB32:
+ alt_t = gst_structure_copy (template);
+ gst_structure_set (alt_t, "format", G_TYPE_STRING, "ARGB", NULL);
+ break;
+ case V4L2_PIX_FMT_BGR32:
+ alt_t = gst_structure_copy (template);
+ gst_structure_set (alt_t, "format", G_TYPE_STRING, "BGRA", NULL);
+ default:
+ break;
+ }
+
+ gst_caps_append_structure (caps, template);
+
+ if (alt_t)
+ gst_caps_append_structure (caps, alt_t);
+ }
+ }
+
+ return gst_caps_simplify (caps);
+}
+
+static gboolean
+gst_v4l2_probe_and_register (GstPlugin * plugin)
+{
+ GstV4l2Iterator *it;
+ gint video_fd = -1;
+ struct v4l2_capability vcap;
+ gboolean ret = TRUE;
+
+ it = gst_v4l2_iterator_new ();
+
+ while (gst_v4l2_iterator_next (it)) {
+ GstCaps *src_caps, *sink_caps;
+ gchar *basename;
+
+ if (video_fd >= 0)
+ close (video_fd);
+
+ video_fd = open (it->device_path, O_RDWR);
+ if (video_fd == -1) {
+ GST_DEBUG ("Failed to open %s: %s", it->device_path, g_strerror (errno));
+ continue;
+ }
+
+ memset (&vcap, 0, sizeof (vcap));
+
+ if (ioctl (video_fd, VIDIOC_QUERYCAP, &vcap) < 0) {
+ GST_DEBUG ("Failed to get device capabilities: %s", g_strerror (errno));
+ continue;
+ }
+
+ if (!((vcap.capabilities & (V4L2_CAP_VIDEO_M2M |
+ V4L2_CAP_VIDEO_M2M_MPLANE)) ||
+ /* But legacy driver may expose both CAPTURE and OUTPUT */
+ ((vcap.capabilities &
+ (V4L2_CAP_VIDEO_CAPTURE | V4L2_CAP_VIDEO_CAPTURE_MPLANE)) &&
+ (vcap.capabilities &
+ (V4L2_CAP_VIDEO_OUTPUT | V4L2_CAP_VIDEO_OUTPUT_MPLANE)))))
+ continue;
+
+ GST_DEBUG ("Probing '%s' located at '%s'",
+ it->device_name ? it->device_name : (const gchar *) vcap.driver,
+ it->device_path);
+
+ /* get sink supported format (no MPLANE for codec) */
+ sink_caps = gst_caps_merge (gst_v4l2_probe_template_caps (it->device_path,
+ video_fd, V4L2_BUF_TYPE_VIDEO_OUTPUT),
+ gst_v4l2_probe_template_caps (it->device_path, video_fd,
+ V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE));
+
+ /* get src supported format */
+ src_caps = gst_caps_merge (gst_v4l2_probe_template_caps (it->device_path,
+ video_fd, V4L2_BUF_TYPE_VIDEO_CAPTURE),
+ gst_v4l2_probe_template_caps (it->device_path, video_fd,
+ V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE));
+
+ basename = g_path_get_basename (it->device_path);
+
+ if (gst_v4l2_is_video_dec (sink_caps, src_caps))
+ ret = gst_v4l2_video_dec_register (plugin, basename, it->device_path,
+ sink_caps, src_caps);
+ else if (gst_v4l2_is_transform (sink_caps, src_caps))
+ ret = gst_v4l2_transform_register (plugin, basename, it->device_path,
+ sink_caps, src_caps);
+ /* else if ( ... etc. */
+
+ gst_caps_unref (sink_caps);
+ gst_caps_unref (src_caps);
+ g_free (basename);
+
+ if (!ret)
+ break;
+ }
+
+ if (video_fd >= 0)
+ close (video_fd);
+
+ gst_v4l2_iterator_free (it);
+
+ return ret;
+}
static gboolean
plugin_init (GstPlugin * plugin)
@@ -53,16 +199,10 @@ plugin_init (GstPlugin * plugin)
GST_TYPE_V4L2SINK) ||
!gst_element_register (plugin, "v4l2radio", GST_RANK_NONE,
GST_TYPE_V4L2RADIO) ||
- !gst_v4l2_video_dec_register (plugin) ||
!gst_device_monitor_register (plugin, "v4l2monitor",
GST_RANK_PRIMARY, GST_TYPE_V4L2_DEVICE_MONITOR) ||
- /* !gst_element_register (plugin, "v4l2jpegsrc", */
- /* GST_RANK_NONE, GST_TYPE_V4L2JPEGSRC) || */
- /* !gst_element_register (plugin, "v4l2mjpegsrc", */
- /* GST_RANK_NONE, GST_TYPE_V4L2MJPEGSRC) || */
- /* !gst_element_register (plugin, "v4l2mjpegsink", */
- /* GST_RANK_NONE, GST_TYPE_V4L2MJPEGSINK)) */
- FALSE)
+ /* etc. */
+ !gst_v4l2_probe_and_register (plugin))
return FALSE;
#ifdef ENABLE_NLS
diff --git a/sys/v4l2/gstv4l2allocator.c b/sys/v4l2/gstv4l2allocator.c
new file mode 100644
index 00000000..dc93b2be
--- /dev/null
+++ b/sys/v4l2/gstv4l2allocator.c
@@ -0,0 +1,1396 @@
+/*
+ * Copyright (C) 2014 Collabora Ltd.
+ * Author: Nicolas Dufresne <nicolas.dufresne@collabora.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "config.h"
+
+#include "ext/videodev2.h"
+#include "gstv4l2allocator.h"
+#include "v4l2_calls.h"
+
+#include <gst/allocators/gstdmabuf.h>
+
+#include <fcntl.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <sys/mman.h>
+
+#define GST_V4L2_MEMORY_TYPE "V4l2Memory"
+
+#define gst_v4l2_allocator_parent_class parent_class
+G_DEFINE_TYPE (GstV4l2Allocator, gst_v4l2_allocator, GST_TYPE_ALLOCATOR);
+
+GST_DEBUG_CATEGORY_STATIC (v4l2allocator_debug);
+#define GST_CAT_DEFAULT v4l2allocator_debug
+
+#define UNSET_QUEUED(buffer) \
+ ((buffer).flags &= ~(V4L2_BUF_FLAG_QUEUED | V4L2_BUF_FLAG_DONE))
+
+#define SET_QUEUED(buffer) ((buffer).flags |= V4L2_BUF_FLAG_QUEUED)
+
+#define IS_QUEUED(buffer) \
+ ((buffer).flags & (V4L2_BUF_FLAG_QUEUED | V4L2_BUF_FLAG_DONE))
+
+enum
+{
+ GROUP_RELEASED,
+ LAST_SIGNAL
+};
+
+static guint gst_v4l2_allocator_signals[LAST_SIGNAL] = { 0 };
+
+static void gst_v4l2_allocator_release (GstV4l2Allocator * allocator,
+ GstV4l2Memory * mem);
+
+static const gchar *
+memory_type_to_str (guint32 memory)
+{
+ switch (memory) {
+ case V4L2_MEMORY_MMAP:
+ return "mmap";
+ case V4L2_MEMORY_USERPTR:
+ return "userptr";
+ case V4L2_MEMORY_DMABUF:
+ return "dmabuf";
+ default:
+ return "unknown";
+ }
+}
+
+/*************************************/
+/* GstV4lMemory implementation */
+/*************************************/
+
+static gpointer
+_v4l2mem_map (GstV4l2Memory * mem, gsize maxsize, GstMapFlags flags)
+{
+ gpointer data = NULL;
+
+ switch (mem->group->buffer.memory) {
+ case V4L2_MEMORY_MMAP:
+ case V4L2_MEMORY_USERPTR:
+ data = mem->data;
+ break;
+ case V4L2_MEMORY_DMABUF:
+ /* v4l2 dmabuf memory are not shared with downstream */
+ g_assert_not_reached ();
+ break;
+ default:
+ GST_WARNING ("Unknown memory type %i", mem->group->buffer.memory);
+ break;
+ }
+ return data;
+}
+
+static gboolean
+_v4l2mem_unmap (GstV4l2Memory * mem)
+{
+ gboolean ret = FALSE;
+
+ switch (mem->group->buffer.memory) {
+ case V4L2_MEMORY_MMAP:
+ case V4L2_MEMORY_USERPTR:
+ ret = TRUE;
+ break;
+ case V4L2_MEMORY_DMABUF:
+ /* v4l2 dmabuf memory are not share with downstream */
+ g_assert_not_reached ();
+ break;
+ default:
+ GST_WARNING ("Unknown memory type %i", mem->group->buffer.memory);
+ break;
+ }
+ return ret;
+}
+
+static gboolean
+_v4l2mem_dispose (GstV4l2Memory * mem)
+{
+ GstV4l2Allocator *allocator = (GstV4l2Allocator *) mem->mem.allocator;
+ GstV4l2MemoryGroup *group = mem->group;
+ gboolean ret;
+
+ if (group->mem[mem->plane]) {
+ /* We may have a dmabuf, replace it with returned original memory */
+ group->mem[mem->plane] = gst_memory_ref ((GstMemory *) mem);
+ gst_v4l2_allocator_release (allocator, mem);
+ ret = FALSE;
+ } else {
+ gst_object_ref (allocator);
+ ret = TRUE;
+ }
+
+ return ret;
+}
+
+static void
+_v4l2mem_free (GstV4l2Memory * mem)
+{
+ if (mem->dmafd >= 0)
+ close (mem->dmafd);
+ g_slice_free (GstV4l2Memory, mem);
+}
+
+static inline GstV4l2Memory *
+_v4l2mem_new (GstMemoryFlags flags, GstAllocator * allocator,
+ GstMemory * parent, gsize maxsize, gsize align, gsize offset, gsize size,
+ gint plane, gpointer data, int dmafd, GstV4l2MemoryGroup * group)
+{
+ GstV4l2Memory *mem;
+
+ mem = g_slice_new0 (GstV4l2Memory);
+ gst_memory_init (GST_MEMORY_CAST (mem),
+ flags, allocator, parent, maxsize, align, offset, size);
+
+ if (parent == NULL)
+ mem->mem.mini_object.dispose =
+ (GstMiniObjectDisposeFunction) _v4l2mem_dispose;
+
+ mem->plane = plane;
+ mem->data = data;
+ mem->dmafd = dmafd;
+ mem->group = group;
+
+ return mem;
+}
+
+static GstV4l2Memory *
+_v4l2mem_share (GstV4l2Memory * mem, gssize offset, gsize size)
+{
+ GstV4l2Memory *sub;
+ GstMemory *parent;
+
+ /* find the real parent */
+ if ((parent = mem->mem.parent) == NULL)
+ parent = (GstMemory *) mem;
+
+ if (size == -1)
+ size = mem->mem.size - offset;
+
+ /* the shared memory is always readonly */
+ sub = _v4l2mem_new (GST_MINI_OBJECT_FLAGS (parent) |
+ GST_MINI_OBJECT_FLAG_LOCK_READONLY, mem->mem.allocator, parent,
+ mem->mem.maxsize, mem->mem.align, offset, size, mem->plane, mem->data,
+ -1, mem->group);
+
+ return sub;
+}
+
+static gboolean
+_v4l2mem_is_span (GstV4l2Memory * mem1, GstV4l2Memory * mem2, gsize * offset)
+{
+ if (offset)
+ *offset = mem1->mem.offset - mem1->mem.parent->offset;
+
+ /* and memory is contiguous */
+ return mem1->mem.offset + mem1->mem.size == mem2->mem.offset;
+}
+
+static void
+_v4l2mem_parent_to_dmabuf (GstV4l2Memory * mem, GstMemory * dma_mem)
+{
+ gst_memory_lock (&mem->mem, GST_LOCK_FLAG_EXCLUSIVE);
+ dma_mem->parent = gst_memory_ref (&mem->mem);
+}
+
+gboolean
+gst_is_v4l2_memory (GstMemory * mem)
+{
+ return gst_memory_is_type (mem, GST_V4L2_MEMORY_TYPE);
+}
+
+
+/*************************************/
+/* GstV4l2MemoryGroup implementation */
+/*************************************/
+
+static void
+gst_v4l2_memory_group_free (GstV4l2MemoryGroup * group)
+{
+ gint i;
+
+ for (i = 0; i < group->n_mem; i++) {
+ GstMemory *mem = group->mem[i];
+ group->mem[i] = NULL;
+ if (mem)
+ gst_memory_unref (mem);
+ }
+
+ g_slice_free (GstV4l2MemoryGroup, group);
+}
+
+static GstV4l2MemoryGroup *
+gst_v4l2_memory_group_new (GstV4l2Allocator * allocator, guint32 index)
+{
+ gint video_fd = allocator->video_fd;
+ guint32 memory = allocator->memory;
+ struct v4l2_format *format = &allocator->format;
+ GstV4l2MemoryGroup *group;
+ gsize img_size, buf_size;
+
+ group = g_slice_new0 (GstV4l2MemoryGroup);
+
+ group->buffer.type = format->type;
+ group->buffer.index = index;
+ group->buffer.memory = memory;
+
+ if (V4L2_TYPE_IS_MULTIPLANAR (format->type)) {
+ group->n_mem = group->buffer.length = format->fmt.pix_mp.num_planes;
+ group->buffer.m.planes = group->planes;
+ } else {
+ group->n_mem = 1;
+ }
+
+ if (v4l2_ioctl (video_fd, VIDIOC_QUERYBUF, &group->buffer) < 0)
+ goto querybuf_failed;
+
+ /* Check that provided size matches the format we have negotiation. Failing
+ * there usually means a driver of libv4l bug. */
+ if (V4L2_TYPE_IS_MULTIPLANAR (allocator->type)) {
+ gint i;
+
+ for (i = 0; i < group->n_mem; i++) {
+ img_size = allocator->format.fmt.pix_mp.plane_fmt[i].sizeimage;
+ buf_size = group->planes[i].length;
+ if (buf_size < img_size)
+ goto buffer_too_short;
+ }
+ } else {
+ img_size = allocator->format.fmt.pix.sizeimage;
+ buf_size = group->buffer.length;
+ if (buf_size < img_size)
+ goto buffer_too_short;
+ }
+
+ /* We save non planar buffer information into the multi-planar plane array
+ * to avoid duplicating the code later */
+ if (!V4L2_TYPE_IS_MULTIPLANAR (format->type)) {
+ group->planes[0].bytesused = group->buffer.bytesused;
+ group->planes[0].length = group->buffer.length;
+ g_assert (sizeof (group->planes[0].m) == sizeof (group->buffer.m));
+ memcpy (&group->planes[0].m, &group->buffer.m, sizeof (group->buffer.m));
+ }
+
+ GST_LOG_OBJECT (allocator, "Got %s buffer", memory_type_to_str (memory));
+ GST_LOG_OBJECT (allocator, " index: %u", group->buffer.index);
+ GST_LOG_OBJECT (allocator, " type: %d", group->buffer.type);
+ GST_LOG_OBJECT (allocator, " flags: %08x", group->buffer.flags);
+ GST_LOG_OBJECT (allocator, " field: %d", group->buffer.field);
+ GST_LOG_OBJECT (allocator, " memory: %d", group->buffer.memory);
+ GST_LOG_OBJECT (allocator, " planes: %d", group->n_mem);
+
+#ifndef GST_DISABLE_GST_DEBUG
+ if (memory == V4L2_MEMORY_MMAP) {
+ gint i;
+ for (i = 0; i < group->n_mem; i++) {
+ GST_LOG_OBJECT (allocator, " [%u] bytesused: %u, length: %u", i,
+ group->planes[i].bytesused, group->planes[i].length);
+ GST_LOG_OBJECT (allocator, " [%u] MMAP offset: %u", i,
+ group->planes[i].m.mem_offset);
+ }
+ }
+#endif
+
+ return group;
+
+querybuf_failed:
+ {
+ GST_ERROR ("error querying buffer %d: %s", index, g_strerror (errno));
+ goto failed;
+ }
+buffer_too_short:
+ {
+ GST_ERROR ("buffer size %" G_GSIZE_FORMAT
+ " is smaller then negotiated size %" G_GSIZE_FORMAT
+ ", this is usually the result of a bug in the v4l2 driver or libv4l.",
+ buf_size, img_size);
+ goto failed;
+ }
+failed:
+ gst_v4l2_memory_group_free (group);
+ return NULL;
+}
+
+
+/*************************************/
+/* GstV4lAllocator implementation */
+/*************************************/
+
+static void
+gst_v4l2_allocator_release (GstV4l2Allocator * allocator, GstV4l2Memory * mem)
+{
+ GstV4l2MemoryGroup *group = mem->group;
+
+ GST_LOG_OBJECT (allocator, "plane %i of buffer %u released",
+ mem->plane, group->buffer.index);
+
+ switch (allocator->memory) {
+ case V4L2_MEMORY_DMABUF:
+ close (mem->dmafd);
+ mem->dmafd = -1;
+ break;
+ case V4L2_MEMORY_USERPTR:
+ mem->data = NULL;
+ break;
+ default:
+ break;
+ }
+
+ /* When all memory are back, put the group back in the free queue */
+ if (g_atomic_int_dec_and_test (&group->mems_allocated)) {
+ GST_LOG_OBJECT (allocator, "buffer %u released", group->buffer.index);
+ gst_atomic_queue_push (allocator->free_queue, group);
+ g_signal_emit (allocator, gst_v4l2_allocator_signals[GROUP_RELEASED], 0);
+ }
+
+ /* Keep last, allocator may be freed after this call */
+ g_object_unref (allocator);
+}
+
+static void
+gst_v4l2_allocator_free (GstAllocator * gallocator, GstMemory * gmem)
+{
+ GstV4l2Allocator *allocator = (GstV4l2Allocator *) gallocator;
+ GstV4l2Memory *mem = (GstV4l2Memory *) gmem;
+ GstV4l2MemoryGroup *group = mem->group;
+
+ GST_LOG_OBJECT (allocator, "freeing plane %i of buffer %u",
+ mem->plane, group->buffer.index);
+
+ switch (allocator->memory) {
+ case V4L2_MEMORY_MMAP:
+ if (mem->data) {
+ v4l2_munmap (mem->data, group->planes[mem->plane].length);
+ } else if (group->planes[mem->plane].m.fd > 0) {
+ close (group->planes[mem->plane].m.fd);
+ }
+ break;
+ default:
+ /* Nothing to do */
+ break;
+ }
+
+ _v4l2mem_free (mem);
+}
+
+static void
+gst_v4l2_allocator_dispose (GObject * obj)
+{
+ GstV4l2Allocator *allocator = (GstV4l2Allocator *) obj;
+ gint i;
+
+ GST_LOG_OBJECT (obj, "called");
+
+ for (i = 0; i < allocator->count; i++) {
+ GstV4l2MemoryGroup *group = allocator->groups[i];
+ allocator->groups[i] = NULL;
+ if (group)
+ gst_v4l2_memory_group_free (group);
+ }
+
+ G_OBJECT_CLASS (parent_class)->dispose (obj);
+}
+
+static void
+gst_v4l2_allocator_finalize (GObject * obj)
+{
+ GstV4l2Allocator *allocator = (GstV4l2Allocator *) obj;
+
+ GST_LOG_OBJECT (obj, "called");
+
+ v4l2_close (allocator->video_fd);
+ gst_atomic_queue_unref (allocator->free_queue);
+
+ G_OBJECT_CLASS (parent_class)->finalize (obj);
+}
+
+static void
+gst_v4l2_allocator_class_init (GstV4l2AllocatorClass * klass)
+{
+ GObjectClass *object_class;
+ GstAllocatorClass *allocator_class;
+
+ allocator_class = (GstAllocatorClass *) klass;
+ object_class = (GObjectClass *) klass;
+
+ allocator_class->alloc = NULL;
+ allocator_class->free = gst_v4l2_allocator_free;
+
+ object_class->dispose = gst_v4l2_allocator_dispose;
+ object_class->finalize = gst_v4l2_allocator_finalize;
+
+ gst_v4l2_allocator_signals[GROUP_RELEASED] = g_signal_new ("group-released",
+ G_TYPE_FROM_CLASS (object_class), G_SIGNAL_RUN_LAST, 0, NULL, NULL, NULL,
+ G_TYPE_NONE, 0);
+
+ GST_DEBUG_CATEGORY_INIT (v4l2allocator_debug, "v4l2allocator", 0,
+ "V4L2 Allocator");
+}
+
+static void
+gst_v4l2_allocator_init (GstV4l2Allocator * allocator)
+{
+ GstAllocator *alloc = GST_ALLOCATOR_CAST (allocator);
+
+ alloc->mem_type = GST_V4L2_MEMORY_TYPE;
+ alloc->mem_map = (GstMemoryMapFunction) _v4l2mem_map;
+ alloc->mem_unmap = (GstMemoryUnmapFunction) _v4l2mem_unmap;
+ alloc->mem_share = (GstMemoryShareFunction) _v4l2mem_share;
+ alloc->mem_is_span = (GstMemoryIsSpanFunction) _v4l2mem_is_span;
+ /* Use the default, fallback copy function */
+
+ allocator->free_queue = gst_atomic_queue_new (VIDEO_MAX_FRAME);
+
+ GST_OBJECT_FLAG_SET (allocator, GST_ALLOCATOR_FLAG_CUSTOM_ALLOC);
+}
+
+#define GST_V4L2_ALLOCATOR_PROBE(obj,type) \
+ gst_v4l2_allocator_probe ((obj), V4L2_MEMORY_ ## type, \
+ GST_V4L2_ALLOCATOR_FLAG_ ## type ## _REQBUFS, \
+ GST_V4L2_ALLOCATOR_FLAG_ ## type ## _CREATE_BUFS)
+static guint32
+gst_v4l2_allocator_probe (GstV4l2Allocator * allocator, guint32 memory,
+ guint32 breq_flag, guint32 bcreate_flag)
+{
+ struct v4l2_requestbuffers breq = { 0 };
+ guint32 flags = 0;
+
+ breq.type = allocator->type;
+ breq.count = 0;
+ breq.memory = memory;
+
+ if (v4l2_ioctl (allocator->video_fd, VIDIOC_REQBUFS, &breq) == 0) {
+ struct v4l2_create_buffers bcreate = { 0 };
+
+ flags |= breq_flag;
+
+ bcreate.memory = V4L2_MEMORY_MMAP;
+ bcreate.format = allocator->format;
+
+ if ((v4l2_ioctl (allocator->video_fd, VIDIOC_CREATE_BUFS, &bcreate) == 0))
+ flags |= bcreate_flag;
+ }
+
+ return flags;
+}
+
+static GstV4l2MemoryGroup *
+gst_v4l2_allocator_create_buf (GstV4l2Allocator * allocator)
+{
+ struct v4l2_create_buffers bcreate = { 0 };
+ GstV4l2MemoryGroup *group = NULL;
+
+ GST_OBJECT_LOCK (allocator);
+
+ if (!g_atomic_int_get (&allocator->active))
+ goto done;
+
+ bcreate.memory = allocator->memory;
+ bcreate.format = allocator->format;
+ bcreate.count = 1;
+
+ if (!allocator->can_allocate)
+ goto done;
+
+ if (v4l2_ioctl (allocator->video_fd, VIDIOC_CREATE_BUFS, &bcreate) < 0)
+ goto create_bufs_failed;
+
+ group = gst_v4l2_memory_group_new (allocator, bcreate.index);
+
+ if (group) {
+ allocator->groups[bcreate.index] = group;
+ allocator->count++;
+ }
+
+done:
+ GST_OBJECT_UNLOCK (allocator);
+ return group;
+
+create_bufs_failed:
+ {
+ GST_WARNING_OBJECT (allocator, "error creating a new buffer: %s",
+ g_strerror (errno));
+ goto done;
+ }
+}
+
+static GstV4l2MemoryGroup *
+gst_v4l2_allocator_alloc (GstV4l2Allocator * allocator)
+{
+ GstV4l2MemoryGroup *group;
+
+ if (!g_atomic_int_get (&allocator->active))
+ return NULL;
+
+ group = gst_atomic_queue_pop (allocator->free_queue);
+
+ if (group == NULL) {
+ if (allocator->can_allocate) {
+ group = gst_v4l2_allocator_create_buf (allocator);
+
+ /* Don't hammer on CREATE_BUFS */
+ if (group == NULL)
+ allocator->can_allocate = FALSE;
+ }
+ }
+
+ return group;
+}
+
+static void
+gst_v4l2_allocator_reset_size (GstV4l2Allocator * allocator,
+ GstV4l2MemoryGroup * group)
+{
+ gsize size;
+ gboolean imported = FALSE;
+
+ switch (allocator->memory) {
+ case V4L2_MEMORY_USERPTR:
+ case V4L2_MEMORY_DMABUF:
+ imported = TRUE;
+ break;
+ }
+
+ if (V4L2_TYPE_IS_MULTIPLANAR (allocator->type)) {
+ gint i;
+
+ for (i = 0; i < group->n_mem; i++) {
+ size = allocator->format.fmt.pix_mp.plane_fmt[i].sizeimage;
+
+ if (imported)
+ group->mem[i]->maxsize = size;
+
+ gst_memory_resize (group->mem[i], 0, size);
+ }
+
+ } else {
+ size = allocator->format.fmt.pix.sizeimage;
+
+ if (imported)
+ group->mem[0]->maxsize = size;
+
+ gst_memory_resize (group->mem[0], 0, size);
+ }
+}
+
+static void
+_cleanup_failed_alloc (GstV4l2Allocator * allocator, GstV4l2MemoryGroup * group)
+{
+ if (group->mems_allocated > 0) {
+ gint i;
+ /* If one or more mmap worked, we need to unref the memory, otherwise
+ * they will keep a ref on the allocator and leak it. This will put back
+ * the group into the free_queue */
+ for (i = 0; i < group->n_mem; i++)
+ gst_memory_unref (group->mem[i]);
+ } else {
+ /* Otherwise, group has to be on free queue for _stop() to work */
+ gst_atomic_queue_push (allocator->free_queue, group);
+ }
+}
+
+
+
+GstV4l2Allocator *
+gst_v4l2_allocator_new (GstObject * parent, gint video_fd,
+ struct v4l2_format *format)
+{
+ GstV4l2Allocator *allocator;
+ guint32 flags = 0;
+ gchar *name, *parent_name;
+
+ parent_name = gst_object_get_name (parent);
+ name = g_strconcat (parent_name, ":allocator", NULL);
+ g_free (parent_name);
+
+ allocator = g_object_new (GST_TYPE_V4L2_ALLOCATOR, "name", name, NULL);
+ g_free (name);
+
+ /* Save everything */
+ allocator->video_fd = v4l2_dup (video_fd);
+ allocator->type = format->type;
+ allocator->format = *format;
+
+ flags |= GST_V4L2_ALLOCATOR_PROBE (allocator, MMAP);
+ flags |= GST_V4L2_ALLOCATOR_PROBE (allocator, USERPTR);
+ flags |= GST_V4L2_ALLOCATOR_PROBE (allocator, DMABUF);
+
+ GST_OBJECT_FLAG_SET (allocator, flags);
+
+ if (flags == 0)
+ goto not_supported;
+
+ return allocator;
+
+not_supported:
+ {
+ GST_ERROR_OBJECT (allocator,
+ "No memory model supported by GStreamer for this device");
+ g_object_unref (allocator);
+ return NULL;
+ }
+}
+
+guint
+gst_v4l2_allocator_start (GstV4l2Allocator * allocator, guint32 count,
+ guint32 memory)
+{
+ struct v4l2_requestbuffers breq = { count, allocator->type, memory };
+ gboolean can_allocate;
+ gint i;
+
+ g_return_val_if_fail (count != 0, 0);
+
+ GST_OBJECT_LOCK (allocator);
+
+ if (g_atomic_int_get (&allocator->active))
+ goto already_active;
+
+ if (v4l2_ioctl (allocator->video_fd, VIDIOC_REQBUFS, &breq) < 0)
+ goto reqbufs_failed;
+
+ if (breq.count < 1)
+ goto out_of_memory;
+
+ switch (memory) {
+ case V4L2_MEMORY_MMAP:
+ can_allocate = GST_V4L2_ALLOCATOR_CAN_ALLOCATE (allocator, MMAP);
+ break;
+ case V4L2_MEMORY_USERPTR:
+ can_allocate = GST_V4L2_ALLOCATOR_CAN_ALLOCATE (allocator, USERPTR);
+ break;
+ case V4L2_MEMORY_DMABUF:
+ can_allocate = GST_V4L2_ALLOCATOR_CAN_ALLOCATE (allocator, DMABUF);
+ break;
+ default:
+ can_allocate = FALSE;
+ break;
+ }
+
+ GST_DEBUG_OBJECT (allocator, "allocated %u %s buffers out of %u requested",
+ breq.count, memory_type_to_str (memory), count);
+
+ allocator->can_allocate = can_allocate;
+ allocator->count = breq.count;
+ allocator->memory = memory;
+
+ /* Create memory groups */
+ for (i = 0; i < allocator->count; i++) {
+ allocator->groups[i] = gst_v4l2_memory_group_new (allocator, i);
+ if (allocator->groups[i] == NULL)
+ goto error;
+
+ gst_atomic_queue_push (allocator->free_queue, allocator->groups[i]);
+ }
+
+ g_atomic_int_set (&allocator->active, TRUE);
+
+done:
+ GST_OBJECT_UNLOCK (allocator);
+ return breq.count;
+
+already_active:
+ {
+ GST_ERROR_OBJECT (allocator,
+ "error requesting %d buffers: %s", count, g_strerror (errno));
+ goto error;
+ }
+reqbufs_failed:
+ {
+ GST_ERROR_OBJECT (allocator,
+ "error requesting %d buffers: %s", count, g_strerror (errno));
+ goto error;
+ }
+out_of_memory:
+ {
+ GST_ERROR_OBJECT (allocator, "Not enough memory to allocate buffers");
+ goto error;
+ }
+error:
+ {
+ breq.count = 0;
+ goto done;
+ }
+}
+
+GstV4l2Return
+gst_v4l2_allocator_stop (GstV4l2Allocator * allocator)
+{
+ struct v4l2_requestbuffers breq = { 0, allocator->type, allocator->memory };
+ gint i = 0;
+ GstV4l2Return ret = GST_V4L2_OK;
+
+ GST_DEBUG_OBJECT (allocator, "stop allocator");
+
+ GST_OBJECT_LOCK (allocator);
+
+ if (!g_atomic_int_get (&allocator->active))
+ goto done;
+
+ if (gst_atomic_queue_length (allocator->free_queue) != allocator->count) {
+ GST_DEBUG_OBJECT (allocator, "allocator is still in use");
+ ret = GST_V4L2_BUSY;
+ goto done;
+ }
+
+ while (gst_atomic_queue_pop (allocator->free_queue)) {
+ /* nothing */
+ };
+
+ for (i = 0; i < allocator->count; i++) {
+ GstV4l2MemoryGroup *group = allocator->groups[i];
+ allocator->groups[i] = NULL;
+ if (group)
+ gst_v4l2_memory_group_free (group);
+ }
+
+ if (v4l2_ioctl (allocator->video_fd, VIDIOC_REQBUFS, &breq) < 0)
+ goto reqbufs_failed;
+
+ g_atomic_int_set (&allocator->active, FALSE);
+
+done:
+ GST_OBJECT_UNLOCK (allocator);
+ return ret;
+
+reqbufs_failed:
+ {
+ GST_ERROR_OBJECT (allocator,
+ "error releasing buffers buffers: %s", g_strerror (errno));
+ ret = GST_V4L2_ERROR;
+ goto done;
+ }
+}
+
+GstV4l2MemoryGroup *
+gst_v4l2_allocator_alloc_mmap (GstV4l2Allocator * allocator)
+{
+ GstV4l2MemoryGroup *group;
+ gint i;
+
+ g_return_val_if_fail (allocator->memory == V4L2_MEMORY_MMAP, NULL);
+
+ group = gst_v4l2_allocator_alloc (allocator);
+
+ if (group == NULL)
+ return NULL;
+
+ for (i = 0; i < group->n_mem; i++) {
+ if (group->mem[i] == NULL) {
+ gpointer data;
+ data = v4l2_mmap (NULL, group->planes[i].length, PROT_READ | PROT_WRITE,
+ MAP_SHARED, allocator->video_fd, group->planes[i].m.mem_offset);
+
+ if (data == MAP_FAILED)
+ goto mmap_failed;
+
+ GST_LOG_OBJECT (allocator,
+ "mmap buffer length %d, data offset %d, plane %d",
+ group->planes[i].length, group->planes[i].data_offset, i);
+
+ group->mem[i] = (GstMemory *) _v4l2mem_new (0, GST_ALLOCATOR (allocator),
+ NULL, group->planes[i].length, 0, 0, group->planes[i].length, i,
+ data, -1, group);
+ } else {
+ /* Take back the allocator reference */
+ gst_object_ref (allocator);
+ }
+
+ group->mems_allocated++;
+ }
+
+ /* Ensure group size. Unlike GST, v4l2 have size (bytesused) initially set
+ * to 0. As length might be bigger then the expected size exposed in the
+ * format, we simply set bytesused initially and reset it here for
+ * simplicity */
+ gst_v4l2_allocator_reset_size (allocator, group);
+
+ return group;
+
+mmap_failed:
+ {
+ GST_ERROR_OBJECT (allocator, "Failed to mmap buffer: %s",
+ g_strerror (errno));
+ _cleanup_failed_alloc (allocator, group);
+ return NULL;
+ }
+}
+
+GstV4l2MemoryGroup *
+gst_v4l2_allocator_alloc_dmabuf (GstV4l2Allocator * allocator,
+ GstAllocator * dmabuf_allocator)
+{
+ GstV4l2MemoryGroup *group;
+ gint i;
+
+ g_return_val_if_fail (allocator->memory == V4L2_MEMORY_MMAP, NULL);
+
+ group = gst_v4l2_allocator_alloc (allocator);
+
+ if (group == NULL)
+ return NULL;
+
+ for (i = 0; i < group->n_mem; i++) {
+ GstV4l2Memory *mem;
+ GstMemory *dma_mem;
+ gint dmafd;
+
+ if (group->mem[i] == NULL) {
+ struct v4l2_exportbuffer expbuf = { 0 };
+
+ expbuf.type = allocator->type;
+ expbuf.index = group->buffer.index;
+ expbuf.plane = i;
+ expbuf.flags = O_CLOEXEC | O_RDWR;
+
+ if (v4l2_ioctl (allocator->video_fd, VIDIOC_EXPBUF, &expbuf) < 0)
+ goto expbuf_failed;
+
+ GST_LOG_OBJECT (allocator, "exported DMABUF as fd %i plane %d",
+ expbuf.fd, i);
+
+ group->mem[i] = (GstMemory *) _v4l2mem_new (0, GST_ALLOCATOR (allocator),
+ NULL, group->planes[i].length, 0, 0, group->planes[i].length, i,
+ NULL, expbuf.fd, group);
+ } else {
+ /* Take back the allocator reference */
+ gst_object_ref (allocator);
+ }
+
+ g_assert (gst_is_v4l2_memory (group->mem[i]));
+ mem = (GstV4l2Memory *) group->mem[i];
+
+ if ((dmafd = dup (mem->dmafd)) < 0)
+ goto dup_failed;
+
+ dma_mem = gst_dmabuf_allocator_alloc (dmabuf_allocator, dmafd,
+ mem->mem.maxsize);
+ _v4l2mem_parent_to_dmabuf (mem, dma_mem);
+
+ group->mem[i] = dma_mem;
+ group->mems_allocated++;
+ }
+
+ gst_v4l2_allocator_reset_size (allocator, group);
+
+ return group;
+
+expbuf_failed:
+ {
+ GST_ERROR_OBJECT (allocator, "Failed to export DMABUF: %s",
+ g_strerror (errno));
+ goto cleanup;
+ }
+dup_failed:
+ {
+ GST_ERROR_OBJECT (allocator, "Failed to dup DMABUF descriptor: %s",
+ g_strerror (errno));
+ goto cleanup;
+ }
+cleanup:
+ {
+ _cleanup_failed_alloc (allocator, group);
+ return NULL;
+ }
+}
+
+static void
+gst_v4l2_allocator_clear_dmabufin (GstV4l2Allocator * allocator,
+ GstV4l2MemoryGroup * group)
+{
+ GstV4l2Memory *mem;
+ gint i;
+
+ g_return_if_fail (allocator->memory == V4L2_MEMORY_DMABUF);
+
+ for (i = 0; i < group->n_mem; i++) {
+
+ mem = (GstV4l2Memory *) group->mem[i];
+
+ GST_LOG_OBJECT (allocator, "clearing DMABUF import, fd %i plane %d",
+ mem->dmafd, i);
+
+ if (mem->dmafd >= 0)
+ close (mem->dmafd);
+
+ /* Update memory */
+ mem->mem.maxsize = 0;
+ mem->mem.offset = 0;
+ mem->mem.size = 0;
+ mem->dmafd = -1;
+
+ /* Update v4l2 structure */
+ group->planes[i].length = 0;
+ group->planes[i].bytesused = 0;
+ group->planes[i].m.fd = -1;
+ group->planes[i].data_offset = 0;
+ }
+
+ if (!V4L2_TYPE_IS_MULTIPLANAR (allocator->type)) {
+ group->buffer.bytesused = 0;
+ group->buffer.length = 0;
+ group->buffer.m.fd = -1;
+ }
+}
+
+GstV4l2MemoryGroup *
+gst_v4l2_allocator_alloc_dmabufin (GstV4l2Allocator * allocator)
+{
+ GstV4l2MemoryGroup *group;
+ gint i;
+
+ g_return_val_if_fail (allocator->memory == V4L2_MEMORY_DMABUF, NULL);
+
+ group = gst_v4l2_allocator_alloc (allocator);
+
+ if (group == NULL)
+ return NULL;
+
+ GST_LOG_OBJECT (allocator, "allocating empty DMABUF import group");
+
+ for (i = 0; i < group->n_mem; i++) {
+ if (group->mem[i] == NULL) {
+ group->mem[i] = (GstMemory *) _v4l2mem_new (0, GST_ALLOCATOR (allocator),
+ NULL, 0, 0, 0, 0, i, NULL, -1, group);
+ } else {
+ /* Take back the allocator reference */
+ gst_object_ref (allocator);
+ }
+
+ group->mems_allocated++;
+ }
+
+ gst_v4l2_allocator_clear_dmabufin (allocator, group);
+
+ return group;
+}
+
+static void
+gst_v4l2_allocator_clear_userptr (GstV4l2Allocator * allocator,
+ GstV4l2MemoryGroup * group)
+{
+ GstV4l2Memory *mem;
+ gint i;
+
+ g_return_if_fail (allocator->memory == V4L2_MEMORY_USERPTR);
+
+ for (i = 0; i < group->n_mem; i++) {
+ mem = (GstV4l2Memory *) group->mem[i];
+
+ GST_LOG_OBJECT (allocator, "clearing USERPTR %p plane %d size %"
+ G_GSIZE_FORMAT, mem->data, i, mem->mem.size);
+
+ mem->mem.maxsize = 0;
+ mem->mem.size = 0;
+ mem->data = NULL;
+
+ group->planes[i].length = 0;
+ group->planes[i].bytesused = 0;
+ group->planes[i].m.userptr = 0;
+ }
+
+ if (!V4L2_TYPE_IS_MULTIPLANAR (allocator->type)) {
+ group->buffer.bytesused = 0;
+ group->buffer.length = 0;
+ group->buffer.m.userptr = 0;
+ }
+}
+
+GstV4l2MemoryGroup *
+gst_v4l2_allocator_alloc_userptr (GstV4l2Allocator * allocator)
+{
+ GstV4l2MemoryGroup *group;
+ gint i;
+
+ g_return_val_if_fail (allocator->memory == V4L2_MEMORY_USERPTR, NULL);
+
+ group = gst_v4l2_allocator_alloc (allocator);
+
+ if (group == NULL)
+ return NULL;
+
+ GST_LOG_OBJECT (allocator, "allocating empty USERPTR group");
+
+ for (i = 0; i < group->n_mem; i++) {
+
+ if (group->mem[i] == NULL) {
+ group->mem[i] = (GstMemory *) _v4l2mem_new (0, GST_ALLOCATOR (allocator),
+ NULL, 0, 0, 0, 0, i, NULL, -1, group);
+ } else {
+ /* Take back the allocator reference */
+ gst_object_ref (allocator);
+ }
+
+ group->mems_allocated++;
+ }
+
+ gst_v4l2_allocator_clear_userptr (allocator, group);
+
+ return group;
+}
+
+gboolean
+gst_v4l2_allocator_import_dmabuf (GstV4l2Allocator * allocator,
+ GstV4l2MemoryGroup * group, gint n_mem, GstMemory ** dma_mem)
+{
+ GstV4l2Memory *mem;
+ gint i;
+
+ g_return_val_if_fail (allocator->memory == V4L2_MEMORY_DMABUF, FALSE);
+
+ if (group->n_mem != n_mem)
+ goto n_mem_missmatch;
+
+ for (i = 0; i < group->n_mem; i++) {
+ gint dmafd;
+ gsize size, offset, maxsize;
+
+ if (!gst_is_dmabuf_memory (dma_mem[i]))
+ goto not_dmabuf;
+
+ size = gst_memory_get_sizes (dma_mem[i], &offset, &maxsize);
+
+ if ((dmafd = dup (gst_dmabuf_memory_get_fd (dma_mem[i]))) < 0)
+ goto dup_failed;
+
+ GST_LOG_OBJECT (allocator, "imported DMABUF as fd %i plane %d", dmafd, i);
+
+ mem = (GstV4l2Memory *) group->mem[i];
+
+ /* Update memory */
+ mem->mem.maxsize = maxsize;
+ mem->mem.offset = offset;
+ mem->mem.size = size;
+ mem->dmafd = dmafd;
+
+ /* Update v4l2 structure */
+ group->planes[i].length = maxsize;
+ group->planes[i].bytesused = size;
+ group->planes[i].m.fd = dmafd;
+ group->planes[i].data_offset = offset;
+ }
+
+ /* Copy into buffer structure if not using planes */
+ if (!V4L2_TYPE_IS_MULTIPLANAR (allocator->type)) {
+ group->buffer.bytesused = group->planes[0].bytesused;
+ group->buffer.length = group->planes[0].length;
+ group->buffer.m.fd = group->planes[0].m.userptr;
+ } else {
+ group->buffer.length = group->n_mem;
+ }
+
+ return TRUE;
+
+n_mem_missmatch:
+ {
+ GST_ERROR_OBJECT (allocator, "Got %i dmabuf but needed %i", n_mem,
+ group->n_mem);
+ return FALSE;
+ }
+not_dmabuf:
+ {
+ GST_ERROR_OBJECT (allocator, "Memory %i is not of DMABUF", i);
+ return FALSE;
+ }
+dup_failed:
+ {
+ GST_ERROR_OBJECT (allocator, "Failed to dup DMABUF descriptor: %s",
+ g_strerror (errno));
+ return FALSE;
+ }
+}
+
+gboolean
+gst_v4l2_allocator_import_userptr (GstV4l2Allocator * allocator,
+ GstV4l2MemoryGroup * group, gsize img_size, int n_planes,
+ gpointer * data, gsize * offset)
+{
+ GstV4l2Memory *mem;
+ gint i;
+
+ g_return_val_if_fail (allocator->memory == V4L2_MEMORY_USERPTR, FALSE);
+
+ /* TODO Support passing N plane from 1 memory to MPLANE v4l2 format */
+ if (n_planes != group->n_mem)
+ goto n_mem_missmatch;
+
+ for (i = 0; i < group->n_mem; i++) {
+ gsize size, maxsize;
+
+ if (V4L2_TYPE_IS_MULTIPLANAR (allocator->type)) {
+ struct v4l2_pix_format_mplane *pix = &allocator->format.fmt.pix_mp;
+ maxsize = pix->plane_fmt[i].sizeimage;
+ } else {
+ maxsize = allocator->format.fmt.pix.sizeimage;
+ }
+
+ if ((i + 1) == n_planes) {
+ size = img_size - offset[i];
+ } else {
+ size = offset[i + 1] - offset[i];
+ }
+
+ g_assert (size <= img_size);
+
+ GST_LOG_OBJECT (allocator, "imported USERPTR %p plane %d size %"
+ G_GSIZE_FORMAT, data[i], i, size);
+
+ mem = (GstV4l2Memory *) group->mem[i];
+
+ mem->mem.maxsize = maxsize;
+ mem->mem.size = size;
+ mem->data = data[i];
+
+ group->planes[i].length = maxsize;
+ group->planes[i].bytesused = size;
+ group->planes[i].m.userptr = (unsigned long) data[i];
+ group->planes[i].data_offset = 0;
+ }
+
+ /* Copy into buffer structure if not using planes */
+ if (!V4L2_TYPE_IS_MULTIPLANAR (allocator->type)) {
+ group->buffer.bytesused = group->planes[0].bytesused;
+ group->buffer.length = group->planes[0].length;
+ group->buffer.m.userptr = group->planes[0].m.userptr;
+ } else {
+ group->buffer.length = group->n_mem;
+ }
+
+ return TRUE;
+
+n_mem_missmatch:
+ {
+ GST_ERROR_OBJECT (allocator, "Got %i userptr plane while driver need %i",
+ n_planes, group->n_mem);
+ return FALSE;
+ }
+}
+
+void
+gst_v4l2_allocator_flush (GstV4l2Allocator * allocator)
+{
+ gint i;
+
+ GST_OBJECT_LOCK (allocator);
+
+ if (!g_atomic_int_get (&allocator->active))
+ goto done;
+
+ for (i = 0; i < allocator->count; i++) {
+ GstV4l2MemoryGroup *group = allocator->groups[i];
+ gint n;
+
+ if (IS_QUEUED (group->buffer)) {
+ UNSET_QUEUED (group->buffer);
+
+ gst_v4l2_allocator_reset_group (allocator, group);
+
+ for (n = 0; n < group->n_mem; n++)
+ gst_memory_unref (group->mem[n]);
+ }
+ }
+
+done:
+ GST_OBJECT_UNLOCK (allocator);
+}
+
+gboolean
+gst_v4l2_allocator_qbuf (GstV4l2Allocator * allocator,
+ GstV4l2MemoryGroup * group)
+{
+ gboolean ret = TRUE;
+ gint i;
+
+ /* update sizes */
+ if (V4L2_TYPE_IS_MULTIPLANAR (allocator->type)) {
+ for (i = 0; i < group->n_mem; i++)
+ group->planes[i].bytesused =
+ gst_memory_get_sizes (group->mem[i], NULL, NULL);
+ } else {
+ group->buffer.bytesused = gst_memory_get_sizes (group->mem[0], NULL, NULL);
+ }
+
+ if (v4l2_ioctl (allocator->video_fd, VIDIOC_QBUF, &group->buffer) < 0) {
+ GST_ERROR_OBJECT (allocator, "failed queing buffer %i: %s",
+ group->buffer.index, g_strerror (errno));
+ ret = FALSE;
+ if (IS_QUEUED (group->buffer)) {
+ GST_DEBUG_OBJECT (allocator,
+ "driver pretends buffer is queued even if queue failed");
+ UNSET_QUEUED (group->buffer);
+ }
+ goto done;
+ }
+
+ GST_LOG_OBJECT (allocator, "queued buffer %i (flags 0x%X)",
+ group->buffer.index, group->buffer.flags);
+
+ if (!IS_QUEUED (group->buffer)) {
+ GST_DEBUG_OBJECT (allocator,
+ "driver pretends buffer is not queued even if queue succeeded");
+ SET_QUEUED (group->buffer);
+ }
+
+ /* Ensure the memory will stay around and is RO */
+ for (i = 0; i < group->n_mem; i++)
+ gst_memory_ref (group->mem[i]);
+
+done:
+ return ret;
+}
+
+GstV4l2MemoryGroup *
+gst_v4l2_allocator_dqbuf (GstV4l2Allocator * allocator)
+{
+ struct v4l2_buffer buffer = { 0 };
+ struct v4l2_plane planes[VIDEO_MAX_PLANES] = { {0} };
+ gint i;
+
+ GstV4l2MemoryGroup *group = NULL;
+
+ buffer.type = allocator->type;
+ buffer.memory = allocator->memory;
+
+ if (V4L2_TYPE_IS_MULTIPLANAR (allocator->type)) {
+ buffer.length = allocator->format.fmt.pix_mp.num_planes;
+ buffer.m.planes = planes;
+ }
+
+ if (v4l2_ioctl (allocator->video_fd, VIDIOC_DQBUF, &buffer) < 0)
+ goto error;
+
+ group = allocator->groups[buffer.index];
+ group->buffer = buffer;
+
+ GST_LOG_OBJECT (allocator, "dequeued buffer %i (flags 0x%X)", buffer.index,
+ buffer.flags);
+
+ if (IS_QUEUED (group->buffer)) {
+ GST_DEBUG_OBJECT (allocator,
+ "driver pretends buffer is queued even if dequeue succeeded");
+ UNSET_QUEUED (group->buffer);
+ }
+
+ if (V4L2_TYPE_IS_MULTIPLANAR (allocator->type)) {
+ group->buffer.m.planes = group->planes;
+ memcpy (group->planes, buffer.m.planes, sizeof (planes));
+ } else {
+ group->planes[0].bytesused = group->buffer.bytesused;
+ group->planes[0].length = group->buffer.length;
+ g_assert (sizeof (group->planes[0].m) == sizeof (group->buffer.m));
+ memcpy (&group->planes[0].m, &group->buffer.m, sizeof (group->buffer.m));
+ }
+
+ /* And update memory size */
+ if (V4L2_TYPE_IS_OUTPUT (allocator->type)) {
+ gst_v4l2_allocator_reset_size (allocator, group);
+ } else {
+ /* for capture, simply read the size */
+ for (i = 0; i < group->n_mem; i++) {
+ gst_memory_resize (group->mem[i], 0, group->planes[i].bytesused);
+ }
+ }
+
+ /* Release the memory, possibly making it RW again */
+ for (i = 0; i < group->n_mem; i++)
+ gst_memory_unref (group->mem[i]);
+
+ return group;
+
+error:
+ GST_ERROR_OBJECT (allocator, "failed dequeuing a %s buffer: %s",
+ memory_type_to_str (allocator->memory), g_strerror (errno));
+
+ switch (errno) {
+ case EAGAIN:
+ GST_WARNING_OBJECT (allocator,
+ "Non-blocking I/O has been selected using O_NONBLOCK and"
+ " no buffer was in the outgoing queue.");
+ break;
+ case EINVAL:
+ GST_ERROR_OBJECT (allocator,
+ "The buffer type is not supported, or the index is out of bounds, "
+ "or no buffers have been allocated yet, or the userptr "
+ "or length are invalid.");
+ break;
+ case ENOMEM:
+ GST_ERROR_OBJECT (allocator,
+ "insufficient memory to enqueue a user pointer buffer");
+ break;
+ case EIO:
+ GST_INFO_OBJECT (allocator,
+ "VIDIOC_DQBUF failed due to an internal error."
+ " Can also indicate temporary problems like signal loss."
+ " Note the driver might dequeue an (empty) buffer despite"
+ " returning an error, or even stop capturing.");
+ /* have we de-queued a buffer ? */
+ if (!IS_QUEUED (buffer)) {
+ GST_DEBUG_OBJECT (allocator, "reenqueing buffer");
+ /* FIXME ... should we do something here? */
+ }
+ break;
+ case EINTR:
+ GST_WARNING_OBJECT (allocator, "could not sync on a buffer on device");
+ break;
+ default:
+ GST_WARNING_OBJECT (allocator,
+ "Grabbing frame got interrupted unexpectedly. %d: %s.", errno,
+ g_strerror (errno));
+ break;
+ }
+
+ return NULL;
+}
+
+void
+gst_v4l2_allocator_reset_group (GstV4l2Allocator * allocator,
+ GstV4l2MemoryGroup * group)
+{
+ switch (allocator->memory) {
+ case V4L2_MEMORY_USERPTR:
+ gst_v4l2_allocator_clear_userptr (allocator, group);
+ break;
+ case V4L2_MEMORY_DMABUF:
+ gst_v4l2_allocator_clear_dmabufin (allocator, group);
+ break;
+ case V4L2_MEMORY_MMAP:
+ break;
+ default:
+ g_assert_not_reached ();
+ break;
+ }
+
+ gst_v4l2_allocator_reset_size (allocator, group);
+}
+
+gsize
+gst_v4l2_allocator_num_allocated (GstV4l2Allocator * allocator)
+{
+ gsize num_allocated;
+
+ GST_OBJECT_LOCK (allocator);
+
+ num_allocated = allocator->count;
+
+ GST_OBJECT_UNLOCK (allocator);
+
+ return num_allocated;
+}
diff --git a/sys/v4l2/gstv4l2allocator.h b/sys/v4l2/gstv4l2allocator.h
new file mode 100644
index 00000000..54cf1cbc
--- /dev/null
+++ b/sys/v4l2/gstv4l2allocator.h
@@ -0,0 +1,156 @@
+/*
+ * Copyright (C) 2014 Collabora Ltd.
+ * Author: Nicolas Dufresne <nicolas.dufresne@collabora.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ */
+
+
+#ifndef __GST_V4L2_ALLOCATOR_H__
+#define __GST_V4L2_ALLOCATOR_H__
+
+#include "ext/videodev2.h"
+#include <gst/gst.h>
+#include <gst/gstatomicqueue.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_V4L2_ALLOCATOR (gst_v4l2_allocator_get_type())
+#define GST_IS_V4L2_ALLOCATOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_V4L2_ALLOCATOR))
+#define GST_IS_V4L2_ALLOCATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_V4L2_ALLOCATOR))
+#define GST_V4L2_ALLOCATOR_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_V4L2_ALLOCATOR, GstV4l2AllocatorClass))
+#define GST_V4L2_ALLOCATOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_V4L2_ALLOCATOR, GstV4l2Allocator))
+#define GST_V4L2_ALLOCATOR_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_V4L2_ALLOCATOR, GstV4l2AllocatorClass))
+#define GST_V4L2_ALLOCATOR_CAST(obj) ((GstV4l2Allocator *)(obj))
+
+#define GST_V4L2_ALLOCATOR_CAN_REQUEST(obj,type) \
+ (GST_OBJECT_FLAG_IS_SET (obj, GST_V4L2_ALLOCATOR_FLAG_ ## type ## _REQBUFS))
+#define GST_V4L2_ALLOCATOR_CAN_ALLOCATE(obj,type) \
+ (GST_OBJECT_FLAG_IS_SET (obj, GST_V4L2_ALLOCATOR_FLAG_ ## type ## _CREATE_BUFS))
+
+typedef struct _GstV4l2Allocator GstV4l2Allocator;
+typedef struct _GstV4l2AllocatorClass GstV4l2AllocatorClass;
+typedef struct _GstV4l2MemoryGroup GstV4l2MemoryGroup;
+typedef struct _GstV4l2Memory GstV4l2Memory;
+typedef enum _GstV4l2Capabilities GstV4l2Capabilities;
+typedef enum _GstV4l2Return GstV4l2Return;
+
+enum _GstV4l2AllocatorFlags
+{
+ GST_V4L2_ALLOCATOR_FLAG_MMAP_REQBUFS = (GST_ALLOCATOR_FLAG_LAST << 0),
+ GST_V4L2_ALLOCATOR_FLAG_MMAP_CREATE_BUFS = (GST_ALLOCATOR_FLAG_LAST << 1),
+ GST_V4L2_ALLOCATOR_FLAG_USERPTR_REQBUFS = (GST_ALLOCATOR_FLAG_LAST << 2),
+ GST_V4L2_ALLOCATOR_FLAG_USERPTR_CREATE_BUFS = (GST_ALLOCATOR_FLAG_LAST << 3),
+ GST_V4L2_ALLOCATOR_FLAG_DMABUF_REQBUFS = (GST_ALLOCATOR_FLAG_LAST << 4),
+ GST_V4L2_ALLOCATOR_FLAG_DMABUF_CREATE_BUFS = (GST_ALLOCATOR_FLAG_LAST << 5),
+};
+
+enum _GstV4l2Return
+{
+ GST_V4L2_OK = 0,
+ GST_V4L2_ERROR = -1,
+ GST_V4L2_BUSY = -2
+};
+
+struct _GstV4l2Memory
+{
+ GstMemory mem;
+ gint plane;
+ GstV4l2MemoryGroup *group;
+ gpointer data;
+ gint dmafd;
+};
+
+struct _GstV4l2MemoryGroup
+{
+ gint n_mem;
+ GstMemory * mem[VIDEO_MAX_PLANES];
+ gint mems_allocated;
+ struct v4l2_buffer buffer;
+ struct v4l2_plane planes[VIDEO_MAX_PLANES];
+};
+
+struct _GstV4l2Allocator
+{
+ GstAllocator parent;
+ gint video_fd;
+ guint32 count;
+ guint32 type;
+ guint32 memory;
+ struct v4l2_format format;
+ gboolean can_allocate;
+ gboolean active;
+
+ GstV4l2MemoryGroup * groups[VIDEO_MAX_FRAME];
+ GstAtomicQueue *free_queue;
+ GstAtomicQueue *pending_queue;
+
+};
+
+struct _GstV4l2AllocatorClass {
+ GstAllocatorClass parent_class;
+};
+
+GType gst_v4l2_allocator_get_type(void);
+
+gboolean gst_is_v4l2_memory (GstMemory * mem);
+
+gboolean gst_v4l2_allocator_is_active (GstV4l2Allocator * allocator);
+
+guint gst_v4l2_allocator_get_size (GstV4l2Allocator * allocator);
+
+GstV4l2Allocator* gst_v4l2_allocator_new (GstObject *parent, gint video_fd,
+ struct v4l2_format * format);
+
+guint gst_v4l2_allocator_start (GstV4l2Allocator * allocator,
+ guint32 count, guint32 memory);
+
+gboolean gst_v4l2_allocator_stop (GstV4l2Allocator * allocator);
+
+GstV4l2MemoryGroup* gst_v4l2_allocator_alloc_mmap (GstV4l2Allocator * allocator);
+
+GstV4l2MemoryGroup* gst_v4l2_allocator_alloc_dmabuf (GstV4l2Allocator * allocator,
+ GstAllocator * dmabuf_allocator);
+
+GstV4l2MemoryGroup * gst_v4l2_allocator_alloc_dmabufin (GstV4l2Allocator * allocator);
+
+GstV4l2MemoryGroup * gst_v4l2_allocator_alloc_userptr (GstV4l2Allocator * allocator);
+
+gboolean gst_v4l2_allocator_import_dmabuf (GstV4l2Allocator * allocator,
+ GstV4l2MemoryGroup *group,
+ gint n_mem, GstMemory ** dma_mem);
+
+gboolean gst_v4l2_allocator_import_userptr (GstV4l2Allocator * allocator,
+ GstV4l2MemoryGroup *group,
+ gsize img_size, int n_planes,
+ gpointer * data, gsize * offset);
+
+void gst_v4l2_allocator_flush (GstV4l2Allocator * allocator);
+
+gboolean gst_v4l2_allocator_qbuf (GstV4l2Allocator * allocator,
+ GstV4l2MemoryGroup * group);
+
+GstV4l2MemoryGroup* gst_v4l2_allocator_dqbuf (GstV4l2Allocator * allocator);
+
+void gst_v4l2_allocator_reset_group (GstV4l2Allocator * allocator,
+ GstV4l2MemoryGroup * group);
+
+gsize gst_v4l2_allocator_num_allocated (GstV4l2Allocator * allocator);
+
+G_END_DECLS
+
+#endif /* __GST_V4L2_ALLOCATOR_H__ */
diff --git a/sys/v4l2/gstv4l2bufferpool.c b/sys/v4l2/gstv4l2bufferpool.c
index 5e669c90..f213769d 100644
--- a/sys/v4l2/gstv4l2bufferpool.c
+++ b/sys/v4l2/gstv4l2bufferpool.c
@@ -47,39 +47,11 @@
#include <gst/glib-compat-private.h>
GST_DEBUG_CATEGORY_EXTERN (v4l2_debug);
+GST_DEBUG_CATEGORY_EXTERN (GST_CAT_PERFORMANCE);
#define GST_CAT_DEFAULT v4l2_debug
-/*
- * GstV4l2Buffer:
- */
-GType
-gst_v4l2_meta_api_get_type (void)
-{
- static volatile GType type;
- static const gchar *tags[] =
- { GST_META_TAG_VIDEO_STR, GST_META_TAG_MEMORY_STR, NULL };
+#define GST_V4L2_IMPORT_QUARK gst_v4l2_buffer_pool_import_quark ()
- if (g_once_init_enter (&type)) {
- GType _type = gst_meta_api_type_register ("GstV4l2MetaAPI", tags);
- g_once_init_leave (&type, _type);
- }
- return type;
-}
-
-const GstMetaInfo *
-gst_v4l2_meta_get_info (void)
-{
- static const GstMetaInfo *meta_info = NULL;
-
- if (g_once_init_enter (&meta_info)) {
- const GstMetaInfo *meta =
- gst_meta_register (gst_v4l2_meta_api_get_type (), "GstV4l2Meta",
- sizeof (GstV4l2Meta), (GstMetaInitFunction) NULL,
- (GstMetaFreeFunction) NULL, (GstMetaTransformFunction) NULL);
- g_once_init_leave (&meta_info, meta);
- }
- return meta_info;
-}
/*
* GstV4l2BufferPool:
@@ -87,318 +59,357 @@ gst_v4l2_meta_get_info (void)
#define gst_v4l2_buffer_pool_parent_class parent_class
G_DEFINE_TYPE (GstV4l2BufferPool, gst_v4l2_buffer_pool, GST_TYPE_BUFFER_POOL);
+enum _GstV4l2BufferPoolAcquireFlags
+{
+ GST_V4L2_POOL_ACQUIRE_FLAG_RESURECT = GST_BUFFER_POOL_ACQUIRE_FLAG_LAST,
+ GST_V4L2_BUFFER_POOL_ACQUIRE_FAG_LAST
+};
+
static void gst_v4l2_buffer_pool_release_buffer (GstBufferPool * bpool,
GstBuffer * buffer);
-static void
-gst_v4l2_buffer_pool_free_buffer (GstBufferPool * bpool, GstBuffer * buffer)
+static gboolean
+gst_v4l2_is_buffer_valid (GstBuffer * buffer, GstV4l2MemoryGroup ** group)
{
- GstV4l2BufferPool *pool = GST_V4L2_BUFFER_POOL (bpool);
- GstV4l2Object *obj;
+ GstMemory *mem = gst_buffer_peek_memory (buffer, 0);
+ gboolean valid = FALSE;
- obj = pool->obj;
+ if (GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_TAG_MEMORY))
+ goto done;
- switch (obj->mode) {
- case GST_V4L2_IO_RW:
- case GST_V4L2_IO_DMABUF:
- break;
- case GST_V4L2_IO_MMAP:
- {
- GstV4l2Meta *meta;
- gint index;
- gint i = 0;
-
- meta = GST_V4L2_META_GET (buffer);
- g_assert (meta != NULL);
-
- index = meta->vbuffer.index;
+ if (gst_is_dmabuf_memory (mem))
+ mem = mem->parent;
- for (i = 0; i < meta->n_planes; i++) {
- GST_LOG_OBJECT (pool,
- "unmap multiplanar buffer %p idx %d (data %p, len %u, plane %u)",
- buffer, index, meta->mem[i], meta->vplanes[i].length, i);
-
- v4l2_munmap (meta->mem[i], meta->vplanes[i].length);
- }
-
- pool->buffers[index] = NULL;
- break;
- }
- case GST_V4L2_IO_USERPTR:
- default:
- g_assert_not_reached ();
- break;
+ if (gst_is_v4l2_memory (mem)) {
+ GstV4l2Memory *vmem = (GstV4l2Memory *) mem;
+ valid = TRUE;
+ if (group)
+ *group = vmem->group;
}
- gst_buffer_unref (buffer);
+
+done:
+ return valid;
}
static GstFlowReturn
-gst_v4l2_buffer_pool_alloc_buffer (GstBufferPool * bpool, GstBuffer ** buffer,
- GstBufferPoolAcquireParams * params)
+gst_v4l2_buffer_pool_copy_buffer (GstV4l2BufferPool * pool, GstBuffer * dest,
+ GstBuffer * src)
{
- GstV4l2BufferPool *pool = GST_V4L2_BUFFER_POOL (bpool);
- GstBuffer *newbuf;
- GstV4l2Meta *meta;
- GstV4l2Object *obj;
- GstVideoInfo *info;
- guint index;
- gint i;
+ const GstVideoFormatInfo *finfo = pool->caps_info.finfo;
- obj = pool->obj;
- info = &obj->info;
+ GST_LOG_OBJECT (pool, "copying buffer");
- switch (obj->mode) {
- case GST_V4L2_IO_RW:
- {
- newbuf =
- gst_buffer_new_allocate (pool->allocator, pool->size, &pool->params);
- break;
+ if (finfo && (finfo->format != GST_VIDEO_FORMAT_UNKNOWN &&
+ finfo->format != GST_VIDEO_FORMAT_ENCODED)) {
+ GstVideoFrame src_frame, dest_frame;
+
+ GST_DEBUG_OBJECT (pool, "copy video frame");
+
+ /* we have raw video, use videoframe copy to get strides right */
+ if (!gst_video_frame_map (&src_frame, &pool->caps_info, src, GST_MAP_READ))
+ goto invalid_buffer;
+
+ if (!gst_video_frame_map (&dest_frame, &pool->caps_info, dest,
+ GST_MAP_WRITE)) {
+ gst_video_frame_unmap (&src_frame);
+ goto invalid_buffer;
}
- case GST_V4L2_IO_MMAP:
- case GST_V4L2_IO_DMABUF:
- {
- if (pool->num_allocated == pool->num_buffers) {
- struct v4l2_create_buffers create_bufs;
- memset (&create_bufs, 0, sizeof (struct v4l2_create_buffers));
- create_bufs.count = 1;
- create_bufs.memory = V4L2_MEMORY_MMAP;
- create_bufs.format.type = obj->type;
+ gst_video_frame_copy (&dest_frame, &src_frame);
- if (v4l2_ioctl (pool->video_fd, VIDIOC_G_FMT, &create_bufs.format) < 0)
- goto g_fmt_failed;
+ gst_video_frame_unmap (&src_frame);
+ gst_video_frame_unmap (&dest_frame);
+ } else {
+ GstMapInfo map;
- if (v4l2_ioctl (pool->video_fd, VIDIOC_CREATE_BUFS, &create_bufs) < 0)
- goto create_bufs_failed;
+ GST_DEBUG_OBJECT (pool, "copy raw bytes");
- GST_LOG_OBJECT (pool, "created buffer with index: %u",
- create_bufs.index);
- pool->num_buffers++;
- pool->buffers = g_renew (GstBuffer *, pool->buffers, pool->num_buffers);
- pool->buffers[pool->num_buffers - 1] = NULL;
- }
+ if (!gst_buffer_map (src, &map, GST_MAP_READ))
+ goto invalid_buffer;
- newbuf = gst_buffer_new ();
- meta = GST_V4L2_META_ADD (newbuf);
+ gst_buffer_fill (dest, 0, map.data, gst_buffer_get_size (src));
- index = pool->num_allocated;
+ gst_buffer_unmap (src, &map);
+ gst_buffer_resize (dest, 0, gst_buffer_get_size (src));
+ }
- GST_LOG_OBJECT (pool, "creating buffer %u, %p", index, newbuf);
+ GST_CAT_LOG_OBJECT (GST_CAT_PERFORMANCE, pool, "slow copy into buffer %p",
+ dest);
- /* prepare the buffer */
- memset (&meta->vbuffer, 0x0, sizeof (struct v4l2_buffer));
- meta->vbuffer.index = index;
- meta->vbuffer.type = obj->type;
- meta->vbuffer.memory = V4L2_MEMORY_MMAP;
+ return GST_FLOW_OK;
- /* main information */
- meta->n_planes = obj->n_v4l2_planes;
+invalid_buffer:
+ {
+ GST_ERROR_OBJECT (pool, "could not map buffer");
+ return GST_FLOW_ERROR;
+ }
+}
- /* prepare the planes of the buffer */
- if (V4L2_TYPE_IS_MULTIPLANAR (obj->type)) {
- /* length is the number of elements in the
- * vplanes array */
- meta->vbuffer.length = obj->n_v4l2_planes;
- meta->vbuffer.m.planes = meta->vplanes;
- }
+struct UserPtrData
+{
+ GstBuffer *buffer;
+ gboolean is_frame;
+ GstVideoFrame frame;
+ GstMapInfo map;
+};
- /* the buffer is prepared, now fill in it with meaningful values */
- if (v4l2_ioctl (pool->video_fd, VIDIOC_QUERYBUF, &meta->vbuffer) < 0)
- goto querybuf_failed;
-
- /* in non MPLANE mode we emulate one plane in order to
- * factorize the code */
- if (!V4L2_TYPE_IS_MULTIPLANAR (obj->type)) {
- /* here meta->n_planes == 1 */
- meta->vplanes[0].length = meta->vbuffer.length;
- meta->vplanes[0].bytesused = meta->vbuffer.bytesused;
- meta->vplanes[0].m.mem_offset = meta->vbuffer.m.offset;
- meta->vplanes[0].data_offset = 0;
- }
+static GQuark
+gst_v4l2_buffer_pool_import_quark (void)
+{
+ static GQuark quark = 0;
- GST_LOG_OBJECT (pool, " index: %u", meta->vbuffer.index);
- GST_LOG_OBJECT (pool, " type: %d", meta->vbuffer.type);
- GST_LOG_OBJECT (pool, " flags: %08x", meta->vbuffer.flags);
- GST_LOG_OBJECT (pool, " field: %d", meta->vbuffer.field);
- GST_LOG_OBJECT (pool, " memory: %d", meta->vbuffer.memory);
- GST_LOG_OBJECT (pool, " planes: %d", meta->n_planes);
+ if (quark == 0)
+ quark = g_quark_from_string ("GstV4l2BufferPoolUsePtrData");
-#ifndef GST_DISABLE_GST_DEBUG
- if (meta->vbuffer.memory == V4L2_MEMORY_MMAP) {
- for (i = 0; i < meta->n_planes; i++) {
- GST_LOG_OBJECT (pool, " bytesused: %u, plane: %u",
- meta->vplanes[i].bytesused, i);
- GST_LOG_OBJECT (pool, " MMAP offset: %u, plane: %u",
- meta->vplanes[i].m.mem_offset, i);
- }
- }
-#endif
+ return quark;
+}
- if (obj->mode == GST_V4L2_IO_MMAP) {
- /* append one gstmemory for each plane */
- for (i = 0; i < meta->n_planes; i++) {
- meta->mem[i] = v4l2_mmap (0, meta->vplanes[i].length,
- PROT_READ | PROT_WRITE, MAP_SHARED, pool->video_fd,
- meta->vplanes[i].m.mem_offset);
- if (meta->mem[i] == MAP_FAILED)
- goto mmap_failed;
-
- GST_LOG_OBJECT (pool, " buffer length %d, data offset %d, plane %d",
- meta->vplanes[i].length, meta->vplanes[i].data_offset, i);
-
- gst_buffer_append_memory (newbuf,
- gst_memory_new_wrapped (GST_MEMORY_FLAG_NO_SHARE,
- meta->mem[i], meta->vplanes[i].length,
- meta->vplanes[i].data_offset,
- meta->vplanes[i].length, NULL, NULL));
- }
- }
+static void
+_unmap_userptr_frame (struct UserPtrData *data)
+{
+ if (data->is_frame)
+ gst_video_frame_unmap (&data->frame);
+ else
+ gst_buffer_unmap (data->buffer, &data->map);
- if (obj->mode == GST_V4L2_IO_DMABUF) {
- struct v4l2_exportbuffer expbuf;
+ if (data->buffer)
+ gst_buffer_unref (data->buffer);
- memset (&expbuf, 0, sizeof (struct v4l2_exportbuffer));
- expbuf.type = meta->vbuffer.type;
- expbuf.index = meta->vbuffer.index;
- expbuf.flags = O_CLOEXEC;
+ g_slice_free (struct UserPtrData, data);
+}
- for (i = 0; i < meta->n_planes; i++) {
- expbuf.plane = i;
+static GstFlowReturn
+gst_v4l2_buffer_pool_import_userptr (GstV4l2BufferPool * pool,
+ GstBuffer * dest, GstBuffer * src)
+{
+ GstFlowReturn ret = GST_FLOW_OK;
+ GstV4l2MemoryGroup *group = NULL;
+ GstMapFlags flags;
+ const GstVideoFormatInfo *finfo = pool->caps_info.finfo;
+ struct UserPtrData *data = NULL;
- if (v4l2_ioctl (pool->video_fd, VIDIOC_EXPBUF, &expbuf) < 0)
- goto expbuf_failed;
+ GST_LOG_OBJECT (pool, "importing userptr");
- gst_buffer_append_memory (newbuf,
- gst_dmabuf_allocator_alloc (pool->allocator, expbuf.fd,
- meta->vplanes[i].length));
- }
+ /* get the group */
+ if (!gst_v4l2_is_buffer_valid (dest, &group))
+ goto not_our_buffer;
- meta->vbuffer.memory = V4L2_MEMORY_DMABUF;
+ if (!V4L2_TYPE_IS_OUTPUT (pool->obj->type))
+ flags = GST_MAP_READ;
+ else
+ flags = GST_MAP_WRITE;
- /* in non-MPLANE mode our meta is not automatically updated
- * because the plane is emulated (not referenced by
- * meta->vbuffer) */
- if (!V4L2_TYPE_IS_MULTIPLANAR (obj->type))
- meta->vplanes[0].m.fd = meta->vbuffer.m.fd;
- }
+ data = g_slice_new0 (struct UserPtrData);
- /* add metadata to raw video buffers */
- if (pool->add_videometa && info->finfo) {
- const GstVideoFormatInfo *finfo = info->finfo;
- gsize offset[GST_VIDEO_MAX_PLANES];
- gint width, height, n_gst_planes, offs, i, stride[GST_VIDEO_MAX_PLANES];
-
- width = GST_VIDEO_INFO_WIDTH (info);
- height = GST_VIDEO_INFO_HEIGHT (info);
-
- /* n_gst_planes is the number of planes
- * (RGB: 1, YUY2: 1, NV12: 2, I420: 3)
- * It's greater or equal than the number of v4l2 planes. */
- n_gst_planes = GST_VIDEO_INFO_N_PLANES (info);
-
- /* the basic are common between MPLANE mode and non MPLANE mode
- * except a special case inside the loop at the end
- */
- offs = 0;
- for (i = 0; i < n_gst_planes; i++) {
- GST_DEBUG_OBJECT (pool, "adding video meta, bytesperline %d",
- obj->bytesperline[i]);
-
- offset[i] = offs;
-
- if (GST_VIDEO_FORMAT_INFO_IS_TILED (finfo)) {
- guint x_tiles, y_tiles, ws, hs, tile_height;
-
- ws = GST_VIDEO_FORMAT_INFO_TILE_WS (finfo);
- hs = GST_VIDEO_FORMAT_INFO_TILE_HS (finfo);
- tile_height = 1 << hs;
-
- x_tiles = obj->bytesperline[i] >> ws;
- y_tiles = GST_VIDEO_FORMAT_INFO_SCALE_HEIGHT (finfo, i,
- GST_ROUND_UP_N (height, tile_height) >> hs);
- stride[i] = GST_VIDEO_TILE_MAKE_STRIDE (x_tiles, y_tiles);
- } else {
- stride[i] = obj->bytesperline[i];
- }
+ if (finfo && (finfo->format != GST_VIDEO_FORMAT_UNKNOWN &&
+ finfo->format != GST_VIDEO_FORMAT_ENCODED)) {
+ data->is_frame = TRUE;
- /* when using multiplanar mode and if there is more then one v4l
- * plane for each gst plane
- */
- if (V4L2_TYPE_IS_MULTIPLANAR (obj->type) && meta->n_planes > 1)
- /* non_contiguous case here so we have to make sure that gst goes to the
- * next plane (using default gstvideometa.c::default_map).
- * And the next plane is after length bytes of the previous one from
- * the gst buffer point of view. */
- offs += meta->vplanes[i].length;
- else
- offs += obj->bytesperline[i] *
- GST_VIDEO_FORMAT_INFO_SCALE_HEIGHT (finfo, i, height);
- }
+ if (!gst_video_frame_map (&data->frame, &pool->caps_info, src, flags))
+ goto invalid_buffer;
- gst_buffer_add_video_meta_full (newbuf, GST_VIDEO_FRAME_FLAG_NONE,
- GST_VIDEO_INFO_FORMAT (info), width, height, n_gst_planes,
- offset, stride);
- }
- break;
- }
- case GST_V4L2_IO_USERPTR:
- default:
- newbuf = NULL;
- g_assert_not_reached ();
+ if (!gst_v4l2_allocator_import_userptr (pool->vallocator, group,
+ data->frame.info.size, finfo->n_planes, data->frame.data,
+ data->frame.info.offset))
+ goto import_failed;
+ } else {
+ gsize offset[1] = { 0 };
+ gpointer ptr[1];
+
+ data->is_frame = FALSE;
+
+ if (!gst_buffer_map (src, &data->map, flags))
+ goto invalid_buffer;
+
+ ptr[0] = data->map.data;
+
+ if (!gst_v4l2_allocator_import_userptr (pool->vallocator, group,
+ data->map.size, 1, ptr, offset))
+ goto import_failed;
}
- pool->num_allocated++;
+ data->buffer = gst_buffer_ref (src);
- *buffer = newbuf;
+ gst_mini_object_set_qdata (GST_MINI_OBJECT (dest), GST_V4L2_IMPORT_QUARK,
+ data, (GDestroyNotify) _unmap_userptr_frame);
- return GST_FLOW_OK;
+ return ret;
- /* ERRORS */
-g_fmt_failed:
+not_our_buffer:
{
- gint errnosave = errno;
-
- GST_WARNING ("Failed G_FMT: %s", g_strerror (errnosave));
- errno = errnosave;
+ GST_ERROR_OBJECT (pool, "destination buffer invalid or not from our pool");
return GST_FLOW_ERROR;
}
-create_bufs_failed:
+invalid_buffer:
{
- gint errnosave = errno;
-
- GST_WARNING ("Failed CREATE_BUFS: %s", g_strerror (errnosave));
- errno = errnosave;
+ GST_ERROR_OBJECT (pool, "could not map buffer");
+ g_slice_free (struct UserPtrData, data);
return GST_FLOW_ERROR;
}
-querybuf_failed:
+import_failed:
{
- gint errnosave = errno;
+ GST_ERROR_OBJECT (pool, "failed to import data");
+ _unmap_userptr_frame (data);
+ return GST_FLOW_ERROR;
+ }
+}
+
+static GstFlowReturn
+gst_v4l2_buffer_pool_import_dmabuf (GstV4l2BufferPool * pool,
+ GstBuffer * dest, GstBuffer * src)
+{
+ GstV4l2MemoryGroup *group = NULL;
+ GstMemory *dma_mem[GST_VIDEO_MAX_PLANES] = { 0 };
+ guint n_mem = gst_buffer_n_memory (src);
+ gint i;
+
+ GST_LOG_OBJECT (pool, "importing dmabuf");
+
+ if (!gst_v4l2_is_buffer_valid (dest, &group))
+ goto not_our_buffer;
+
+ if (n_mem > GST_VIDEO_MAX_PLANES)
+ goto too_many_mems;
+
+ for (i = 0; i < n_mem; i++)
+ dma_mem[i] = gst_buffer_peek_memory (src, i);
+
+ if (!gst_v4l2_allocator_import_dmabuf (pool->vallocator, group, n_mem,
+ dma_mem))
+ goto import_failed;
+
+ gst_mini_object_set_qdata (GST_MINI_OBJECT (dest), GST_V4L2_IMPORT_QUARK,
+ gst_buffer_ref (src), (GDestroyNotify) gst_buffer_unref);
+
+ return GST_FLOW_OK;
- GST_WARNING ("Failed QUERYBUF: %s", g_strerror (errnosave));
- gst_buffer_unref (newbuf);
- errno = errnosave;
+not_our_buffer:
+ {
+ GST_ERROR_OBJECT (pool, "destination buffer invalid or not from our pool");
return GST_FLOW_ERROR;
}
-mmap_failed:
+too_many_mems:
{
- gint errnosave = errno;
-
- GST_WARNING ("Failed to mmap: %s", g_strerror (errnosave));
- gst_buffer_unref (newbuf);
- errno = errnosave;
+ GST_ERROR_OBJECT (pool, "could not map buffer");
return GST_FLOW_ERROR;
}
-expbuf_failed:
+import_failed:
{
- gint errnosave = errno;
-
- GST_WARNING ("Failed EXPBUF: %s", g_strerror (errnosave));
- gst_buffer_unref (newbuf);
- errno = errnosave;
+ GST_ERROR_OBJECT (pool, "failed to import dmabuf");
return GST_FLOW_ERROR;
}
}
+static GstFlowReturn
+gst_v4l2_buffer_pool_prepare_buffer (GstV4l2BufferPool * pool,
+ GstBuffer * dest, GstBuffer * src)
+{
+ GstFlowReturn ret = GST_FLOW_OK;
+ gboolean own_src = FALSE;
+
+ if (src == NULL) {
+ if (pool->other_pool == NULL) {
+ GST_ERROR_OBJECT (pool, "can't prepare buffer, source buffer missing");
+ return GST_FLOW_ERROR;
+ }
+
+ ret = gst_buffer_pool_acquire_buffer (pool->other_pool, &src, NULL);
+ if (ret != GST_FLOW_OK) {
+ GST_ERROR_OBJECT (pool, "failed to acquire buffer from downstream pool");
+ goto done;
+ }
+
+ own_src = TRUE;
+ }
+
+ switch (pool->obj->mode) {
+ case GST_V4L2_IO_MMAP:
+ case GST_V4L2_IO_DMABUF:
+ ret = gst_v4l2_buffer_pool_copy_buffer (pool, dest, src);
+ break;
+ case GST_V4L2_IO_USERPTR:
+ ret = gst_v4l2_buffer_pool_import_userptr (pool, dest, src);
+ break;
+ case GST_V4L2_IO_DMABUF_IMPORT:
+ ret = gst_v4l2_buffer_pool_import_dmabuf (pool, dest, src);
+ break;
+ default:
+ break;
+ }
+
+ if (own_src)
+ gst_buffer_unref (src);
+
+done:
+ return ret;
+}
+
+static GstFlowReturn
+gst_v4l2_buffer_pool_alloc_buffer (GstBufferPool * bpool, GstBuffer ** buffer,
+ GstBufferPoolAcquireParams * params)
+{
+ GstV4l2BufferPool *pool = GST_V4L2_BUFFER_POOL (bpool);
+ GstV4l2MemoryGroup *group = NULL;
+ GstBuffer *newbuf = NULL;
+ GstV4l2Object *obj;
+ GstVideoInfo *info;
+
+ obj = pool->obj;
+ info = &obj->info;
+
+ switch (obj->mode) {
+ case GST_V4L2_IO_RW:
+ newbuf =
+ gst_buffer_new_allocate (pool->allocator, pool->size, &pool->params);
+ break;
+ case GST_V4L2_IO_MMAP:
+ group = gst_v4l2_allocator_alloc_mmap (pool->vallocator);
+ break;
+ case GST_V4L2_IO_DMABUF:
+ group = gst_v4l2_allocator_alloc_dmabuf (pool->vallocator,
+ pool->allocator);
+ break;
+ case GST_V4L2_IO_USERPTR:
+ group = gst_v4l2_allocator_alloc_userptr (pool->vallocator);
+ break;
+ case GST_V4L2_IO_DMABUF_IMPORT:
+ group = gst_v4l2_allocator_alloc_dmabufin (pool->vallocator);
+ break;
+ default:
+ newbuf = NULL;
+ g_assert_not_reached ();
+ break;
+ }
+
+ if (group != NULL) {
+ gint i;
+ newbuf = gst_buffer_new ();
+
+ for (i = 0; i < group->n_mem; i++)
+ gst_buffer_append_memory (newbuf, group->mem[i]);
+ } else if (newbuf == NULL) {
+ goto allocation_failed;
+ }
+
+ /* add metadata to raw video buffers */
+ if (pool->add_videometa)
+ gst_buffer_add_video_meta_full (newbuf, GST_VIDEO_FRAME_FLAG_NONE,
+ GST_VIDEO_INFO_FORMAT (info), GST_VIDEO_INFO_WIDTH (info),
+ GST_VIDEO_INFO_HEIGHT (info), GST_VIDEO_INFO_N_PLANES (info),
+ info->offset, info->stride);
+
+ *buffer = newbuf;
+
+ return GST_FLOW_OK;
+
+ /* ERRORS */
+allocation_failed:
+ {
+ GST_ERROR_OBJECT (pool, "failed to allocate buffer");
+ return FALSE;
+ }
+}
+
static gboolean
gst_v4l2_buffer_pool_set_config (GstBufferPool * bpool, GstStructure * config)
{
@@ -408,75 +419,99 @@ gst_v4l2_buffer_pool_set_config (GstBufferPool * bpool, GstStructure * config)
guint size, min_buffers, max_buffers;
GstAllocator *allocator;
GstAllocationParams params;
-
- GST_DEBUG_OBJECT (pool, "set config");
+ gboolean can_allocate = FALSE;
+ gboolean updated = FALSE;
+ gboolean ret;
pool->add_videometa =
gst_buffer_pool_config_has_option (config,
GST_BUFFER_POOL_OPTION_VIDEO_META);
- if (!pool->add_videometa &&
- GST_VIDEO_INFO_FORMAT (&obj->info) != GST_VIDEO_FORMAT_ENCODED) {
- /* in non MPLANE mode, there is only one bytesperline field */
- gint nb_checked_planes =
- V4L2_TYPE_IS_MULTIPLANAR (obj->type) ? GST_VIDEO_INFO_N_PLANES (&obj->
- info) : 1;
- gint stride = 0;
- gint i = 0;
- for (i = 0; i < nb_checked_planes; i++) {
- /* we don't have video metadata, and we are dealing with raw video,
- * see if the strides are compatible */
- stride = GST_VIDEO_INFO_PLANE_STRIDE (&obj->info, i);
-
- if (GST_VIDEO_FORMAT_INFO_IS_TILED (obj->info.finfo)) {
- stride = GST_VIDEO_TILE_X_TILES (stride) <<
- GST_VIDEO_FORMAT_INFO_TILE_WS ((obj->info.finfo));
- }
-
- GST_DEBUG_OBJECT (pool, "no videometadata, checking strides %d and %u",
- stride, obj->bytesperline[i]);
-
- if (stride != obj->bytesperline[i])
- goto missing_video_api;
- }
- }
-
/* parse the config and keep around */
if (!gst_buffer_pool_config_get_params (config, &caps, &size, &min_buffers,
&max_buffers))
goto wrong_config;
- /* FIXME Check alignement, and S_FMT with new size if different */
-
if (!gst_buffer_pool_config_get_allocator (config, &allocator, &params))
goto wrong_config;
GST_DEBUG_OBJECT (pool, "config %" GST_PTR_FORMAT, config);
- if (obj->mode == GST_V4L2_IO_DMABUF)
- allocator = gst_dmabuf_allocator_new ();
- else if (allocator)
- gst_object_ref (allocator);
-
if (pool->allocator)
gst_object_unref (pool->allocator);
- pool->allocator = allocator;
+ pool->allocator = NULL;
- pool->params = params;
+ switch (obj->mode) {
+ case GST_V4L2_IO_DMABUF:
+ pool->allocator = gst_dmabuf_allocator_new ();
+ can_allocate = GST_V4L2_ALLOCATOR_CAN_ALLOCATE (pool->vallocator, MMAP);
+ break;
+ case GST_V4L2_IO_MMAP:
+ can_allocate = GST_V4L2_ALLOCATOR_CAN_ALLOCATE (pool->vallocator, MMAP);
+ break;
+ case GST_V4L2_IO_USERPTR:
+ can_allocate =
+ GST_V4L2_ALLOCATOR_CAN_ALLOCATE (pool->vallocator, USERPTR);
+ break;
+ case GST_V4L2_IO_DMABUF_IMPORT:
+ can_allocate = GST_V4L2_ALLOCATOR_CAN_ALLOCATE (pool->vallocator, DMABUF);
+ break;
+ case GST_V4L2_IO_RW:
+ pool->allocator = g_object_ref (allocator);
+ pool->params = params;
+ /* No need to change the configuration */
+ goto done;
+ break;
+ default:
+ g_assert_not_reached ();
+ break;
+ }
- gst_buffer_pool_config_set_params (config, caps, size, min_buffers,
- max_buffers);
+ if (min_buffers < GST_V4L2_MIN_BUFFERS) {
+ updated = TRUE;
+ min_buffers = GST_V4L2_MIN_BUFFERS;
+ GST_INFO_OBJECT (pool, "increasing minimum buffers to %u", min_buffers);
+ }
- return GST_BUFFER_POOL_CLASS (parent_class)->set_config (bpool, config);
+ if (max_buffers > VIDEO_MAX_FRAME || max_buffers == 0) {
+ updated = TRUE;
+ max_buffers = VIDEO_MAX_FRAME;
+ GST_INFO_OBJECT (pool, "reducing maximum buffers to %u", max_buffers);
+ }
- /* ERRORS */
-missing_video_api:
- {
- GST_ERROR_OBJECT (pool, "missing GstMetaVideo API in config, "
- "default stride: %d, wanted stride %u",
- GST_VIDEO_INFO_PLANE_STRIDE (&obj->info, 0), obj->bytesperline[0]);
- return FALSE;
+ if (min_buffers > max_buffers) {
+ updated = TRUE;
+ min_buffers = max_buffers;
+ GST_INFO_OBJECT (pool, "reducing minimum buffers to %u", min_buffers);
+ } else if (min_buffers != max_buffers) {
+ if (!can_allocate) {
+ updated = TRUE;
+ max_buffers = min_buffers;
+ GST_INFO_OBJECT (pool, "can't allocate, setting maximum to minimum");
+ }
+ }
+
+ if (!pool->add_videometa && obj->need_video_meta) {
+ GST_INFO_OBJECT (pool, "adding needed video meta");
+ updated = TRUE;
+ gst_buffer_pool_config_add_option (config,
+ GST_BUFFER_POOL_OPTION_VIDEO_META);
}
+
+ if (updated)
+ gst_buffer_pool_config_set_params (config, caps, size, min_buffers,
+ max_buffers);
+
+ /* keep a GstVideoInfo with defaults for the when we need to copy */
+ gst_video_info_from_caps (&pool->caps_info, caps);
+
+done:
+ ret = GST_BUFFER_POOL_CLASS (parent_class)->set_config (bpool, config);
+
+ /* If anything was changed documentation recommand to return FALSE */
+ return !updated && ret;
+
+ /* ERRORS */
wrong_config:
{
GST_ERROR_OBJECT (pool, "invalid config %" GST_PTR_FORMAT, config);
@@ -489,16 +524,55 @@ start_streaming (GstV4l2BufferPool * pool)
{
GstV4l2Object *obj = pool->obj;
+ GST_DEBUG_OBJECT (pool, "start streaming");
+
+ if (pool->streaming)
+ return TRUE;
+
switch (obj->mode) {
case GST_V4L2_IO_RW:
break;
case GST_V4L2_IO_MMAP:
case GST_V4L2_IO_USERPTR:
case GST_V4L2_IO_DMABUF:
- GST_DEBUG_OBJECT (pool, "STREAMON");
+ case GST_V4L2_IO_DMABUF_IMPORT:
+ {
+ /* For capture device, we need to re-enqueue buffers before be can let
+ * the driver stream again */
+ if (!V4L2_TYPE_IS_OUTPUT (obj->type) && pool->vallocator) {
+ GstBufferPool *bpool = GST_BUFFER_POOL (pool);
+ GstBufferPoolAcquireParams params = { 0 };
+ gsize num_allocated, num_to_queue;
+ GstFlowReturn ret;
+
+ num_allocated = gst_v4l2_allocator_num_allocated (pool->vallocator);
+ num_to_queue = num_allocated - pool->num_queued;
+
+ while (num_to_queue > 0) {
+ GstBuffer *buf;
+
+ params.flags = GST_BUFFER_POOL_ACQUIRE_FLAG_DONTWAIT;
+ ret = GST_BUFFER_POOL_CLASS (parent_class)->acquire_buffer (bpool,
+ &buf, &params);
+
+ if (ret != GST_FLOW_OK)
+ goto requeue_failed;
+
+ gst_v4l2_buffer_pool_release_buffer (bpool, buf);
+ num_to_queue--;
+ }
+
+ if (num_allocated != pool->num_queued)
+ goto requeue_failed;
+ }
+
if (v4l2_ioctl (pool->video_fd, VIDIOC_STREAMON, &obj->type) < 0)
goto start_failed;
+
+ GST_DEBUG_OBJECT (pool, "STREAMON");
+
break;
+ }
default:
g_assert_not_reached ();
break;
@@ -515,6 +589,29 @@ start_failed:
g_strerror (errno));
return FALSE;
}
+requeue_failed:
+ {
+ GST_ERROR_OBJECT (pool, "failed to re-enqueue buffers");
+ return FALSE;
+ }
+}
+
+static void
+gst_v4l2_buffer_pool_group_released (GstV4l2BufferPool * pool)
+{
+ GstBufferPoolAcquireParams params = { 0 };
+ GstBuffer *buffer = NULL;
+ GstFlowReturn ret;
+
+ GST_DEBUG_OBJECT (pool, "A buffer was lost, reallocating it");
+
+ params.flags =
+ (GstBufferPoolAcquireFlags) GST_V4L2_POOL_ACQUIRE_FLAG_RESURECT;
+ ret =
+ gst_buffer_pool_acquire_buffer (GST_BUFFER_POOL (pool), &buffer, &params);
+
+ if (ret == GST_FLOW_OK)
+ gst_buffer_unref (buffer);
}
static gboolean
@@ -524,8 +621,8 @@ gst_v4l2_buffer_pool_start (GstBufferPool * bpool)
GstV4l2Object *obj = pool->obj;
GstStructure *config;
GstCaps *caps;
- guint size, num_buffers, min_buffers, max_buffers, copy_threshold;
- struct v4l2_requestbuffers breq;
+ guint size, min_buffers, max_buffers;
+ guint num_buffers = 0, copy_threshold = 0;
config = gst_buffer_pool_get_config (bpool);
if (!gst_buffer_pool_config_get_params (config, &caps, &size, &min_buffers,
@@ -534,64 +631,99 @@ gst_v4l2_buffer_pool_start (GstBufferPool * bpool)
switch (obj->mode) {
case GST_V4L2_IO_RW:
- /* we preallocate 1 buffer, this value also instructs the latency
- * calculation to have 1 frame latency max */
- num_buffers = 1;
- copy_threshold = 0;
+ /* this value also instructs the latency calculation to have min_buffers
+ * frame latency max */
+ num_buffers = min_buffers;
break;
case GST_V4L2_IO_DMABUF:
case GST_V4L2_IO_MMAP:
{
- /* request a reasonable number of buffers when no max specified. We will
- * copy when we run out of buffers */
- if (max_buffers == 0)
- num_buffers = MAX (4, min_buffers);
- else
+ guint count;
+
+ if (GST_V4L2_ALLOCATOR_CAN_ALLOCATE (pool->vallocator, MMAP)) {
+ num_buffers = min_buffers;
+ } else {
num_buffers = max_buffers;
+ }
/* first, lets request buffers, and see how many we can get: */
- GST_DEBUG_OBJECT (pool, "starting, requesting %d MMAP buffers",
- num_buffers);
+ GST_DEBUG_OBJECT (pool, "requesting %d MMAP buffers", num_buffers);
- memset (&breq, 0, sizeof (struct v4l2_requestbuffers));
- breq.type = obj->type;
- breq.count = num_buffers;
- breq.memory = V4L2_MEMORY_MMAP;
+ count = gst_v4l2_allocator_start (pool->vallocator, num_buffers,
+ V4L2_MEMORY_MMAP);
- if (v4l2_ioctl (pool->video_fd, VIDIOC_REQBUFS, &breq) < 0)
- goto reqbufs_failed;
+ if (count < GST_V4L2_MIN_BUFFERS) {
+ num_buffers = count;
+ goto no_buffers;
+ }
- GST_LOG_OBJECT (pool, " count: %u", breq.count);
- GST_LOG_OBJECT (pool, " type: %d", breq.type);
- GST_LOG_OBJECT (pool, " memory: %d", breq.memory);
+ /* V4L2 buffer pool are often very limited in the amount of buffers it
+ * can offer. The copy_threshold will workaround this limitation by
+ * falling back to copy if the pipeline needed more buffers. This also
+ * prevent having to do REQBUFS(N)/REQBUFS(0) everytime configure is
+ * called. */
+ if (count != num_buffers) {
+ GST_WARNING_OBJECT (pool, "using %u buffers instead of %u",
+ count, num_buffers);
+ num_buffers = count;
+ copy_threshold =
+ MAX (GST_V4L2_MIN_BUFFERS, obj->min_buffers_for_capture);
+
+ /* The initial minimum could be provide either by GstBufferPool or
+ * driver needs. */
+ min_buffers = count;
+ }
- if (breq.count < GST_V4L2_MIN_BUFFERS)
- goto no_buffers;
+ break;
+ }
+ case GST_V4L2_IO_USERPTR:
+ {
+ guint count;
+
+ if (GST_V4L2_ALLOCATOR_CAN_ALLOCATE (pool->vallocator, USERPTR)) {
+ num_buffers = min_buffers;
+ } else {
+ num_buffers = max_buffers;
+ }
+
+ GST_DEBUG_OBJECT (pool, "requesting %d USERPTR buffers", num_buffers);
- if (num_buffers != breq.count) {
- GST_WARNING_OBJECT (pool, "using %u buffers instead", breq.count);
- num_buffers = breq.count;
+ count = gst_v4l2_allocator_start (pool->vallocator, num_buffers,
+ V4L2_MEMORY_USERPTR);
+
+ /* There is no rational to not get what we asked */
+ if (count < num_buffers) {
+ num_buffers = count;
+ goto no_buffers;
}
- /* update min buffers with the amount of buffers we just reserved. We need
- * to configure this value in the bufferpool so that the default start
- * implementation calls our allocate function */
- min_buffers = breq.count;
-
- if (max_buffers == 0 || num_buffers < max_buffers) {
- /* if we are asked to provide more buffers than we have allocated, start
- * copying buffers when we only have 2 buffers left in the pool */
- copy_threshold = 2;
+
+ min_buffers = num_buffers = count;
+ break;
+ }
+ case GST_V4L2_IO_DMABUF_IMPORT:
+ {
+ guint count;
+
+ if (GST_V4L2_ALLOCATOR_CAN_ALLOCATE (pool->vallocator, DMABUF)) {
+ num_buffers = min_buffers;
} else {
- /* we are certain that we have enough buffers so we don't need to
- * copy */
- copy_threshold = 0;
+ num_buffers = max_buffers;
}
- /* FIXME try to call CREATEBUFS with count 0 to check if max shall
- * remain 0 */
+ GST_DEBUG_OBJECT (pool, "requesting %d DMABUF buffers", num_buffers);
+
+ count = gst_v4l2_allocator_start (pool->vallocator, num_buffers,
+ V4L2_MEMORY_DMABUF);
+
+ /* There is no rational to not get what we asked */
+ if (count < num_buffers) {
+ num_buffers = count;
+ goto no_buffers;
+ }
+
+ min_buffers = num_buffers = count;
break;
}
- case GST_V4L2_IO_USERPTR:
default:
num_buffers = 0;
copy_threshold = 0;
@@ -600,16 +732,21 @@ gst_v4l2_buffer_pool_start (GstBufferPool * bpool)
}
pool->size = size;
- pool->num_buffers = num_buffers;
pool->copy_threshold = copy_threshold;
+ pool->num_buffers = num_buffers;
+ pool->num_queued = 0;
+
+ if (max_buffers < min_buffers)
+ max_buffers = min_buffers;
gst_buffer_pool_config_set_params (config, caps, size, min_buffers,
max_buffers);
GST_BUFFER_POOL_CLASS (parent_class)->set_config (bpool, config);
+ gst_structure_free (config);
- pool->obj = obj;
- pool->buffers = g_new0 (GstBuffer *, pool->num_buffers);
- pool->num_allocated = 0;
+ if (pool->other_pool)
+ if (!gst_buffer_pool_set_active (pool->other_pool, TRUE))
+ goto other_pool_failed;
/* now, allocate the buffers: */
if (!GST_BUFFER_POOL_CLASS (parent_class)->start (bpool))
@@ -621,6 +758,11 @@ gst_v4l2_buffer_pool_start (GstBufferPool * bpool)
if (!start_streaming (pool))
goto start_failed;
+ if (!V4L2_TYPE_IS_OUTPUT (obj->type))
+ pool->group_released_handler =
+ g_signal_connect_swapped (pool->vallocator, "group-released",
+ G_CALLBACK (gst_v4l2_buffer_pool_group_released), pool);
+
gst_poll_set_flushing (obj->poll, FALSE);
return TRUE;
@@ -629,19 +771,15 @@ gst_v4l2_buffer_pool_start (GstBufferPool * bpool)
wrong_config:
{
GST_ERROR_OBJECT (pool, "invalid config %" GST_PTR_FORMAT, config);
- return FALSE;
- }
-reqbufs_failed:
- {
- GST_ERROR_OBJECT (pool,
- "error requesting %d buffers: %s", num_buffers, g_strerror (errno));
+ gst_structure_free (config);
return FALSE;
}
no_buffers:
{
GST_ERROR_OBJECT (pool,
- "we received %d from device '%s', we want at least %d",
- breq.count, obj->videodev, GST_V4L2_MIN_BUFFERS);
+ "we received %d buffer from device '%s', we want at least %d",
+ num_buffers, obj->videodev, GST_V4L2_MIN_BUFFERS);
+ gst_structure_free (config);
return FALSE;
}
start_failed:
@@ -649,29 +787,20 @@ start_failed:
GST_ERROR_OBJECT (pool, "failed to start streaming");
return FALSE;
}
-}
-
-static void
-gst_v4l2_buffer_pool_free_buffers (GstV4l2BufferPool * pool)
-{
- if (pool->num_buffers > 0) {
- struct v4l2_requestbuffers breq;
- memset (&breq, 0, sizeof (struct v4l2_requestbuffers));
- breq.type = pool->obj->type;
- breq.count = 0;
- breq.memory = V4L2_MEMORY_MMAP;
- if (v4l2_ioctl (pool->video_fd, VIDIOC_REQBUFS, &breq) < 0) {
- GST_ERROR_OBJECT (pool, "error releasing buffers: %s",
- g_strerror (errno));
- }
- pool->num_buffers = 0;
+other_pool_failed:
+ {
+ GST_ERROR_OBJECT (pool, "failed to active the other pool %"
+ GST_PTR_FORMAT, pool->other_pool);
+ return FALSE;
}
}
+
static gboolean
stop_streaming (GstV4l2BufferPool * pool)
{
GstV4l2Object *obj = pool->obj;
+ gint i;
GST_DEBUG_OBJECT (pool, "stopping stream");
@@ -684,21 +813,57 @@ stop_streaming (GstV4l2BufferPool * pool)
return TRUE;
}
+ pool->flushing = TRUE;
+
switch (obj->mode) {
case GST_V4L2_IO_RW:
break;
case GST_V4L2_IO_MMAP:
case GST_V4L2_IO_USERPTR:
case GST_V4L2_IO_DMABUF:
- GST_DEBUG_OBJECT (pool, "STREAMOFF");
+ case GST_V4L2_IO_DMABUF_IMPORT:
+ {
+ gsize num_allocated;
+
if (v4l2_ioctl (pool->video_fd, VIDIOC_STREAMOFF, &obj->type) < 0)
goto stop_failed;
+
+ GST_DEBUG_OBJECT (pool, "STREAMOFF");
+
+ gst_v4l2_allocator_flush (pool->vallocator);
+
+ num_allocated = gst_v4l2_allocator_num_allocated (pool->vallocator);
+
+ for (i = 0; i < num_allocated; i++) {
+ if (pool->buffers[i]) {
+ GstBufferPool *bpool = (GstBufferPool *) pool;
+ GstBuffer *buffer = pool->buffers[i];
+
+ pool->buffers[i] = NULL;
+ pool->num_queued--;
+
+ /* Remove qdata, this will unmap any map data in userptr */
+ gst_mini_object_set_qdata (GST_MINI_OBJECT (buffer),
+ GST_V4L2_IMPORT_QUARK, NULL, NULL);
+
+ if (V4L2_TYPE_IS_OUTPUT (obj->type))
+ gst_buffer_unref (buffer);
+ else
+ /* Give back the outstanding buffer to the pool */
+ GST_BUFFER_POOL_CLASS (parent_class)->release_buffer (bpool,
+ buffer);
+ }
+ }
+ g_return_val_if_fail (pool->num_queued == 0, FALSE);
+
break;
+ }
default:
- g_assert_not_reached ();
+ g_return_val_if_reached (FALSE);
break;
}
+ pool->flushing = FALSE;
pool->streaming = FALSE;
return TRUE;
@@ -718,45 +883,33 @@ gst_v4l2_buffer_pool_stop (GstBufferPool * bpool)
gboolean ret;
GstV4l2BufferPool *pool = GST_V4L2_BUFFER_POOL (bpool);
GstV4l2Object *obj = pool->obj;
- guint n;
GST_DEBUG_OBJECT (pool, "stopping pool");
- gst_poll_set_flushing (obj->poll, TRUE);
-
- if (pool->streaming) {
- switch (obj->mode) {
- case GST_V4L2_IO_RW:
- break;
- case GST_V4L2_IO_MMAP:
- case GST_V4L2_IO_USERPTR:
- case GST_V4L2_IO_DMABUF:
- /* we actually need to sync on all queued buffers but not
- * on the non-queued ones */
- GST_DEBUG_OBJECT (pool, "STREAMOFF");
- if (v4l2_ioctl (pool->video_fd, VIDIOC_STREAMOFF, &obj->type) < 0)
- goto stop_failed;
- break;
- default:
- g_assert_not_reached ();
- break;
- }
- pool->streaming = FALSE;
+ if (pool->group_released_handler > 0) {
+ g_signal_handler_disconnect (pool->vallocator,
+ pool->group_released_handler);
+ pool->group_released_handler = 0;
}
- /* first free the buffers in the queue */
+ gst_poll_set_flushing (obj->poll, TRUE);
+ if (!stop_streaming (pool))
+ goto stop_failed;
+
ret = GST_BUFFER_POOL_CLASS (parent_class)->stop (bpool);
- /* then free the remaining buffers */
- for (n = 0; n < pool->num_buffers; n++) {
- if (pool->buffers[n])
- gst_v4l2_buffer_pool_free_buffer (bpool, pool->buffers[n]);
- }
- pool->num_queued = 0;
- g_free (pool->buffers);
- pool->buffers = NULL;
+ if (ret) {
+ GstV4l2Return vret;
- gst_v4l2_buffer_pool_free_buffers (pool);
+ vret = gst_v4l2_allocator_stop (pool->vallocator);
+
+ if (vret == GST_V4L2_BUSY) {
+ GST_WARNING_OBJECT (pool, "allocated buffer need to be reclaimed");
+ /* FIXME deal with reclaiming */
+ } else if (vret == GST_V4L2_ERROR) {
+ ret = FALSE;
+ }
+ }
return ret;
@@ -809,38 +962,23 @@ select_error:
static GstFlowReturn
gst_v4l2_buffer_pool_qbuf (GstV4l2BufferPool * pool, GstBuffer * buf)
{
- GstV4l2Meta *meta;
+ GstV4l2MemoryGroup *group = NULL;
gint index;
- gint i = 0;
- meta = GST_V4L2_META_GET (buf);
- if (meta == NULL) {
- GST_LOG_OBJECT (pool, "unref copied buffer %p", buf);
- /* no meta, it was a copied buffer that we can unref */
+ if (!gst_v4l2_is_buffer_valid (buf, &group)) {
+ GST_LOG_OBJECT (pool, "unref copied/invalid buffer %p", buf);
gst_buffer_unref (buf);
return GST_FLOW_OK;
}
- index = meta->vbuffer.index;
-
- /* this field is common to MPLANE and not MPLANE */
- meta->vbuffer.bytesused = gst_buffer_get_size (buf);
-
- for (i = 0; i < meta->n_planes; i++) {
- meta->vplanes[i].bytesused =
- gst_buffer_get_sizes_range (buf, i, 1, NULL, NULL);
-
- GST_LOG_OBJECT (pool,
- "enqueue buffer %p, index:%d, queued:%d, flags:%08x mem:%p used:%d, plane:%d",
- buf, index, pool->num_queued, meta->vbuffer.flags,
- meta->mem[i], meta->vplanes[i].bytesused, i);
- }
+ index = group->buffer.index;
if (pool->buffers[index] != NULL)
goto already_queued;
- GST_LOG_OBJECT (pool, "doing QBUF");
- if (v4l2_ioctl (pool->video_fd, VIDIOC_QBUF, &meta->vbuffer) < 0)
+ GST_LOG_OBJECT (pool, "queuing buffer %i", index);
+
+ if (!gst_v4l2_allocator_qbuf (pool->vallocator, group))
goto queue_failed;
pool->buffers[index] = buf;
@@ -848,16 +986,16 @@ gst_v4l2_buffer_pool_qbuf (GstV4l2BufferPool * pool, GstBuffer * buf)
return GST_FLOW_OK;
- /* ERRORS */
already_queued:
{
- GST_WARNING_OBJECT (pool, "the buffer was already queued");
+ GST_ERROR_OBJECT (pool, "the buffer %i was already queued", index);
return GST_FLOW_ERROR;
}
queue_failed:
{
- GST_WARNING_OBJECT (pool, "could not queue a buffer %d (%s)", errno,
- g_strerror (errno));
+ GST_ERROR_OBJECT (pool, "could not queue a buffer %i", index);
+ /* Mark broken buffer to the allocator */
+ GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_TAG_MEMORY);
return GST_FLOW_ERROR;
}
}
@@ -867,95 +1005,49 @@ gst_v4l2_buffer_pool_dqbuf (GstV4l2BufferPool * pool, GstBuffer ** buffer)
{
GstFlowReturn res;
GstBuffer *outbuf;
- struct v4l2_buffer vbuffer;
- struct v4l2_plane vplanes[GST_VIDEO_MAX_PLANES];
GstV4l2Object *obj = pool->obj;
GstClockTime timestamp;
- GstV4l2Meta *meta;
+ GstV4l2MemoryGroup *group;
gint i;
if ((res = gst_v4l2_object_poll (obj)) != GST_FLOW_OK)
- goto poll_error;
-
- /* prepare the buffer */
- memset (&vbuffer, 0x00, sizeof (vbuffer));
- vbuffer.type = obj->type;
+ goto poll_failed;
- if (obj->mode == GST_V4L2_IO_DMABUF)
- vbuffer.memory = V4L2_MEMORY_DMABUF;
- else
- vbuffer.memory = V4L2_MEMORY_MMAP;
+ GST_LOG_OBJECT (pool, "dequeueing a buffer");
- /* prepare the planes of the buffer */
- if (V4L2_TYPE_IS_MULTIPLANAR (obj->type)) {
- /* length is the number of elements in the
- * vplanes array */
- vbuffer.length = obj->n_v4l2_planes;
- vbuffer.m.planes = vplanes;
- }
-
- /* the buffer is prepared, now fill in it with meaningful values */
- GST_LOG_OBJECT (pool, "doing DQBUF");
- if (v4l2_ioctl (pool->video_fd, VIDIOC_DQBUF, &vbuffer) < 0)
- goto error;
+ group = gst_v4l2_allocator_dqbuf (pool->vallocator);
+ if (group == NULL)
+ goto dqbuf_failed;
/* get our GstBuffer with that index from the pool, if the buffer was
* outstanding we have a serious problem.
*/
- outbuf = pool->buffers[vbuffer.index];
+ outbuf = pool->buffers[group->buffer.index];
if (outbuf == NULL)
goto no_buffer;
/* mark the buffer outstanding */
- pool->buffers[vbuffer.index] = NULL;
+ pool->buffers[group->buffer.index] = NULL;
pool->num_queued--;
- timestamp = GST_TIMEVAL_TO_TIME (vbuffer.timestamp);
-
- meta = GST_V4L2_META_GET (outbuf);
- g_assert (meta != NULL);
-
- /* The size can change at every frame, esp. with jpeg. The GstMemory
- * inside the GstBuffer could have been changed by some other
- * element. So update our meta */
- if (obj->type == V4L2_BUF_TYPE_VIDEO_CAPTURE
- || obj->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) {
-
- /* this field is common to MPLANE and not MPLANE */
- meta->vbuffer.length = vbuffer.length;
- meta->vbuffer.bytesused = vbuffer.bytesused;
-
- if (obj->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) {
- for (i = 0; i < meta->n_planes; i++) {
- /* the following also update meta->vbuffer.m.planes[i].length */
- meta->vplanes[i].length = vbuffer.m.planes[i].length;
- /* the following also update meta->vbuffer.m.planes[i].bytesused */
- meta->vplanes[i].bytesused = vbuffer.m.planes[i].bytesused;
- /* the following also update meta->vbuffer.m.planes[i].data_offset */
- meta->vplanes[i].data_offset = vbuffer.m.planes[i].data_offset;
- }
- } else {
- meta->vplanes[0].length = vbuffer.length;
- meta->vplanes[0].bytesused = vbuffer.bytesused;
- meta->vplanes[0].data_offset = 0;
- }
- }
+ timestamp = GST_TIMEVAL_TO_TIME (group->buffer.timestamp);
+
#ifndef GST_DISABLE_GST_DEBUG
- for (i = 0; i < meta->n_planes; i++) {
+ for (i = 0; i < group->n_mem; i++) {
GST_LOG_OBJECT (pool,
"dequeued buffer %p seq:%d (ix=%d), mem %p used %d, plane=%d, flags %08x, ts %"
GST_TIME_FORMAT ", pool-queued=%d, buffer=%p", outbuf,
- vbuffer.sequence, vbuffer.index, meta->mem[i],
- meta->vplanes[i].bytesused, i, vbuffer.flags,
+ group->buffer.sequence, group->buffer.index, group->mem[i],
+ group->planes[i].bytesused, i, group->buffer.flags,
GST_TIME_ARGS (timestamp), pool->num_queued, outbuf);
}
#endif
/* set top/bottom field first if v4l2_buffer has the information */
- if (vbuffer.field == V4L2_FIELD_INTERLACED_TB) {
+ if (group->buffer.field == V4L2_FIELD_INTERLACED_TB) {
GST_BUFFER_FLAG_SET (outbuf, GST_VIDEO_BUFFER_FLAG_INTERLACED);
GST_BUFFER_FLAG_SET (outbuf, GST_VIDEO_BUFFER_FLAG_TFF);
- } else if (vbuffer.field == V4L2_FIELD_INTERLACED_BT) {
+ } else if (group->buffer.field == V4L2_FIELD_INTERLACED_BT) {
GST_BUFFER_FLAG_SET (outbuf, GST_VIDEO_BUFFER_FLAG_INTERLACED);
GST_BUFFER_FLAG_UNSET (outbuf, GST_VIDEO_BUFFER_FLAG_TFF);
} else {
@@ -964,29 +1056,12 @@ gst_v4l2_buffer_pool_dqbuf (GstV4l2BufferPool * pool, GstBuffer ** buffer)
}
if (GST_VIDEO_INFO_FORMAT (&obj->info) == GST_VIDEO_FORMAT_ENCODED) {
- if (vbuffer.flags & V4L2_BUF_FLAG_KEYFRAME)
+ if (group->buffer.flags & V4L2_BUF_FLAG_KEYFRAME)
GST_BUFFER_FLAG_UNSET (outbuf, GST_BUFFER_FLAG_DELTA_UNIT);
else
GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DELTA_UNIT);
}
- /* The size can change at every frame, esp. with jpeg. The GstMemory
- * inside the GstBuffer could have been changed by some other
- * element, so just put back the original one. We always set it as
- * no share, so if it's not there, it's not used at all.
- */
- if (obj->type == V4L2_BUF_TYPE_VIDEO_CAPTURE
- || obj->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) {
- gst_buffer_remove_all_memory (outbuf);
- for (i = 0; i < meta->n_planes; i++) {
- gst_buffer_append_memory (outbuf,
- gst_memory_new_wrapped (GST_MEMORY_FLAG_NO_SHARE,
- meta->mem[i], meta->vplanes[i].length,
- meta->vplanes[i].data_offset,
- meta->vplanes[i].bytesused, NULL, NULL));
- }
- }
-
GST_BUFFER_TIMESTAMP (outbuf) = timestamp;
*buffer = outbuf;
@@ -994,63 +1069,19 @@ gst_v4l2_buffer_pool_dqbuf (GstV4l2BufferPool * pool, GstBuffer ** buffer)
return GST_FLOW_OK;
/* ERRORS */
-poll_error:
+poll_failed:
{
GST_DEBUG_OBJECT (pool, "poll error %s", gst_flow_get_name (res));
return res;
}
-error:
+dqbuf_failed:
{
- GST_WARNING_OBJECT (pool,
- "problem dequeuing frame %d (ix=%d), pool-ct=%d, buf.flags=%d",
- vbuffer.sequence, vbuffer.index,
- GST_MINI_OBJECT_REFCOUNT (pool), vbuffer.flags);
-
- switch (errno) {
- case EAGAIN:
- GST_WARNING_OBJECT (pool,
- "Non-blocking I/O has been selected using O_NONBLOCK and"
- " no buffer was in the outgoing queue. device %s", obj->videodev);
- break;
- case EINVAL:
- GST_ERROR_OBJECT (pool,
- "The buffer type is not supported, or the index is out of bounds, "
- "or no buffers have been allocated yet, or the userptr "
- "or length are invalid. device %s", obj->videodev);
- break;
- case ENOMEM:
- GST_ERROR_OBJECT (pool,
- "insufficient memory to enqueue a user pointer buffer");
- break;
- case EIO:
- GST_INFO_OBJECT (pool,
- "VIDIOC_DQBUF failed due to an internal error."
- " Can also indicate temporary problems like signal loss."
- " Note the driver might dequeue an (empty) buffer despite"
- " returning an error, or even stop capturing."
- " device %s", obj->videodev);
- /* have we de-queued a buffer ? */
- if (!(vbuffer.flags & (V4L2_BUF_FLAG_QUEUED | V4L2_BUF_FLAG_DONE))) {
- GST_DEBUG_OBJECT (pool, "reenqueing buffer");
- /* FIXME ... should we do something here? */
- }
- break;
- case EINTR:
- GST_WARNING_OBJECT (pool,
- "could not sync on a buffer on device %s", obj->videodev);
- break;
- default:
- GST_WARNING_OBJECT (pool,
- "Grabbing frame got interrupted on %s unexpectedly. %d: %s.",
- obj->videodev, errno, g_strerror (errno));
- break;
- }
return GST_FLOW_ERROR;
}
no_buffer:
{
GST_ERROR_OBJECT (pool, "No free buffer found in the pool at index %d.",
- vbuffer.index);
+ group->buffer.index);
return GST_FLOW_ERROR;
}
}
@@ -1068,18 +1099,28 @@ gst_v4l2_buffer_pool_acquire_buffer (GstBufferPool * bpool, GstBuffer ** buffer,
if (GST_BUFFER_POOL_IS_FLUSHING (bpool))
goto flushing;
+ /* If this is being called to resurect a lost buffer */
+ if (params && params->flags & GST_V4L2_POOL_ACQUIRE_FLAG_RESURECT) {
+ ret = GST_BUFFER_POOL_CLASS (parent_class)->acquire_buffer (bpool, buffer,
+ params);
+ goto done;
+ }
+
switch (obj->type) {
case V4L2_BUF_TYPE_VIDEO_CAPTURE:
case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE:
/* capture, This function should return a buffer with new captured data */
switch (obj->mode) {
case GST_V4L2_IO_RW:
+ {
/* take empty buffer from the pool */
ret = GST_BUFFER_POOL_CLASS (parent_class)->acquire_buffer (bpool,
buffer, params);
break;
+ }
case GST_V4L2_IO_DMABUF:
case GST_V4L2_IO_MMAP:
+ {
/* just dequeue a buffer, we basically use the queue of v4l2 as the
* storage for our buffers. This function does poll first so we can
* interrupt it fine. */
@@ -1091,13 +1132,11 @@ gst_v4l2_buffer_pool_acquire_buffer (GstBufferPool * bpool, GstBuffer ** buffer,
if (pool->num_queued < pool->copy_threshold) {
GstBuffer *copy;
- if (pool->can_alloc) {
+ if (GST_V4L2_ALLOCATOR_CAN_ALLOCATE (pool->vallocator, MMAP)) {
if (GST_BUFFER_POOL_CLASS (parent_class)->acquire_buffer (bpool,
&copy, params) == GST_FLOW_OK) {
gst_v4l2_buffer_pool_release_buffer (bpool, copy);
break;
- } else {
- pool->can_alloc = FALSE;
}
}
@@ -1107,12 +1146,18 @@ gst_v4l2_buffer_pool_acquire_buffer (GstBufferPool * bpool, GstBuffer ** buffer,
GST_LOG_OBJECT (pool, "copy buffer %p->%p", *buffer, copy);
/* and requeue so that we can continue capturing */
- ret = gst_v4l2_buffer_pool_qbuf (pool, *buffer);
+ gst_v4l2_buffer_pool_release_buffer (bpool, *buffer);
*buffer = copy;
}
break;
-
+ }
case GST_V4L2_IO_USERPTR:
+ case GST_V4L2_IO_DMABUF_IMPORT:
+ {
+ /* dequeue filled buffer */
+ ret = gst_v4l2_buffer_pool_dqbuf (pool, buffer);
+ break;
+ }
default:
ret = GST_FLOW_ERROR;
g_assert_not_reached ();
@@ -1120,6 +1165,7 @@ gst_v4l2_buffer_pool_acquire_buffer (GstBufferPool * bpool, GstBuffer ** buffer,
}
break;
+
case V4L2_BUF_TYPE_VIDEO_OUTPUT:
case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE:
/* playback, This function should return an empty buffer */
@@ -1131,12 +1177,14 @@ gst_v4l2_buffer_pool_acquire_buffer (GstBufferPool * bpool, GstBuffer ** buffer,
break;
case GST_V4L2_IO_MMAP:
+ case GST_V4L2_IO_DMABUF:
+ case GST_V4L2_IO_USERPTR:
+ case GST_V4L2_IO_DMABUF_IMPORT:
/* get a free unqueued buffer */
ret = GST_BUFFER_POOL_CLASS (parent_class)->acquire_buffer (bpool,
buffer, params);
break;
- case GST_V4L2_IO_USERPTR:
default:
ret = GST_FLOW_ERROR;
g_assert_not_reached ();
@@ -1181,11 +1229,29 @@ gst_v4l2_buffer_pool_release_buffer (GstBufferPool * bpool, GstBuffer * buffer)
case GST_V4L2_IO_DMABUF:
case GST_V4L2_IO_MMAP:
- /* queue back in the device */
- gst_v4l2_buffer_pool_qbuf (pool, buffer);
- break;
-
case GST_V4L2_IO_USERPTR:
+ case GST_V4L2_IO_DMABUF_IMPORT:
+ {
+ if (pool->flushing) {
+ /* put back on outstanding list */
+ GST_BUFFER_POOL_CLASS (parent_class)->release_buffer (bpool,
+ buffer);
+ } else if (gst_v4l2_is_buffer_valid (buffer, NULL)) {
+ /* queue back in the device */
+ if (pool->other_pool)
+ gst_v4l2_buffer_pool_prepare_buffer (pool, buffer, NULL);
+ if (gst_v4l2_buffer_pool_qbuf (pool, buffer) != GST_FLOW_OK)
+ GST_BUFFER_POOL_CLASS (parent_class)->release_buffer (bpool,
+ buffer);
+ } else {
+ /* Simply release invalide/modified buffer, the allocator will
+ * give it back later */
+ GST_BUFFER_FLAG_SET (buffer, GST_BUFFER_FLAG_TAG_MEMORY);
+ GST_BUFFER_POOL_CLASS (parent_class)->release_buffer (bpool,
+ buffer);
+ }
+ break;
+ }
default:
g_assert_not_reached ();
break;
@@ -1201,53 +1267,45 @@ gst_v4l2_buffer_pool_release_buffer (GstBufferPool * bpool, GstBuffer * buffer)
break;
case GST_V4L2_IO_MMAP:
+ case GST_V4L2_IO_DMABUF:
+ case GST_V4L2_IO_USERPTR:
+ case GST_V4L2_IO_DMABUF_IMPORT:
{
- GstV4l2Meta *meta;
+ GstV4l2MemoryGroup *group;
guint index;
- meta = GST_V4L2_META_GET (buffer);
- g_assert (meta != NULL);
+ if (!gst_v4l2_is_buffer_valid (buffer, &group)) {
+ /* Simply release invalide/modified buffer, the allocator will
+ * give it back later */
+ GST_BUFFER_FLAG_SET (buffer, GST_BUFFER_FLAG_TAG_MEMORY);
+ GST_BUFFER_POOL_CLASS (parent_class)->release_buffer (bpool,
+ buffer);
+ break;
+ }
- index = meta->vbuffer.index;
+ index = group->buffer.index;
if (pool->buffers[index] == NULL) {
GST_LOG_OBJECT (pool, "buffer %u not queued, putting on free list",
index);
- /* reset to the full length, in case it was changed */
- if (V4L2_TYPE_IS_MULTIPLANAR (obj->type)) {
- gint i = 0;
- gint total_length = 0;
- for (i = 0; i < meta->n_planes; i++)
- total_length += meta->vplanes[i].length;
-
- if (total_length != gst_buffer_get_size (buffer) &&
- obj->info.finfo->n_planes > 1) {
- /* FIXME if the lengths has actually changed it may require
- * to restore the sizes of the individual memories and
- * re-add them */
- GST_WARNING_OBJECT (pool,
- "lengths changed, more work required");
- }
+ /* Remove qdata, this will unmap any map data in userptr */
+ gst_mini_object_set_qdata (GST_MINI_OBJECT (buffer),
+ GST_V4L2_IMPORT_QUARK, NULL, NULL);
- gst_buffer_resize (buffer, 0, total_length);
- } else {
- gst_buffer_resize (buffer, 0, meta->vbuffer.length);
- }
+ /* reset to default size */
+ gst_v4l2_allocator_reset_group (pool->vallocator, group);
/* playback, put the buffer back in the queue to refill later. */
GST_BUFFER_POOL_CLASS (parent_class)->release_buffer (bpool,
buffer);
} else {
- /* the buffer is queued in the device but maybe not played yet. We just
- * leave it there and not make it available for future calls to acquire
- * for now. The buffer will be dequeued and reused later. */
- GST_LOG_OBJECT (pool, "buffer %u is queued", index);
+ /* We keep a ref on queued buffer, so this should never happen */
+ g_assert_not_reached ();
}
break;
}
- case GST_V4L2_IO_USERPTR:
default:
g_assert_not_reached ();
break;
@@ -1264,17 +1322,30 @@ static void
gst_v4l2_buffer_pool_finalize (GObject * object)
{
GstV4l2BufferPool *pool = GST_V4L2_BUFFER_POOL (object);
+ gint i;
- gst_v4l2_buffer_pool_free_buffers (pool);
+ for (i = 0; i < VIDEO_MAX_FRAME; i++) {
+ if (pool->buffers[i])
+ gst_buffer_replace (&(pool->buffers[i]), NULL);
+ }
if (pool->video_fd >= 0)
v4l2_close (pool->video_fd);
+
+ if (pool->vallocator)
+ gst_object_unref (pool->vallocator);
+
if (pool->allocator)
gst_object_unref (pool->allocator);
- g_free (pool->buffers);
+ if (pool->other_pool)
+ gst_object_unref (pool->other_pool);
+
+ /* FIXME Is this required to keep around ? */
gst_object_unref (pool->obj->element);
+ /* FIXME have we done enough here ? */
+
G_OBJECT_CLASS (parent_class)->finalize (object);
}
@@ -1297,7 +1368,6 @@ gst_v4l2_buffer_pool_class_init (GstV4l2BufferPoolClass * klass)
bufferpool_class->alloc_buffer = gst_v4l2_buffer_pool_alloc_buffer;
bufferpool_class->acquire_buffer = gst_v4l2_buffer_pool_acquire_buffer;
bufferpool_class->release_buffer = gst_v4l2_buffer_pool_release_buffer;
- bufferpool_class->free_buffer = gst_v4l2_buffer_pool_free_buffer;
}
/**
@@ -1313,38 +1383,43 @@ gst_v4l2_buffer_pool_new (GstV4l2Object * obj, GstCaps * caps)
{
GstV4l2BufferPool *pool;
GstStructure *config;
- gboolean res = FALSE;
+ gchar *name, *parent_name;
gint fd;
fd = v4l2_dup (obj->video_fd);
if (fd < 0)
goto dup_failed;
- pool = (GstV4l2BufferPool *) g_object_new (GST_TYPE_V4L2_BUFFER_POOL, NULL);
+ /* setting a significant unique name */
+ parent_name = gst_object_get_name (GST_OBJECT (obj->element));
+ name = g_strconcat (parent_name, ":", "pool:",
+ V4L2_TYPE_IS_OUTPUT (obj->type) ? "sink" : "src", NULL);
+ g_free (parent_name);
+
+ pool = (GstV4l2BufferPool *) g_object_new (GST_TYPE_V4L2_BUFFER_POOL,
+ "name", name, NULL);
+ g_free (name);
+
pool->video_fd = fd;
pool->obj = obj;
- pool->can_alloc = TRUE;
-
- config = gst_buffer_pool_get_config (GST_BUFFER_POOL_CAST (pool));
- gst_buffer_pool_config_set_params (config, caps, obj->sizeimage, 2, 0);
- res = gst_buffer_pool_set_config (GST_BUFFER_POOL_CAST (pool), config);
- if (!res)
- goto config_failed;
+ pool->vallocator =
+ gst_v4l2_allocator_new (GST_OBJECT (pool), obj->video_fd, &obj->format);
gst_object_ref (obj->element);
+ config = gst_buffer_pool_get_config (GST_BUFFER_POOL_CAST (pool));
+ gst_buffer_pool_config_set_params (config, caps, obj->info.size, 0, 0);
+ /* This will simply set a default config, but will not configure the pool
+ * because min and max are not valid */
+ gst_buffer_pool_set_config (GST_BUFFER_POOL_CAST (pool), config);
+
return GST_BUFFER_POOL (pool);
/* ERRORS */
dup_failed:
{
- GST_DEBUG ("failed to dup fd %d (%s)", errno, g_strerror (errno));
- return NULL;
- }
-config_failed:
- {
- GST_WARNING ("failed to set pool config");
+ GST_ERROR ("failed to dup fd %d (%s)", errno, g_strerror (errno));
return NULL;
}
}
@@ -1358,7 +1433,7 @@ gst_v4l2_do_read (GstV4l2BufferPool * pool, GstBuffer * buf)
GstMapInfo map;
gint toread;
- toread = obj->sizeimage;
+ toread = obj->info.size;
GST_LOG_OBJECT (pool, "reading %d bytes into buffer %p", toread, buf);
@@ -1414,7 +1489,7 @@ cleanup:
/**
* gst_v4l2_buffer_pool_process:
* @bpool: a #GstBufferPool
- * @buf: a #GstBuffer
+ * @buf: a #GstBuffer, maybe be replaced
*
* Process @buf in @bpool. For capture devices, this functions fills @buf with
* data from the device. For output devices, this functions send the contents of
@@ -1423,7 +1498,7 @@ cleanup:
* Returns: %GST_FLOW_OK on success.
*/
GstFlowReturn
-gst_v4l2_buffer_pool_process (GstV4l2BufferPool * pool, GstBuffer * buf)
+gst_v4l2_buffer_pool_process (GstV4l2BufferPool * pool, GstBuffer ** buf)
{
GstFlowReturn ret = GST_FLOW_OK;
GstBufferPool *bpool = GST_BUFFER_POOL_CAST (pool);
@@ -1431,6 +1506,8 @@ gst_v4l2_buffer_pool_process (GstV4l2BufferPool * pool, GstBuffer * buf)
GST_DEBUG_OBJECT (pool, "process buffer %p", buf);
+ g_return_val_if_fail (gst_buffer_pool_is_active (bpool), GST_FLOW_ERROR);
+
switch (obj->type) {
case V4L2_BUF_TYPE_VIDEO_CAPTURE:
case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE:
@@ -1438,31 +1515,66 @@ gst_v4l2_buffer_pool_process (GstV4l2BufferPool * pool, GstBuffer * buf)
switch (obj->mode) {
case GST_V4L2_IO_RW:
/* capture into the buffer */
- ret = gst_v4l2_do_read (pool, buf);
+ ret = gst_v4l2_do_read (pool, *buf);
break;
case GST_V4L2_IO_MMAP:
+ case GST_V4L2_IO_DMABUF:
{
GstBuffer *tmp;
- if (buf->pool == bpool)
- /* nothing, data was inside the buffer when we did _acquire() */
- goto done;
+ if ((*buf)->pool == bpool) {
+ if (gst_buffer_get_size (*buf) == 0)
+ goto eos;
+ else
+ /* nothing, data was inside the buffer when we did _acquire() */
+ goto done;
+ }
/* buffer not from our pool, grab a frame and copy it into the target */
if ((ret = gst_v4l2_buffer_pool_dqbuf (pool, &tmp)) != GST_FLOW_OK)
goto done;
- if (!gst_v4l2_object_copy (obj, buf, tmp))
- goto copy_failed;
+ /* An empty buffer on capture indicates the end of stream */
+ if (gst_buffer_get_size (tmp) == 0) {
+ gst_v4l2_buffer_pool_release_buffer (bpool, tmp);
+ goto eos;
+ }
+
+ ret = gst_v4l2_buffer_pool_copy_buffer (pool, *buf, tmp);
/* an queue the buffer again after the copy */
- if ((ret = gst_v4l2_buffer_pool_qbuf (pool, tmp)) != GST_FLOW_OK)
- goto done;
+ gst_v4l2_buffer_pool_release_buffer (bpool, tmp);
+
+ if (ret != GST_FLOW_OK)
+ goto copy_failed;
break;
}
case GST_V4L2_IO_USERPTR:
+ {
+ struct UserPtrData *data;
+
+ /* Replace our buffer with downstream allocated buffer */
+ data = gst_mini_object_steal_qdata (GST_MINI_OBJECT (*buf),
+ GST_V4L2_IMPORT_QUARK);
+ gst_buffer_replace (buf, data->buffer);
+ _unmap_userptr_frame (data);
+ break;
+ }
+
+ case GST_V4L2_IO_DMABUF_IMPORT:
+ {
+ GstBuffer *tmp;
+
+ /* Replace our buffer with downstream allocated buffer */
+ tmp = gst_mini_object_steal_qdata (GST_MINI_OBJECT (*buf),
+ GST_V4L2_IMPORT_QUARK);
+ gst_buffer_replace (buf, tmp);
+ gst_buffer_unref (tmp);
+ break;
+ }
+
default:
g_assert_not_reached ();
break;
@@ -1477,74 +1589,63 @@ gst_v4l2_buffer_pool_process (GstV4l2BufferPool * pool, GstBuffer * buf)
/* FIXME, do write() */
GST_WARNING_OBJECT (pool, "implement write()");
break;
+
+ case GST_V4L2_IO_USERPTR:
+ case GST_V4L2_IO_DMABUF_IMPORT:
case GST_V4L2_IO_DMABUF:
case GST_V4L2_IO_MMAP:
{
GstBuffer *to_queue;
- if (buf->pool == bpool) {
+ if ((*buf)->pool == bpool) {
/* nothing, we can queue directly */
- to_queue = gst_buffer_ref (buf);
+ to_queue = gst_buffer_ref (*buf);
GST_LOG_OBJECT (pool, "processing buffer from our pool");
} else {
- GST_LOG_OBJECT (pool, "alloc buffer from our pool");
- if (!gst_buffer_pool_is_active (bpool)) {
- GstStructure *config;
-
- /* this pool was not activated, configure and activate */
- GST_DEBUG_OBJECT (pool, "activating pool");
-
- config = gst_buffer_pool_get_config (bpool);
- gst_buffer_pool_config_add_option (config,
- GST_BUFFER_POOL_OPTION_VIDEO_META);
- gst_buffer_pool_set_config (bpool, config);
+ GstBufferPoolAcquireParams params = { 0 };
- if (!gst_buffer_pool_set_active (bpool, TRUE))
- goto activate_failed;
- }
+ GST_LOG_OBJECT (pool, "alloc buffer from our pool");
- /* this can block if all buffers are outstanding which would be
- * strange because we would expect the upstream element to have
+ /* this can return EOS if all buffers are outstanding which would
+ * be strange because we would expect the upstream element to have
* allocated them and returned to us.. */
- ret = gst_buffer_pool_acquire_buffer (bpool, &to_queue, NULL);
+ params.flags = GST_BUFFER_POOL_ACQUIRE_FLAG_DONTWAIT;
+ ret = gst_buffer_pool_acquire_buffer (bpool, &to_queue, &params);
if (ret != GST_FLOW_OK)
goto acquire_failed;
- /* copy into it and queue */
- if (!gst_v4l2_object_copy (obj, to_queue, buf))
- goto copy_failed;
+ ret = gst_v4l2_buffer_pool_prepare_buffer (pool, to_queue, *buf);
+ if (ret != GST_FLOW_OK) {
+ gst_buffer_unref (to_queue);
+ goto prepare_failed;
+ }
}
if ((ret = gst_v4l2_buffer_pool_qbuf (pool, to_queue)) != GST_FLOW_OK)
- goto done;
+ goto queue_failed;
/* if we are not streaming yet (this is the first buffer, start
* streaming now */
- if (!pool->streaming)
- if (!start_streaming (pool))
+ if (!pool->streaming) {
+ if (!start_streaming (pool)) {
+ gst_buffer_unref (to_queue);
goto start_failed;
+ }
+ }
- if (pool->num_queued == pool->num_allocated) {
+ if (pool->num_queued ==
+ gst_v4l2_allocator_num_allocated (pool->vallocator)) {
GstBuffer *out;
/* all buffers are queued, try to dequeue one and release it back
* into the pool so that _acquire can get to it again. */
ret = gst_v4l2_buffer_pool_dqbuf (pool, &out);
- if (ret != GST_FLOW_OK) {
- gst_buffer_unref (to_queue);
- goto done;
- }
-
- /* release the rendered buffer back into the pool. This wakes up any
- * thread waiting for a buffer in _acquire(). If the buffer still has
- * a pool then this will happen when the refcount reaches 0 */
- if (!out->pool)
- gst_v4l2_buffer_pool_release_buffer (bpool, out);
+ if (ret == GST_FLOW_OK)
+ /* release the rendered buffer back into the pool. This wakes up any
+ * thread waiting for a buffer in _acquire(). */
+ gst_buffer_unref (out);
}
- gst_buffer_unref (to_queue);
break;
}
-
- case GST_V4L2_IO_USERPTR:
default:
g_assert_not_reached ();
break;
@@ -1558,10 +1659,15 @@ done:
return ret;
/* ERRORS */
-activate_failed:
+copy_failed:
{
- GST_ERROR_OBJECT (obj->element, "failed to activate pool");
- return GST_FLOW_ERROR;
+ GST_ERROR_OBJECT (obj->element, "failed to copy buffer");
+ return ret;
+ }
+eos:
+ {
+ GST_DEBUG_OBJECT (obj->element, "end of stream reached");
+ return GST_FLOW_EOS;
}
acquire_failed:
{
@@ -1569,10 +1675,15 @@ acquire_failed:
gst_flow_get_name (ret));
return ret;
}
-copy_failed:
+prepare_failed:
{
- GST_ERROR_OBJECT (obj->element, "failed to copy data");
- return GST_FLOW_ERROR;
+ GST_ERROR_OBJECT (obj->element, "failed to prepare data");
+ return ret;
+ }
+queue_failed:
+ {
+ GST_ERROR_OBJECT (obj->element, "failed to queue buffer");
+ return ret;
}
start_failed:
{
@@ -1583,79 +1694,40 @@ start_failed:
/**
- * gst_v4l2_buffer_pool_flush:
+ * gst_v4l2_buffer_pool_stop_streaming:
* @bpool: a #GstBufferPool
*
* First, set obj->poll to be flushing
* Call STREAMOFF to clear QUEUED flag on every driver buffers.
* Then release all buffers that are in pool->buffers array.
- * Finally call STREAMON if CAPTURE type
- * The caller is responsible to unset flushing on obj->pool
- *
+ *
* Returns: TRUE on success.
*/
gboolean
-gst_v4l2_buffer_pool_flush (GstV4l2BufferPool * pool)
+gst_v4l2_buffer_pool_stop_streaming (GstV4l2BufferPool * pool)
{
- GstBufferPool *bpool = GST_BUFFER_POOL_CAST (pool);
- GstV4l2Object *obj = pool->obj;
- gint i = 0;
+ GST_DEBUG_OBJECT (pool, "stop streaming");
- GST_DEBUG_OBJECT (pool, "flush");
+ if (!stop_streaming (pool))
+ goto stop_failed;
- stop_streaming (pool);
+ return TRUE;
- switch (obj->type) {
- case V4L2_BUF_TYPE_VIDEO_CAPTURE:
- case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE:
- case V4L2_BUF_TYPE_VIDEO_OUTPUT:
- case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE:
- switch (obj->mode) {
- case GST_V4L2_IO_RW:
- break;
- case GST_V4L2_IO_MMAP:
- case GST_V4L2_IO_USERPTR:
- case GST_V4L2_IO_DMABUF:
- {
- for (i = 0; i < pool->num_buffers; i++) {
- GstBuffer *buf = pool->buffers[i];
- if (buf) {
- /* it's necessary to set to NULL before to call
- * gst_v4l2_buffer_pool_release_buffer
- * otherwise it won't go back to the pool */
- pool->buffers[i] = NULL;
-
- /* dicrease counter */
- pool->num_queued--;
-
- /* in CAPTURE mode the pool->num_queued will be re-incremented
- * because the buffers are queued when released */
- if (buf->pool)
- gst_buffer_unref (buf);
- else
- gst_v4l2_buffer_pool_release_buffer (bpool, buf);
- }
- }
+ /* ERRORS */
+stop_failed:
+ {
+ GST_ERROR_OBJECT (pool, "failed to stop streaming");
+ return FALSE;
+ }
+}
- /* do not set pool->num_queued to 0 because
- * the buffers are queued when released */
- break;
- }
+gboolean
+gst_v4l2_buffer_pool_start_streaming (GstV4l2BufferPool * pool)
+{
+ GST_DEBUG_OBJECT (pool, "start straming");
- default:
- g_assert_not_reached ();
- break;
- }
- break;
- default:
- g_assert_not_reached ();
- break;
- }
- /* we can start capturing now, we wait for the playback
- * case until we queued the first buffer */
- if (!V4L2_TYPE_IS_OUTPUT (obj->type))
- if (!start_streaming (pool))
- goto start_failed;
+ if (!start_streaming (pool))
+ goto start_failed;
return TRUE;
@@ -1666,3 +1738,14 @@ start_failed:
return FALSE;
}
}
+
+void
+gst_v4l2_buffer_pool_set_other_pool (GstV4l2BufferPool * pool,
+ GstBufferPool * other_pool)
+{
+ g_return_if_fail (!gst_buffer_pool_is_active (GST_BUFFER_POOL (pool)));
+
+ if (pool->other_pool)
+ gst_object_unref (pool->other_pool);
+ pool->other_pool = gst_object_ref (other_pool);
+}
diff --git a/sys/v4l2/gstv4l2bufferpool.h b/sys/v4l2/gstv4l2bufferpool.h
index 7a7f8c73..3459637d 100644
--- a/sys/v4l2/gstv4l2bufferpool.h
+++ b/sys/v4l2/gstv4l2bufferpool.h
@@ -32,6 +32,7 @@ typedef struct _GstV4l2BufferPoolClass GstV4l2BufferPoolClass;
typedef struct _GstV4l2Meta GstV4l2Meta;
#include "gstv4l2object.h"
+#include "gstv4l2allocator.h"
GST_DEBUG_CATEGORY_EXTERN (v4l2buffer_debug);
@@ -50,20 +51,26 @@ struct _GstV4l2BufferPool
GstV4l2Object *obj; /* the v4l2 object */
gint video_fd; /* a dup(2) of the v4l2object's video_fd */
+ GstV4l2Allocator *vallocator;
GstAllocator *allocator;
GstAllocationParams params;
+ GstBufferPool *other_pool;
guint size;
- gboolean add_videometa;
- gboolean can_alloc; /* if extra buffers can be allocated */
+ GstVideoInfo caps_info; /* Default video information */
+
+ gboolean add_videometa; /* set if video meta should be added */
guint num_buffers; /* number of buffers we use */
- guint num_allocated; /* number of buffers allocated by the driver */
guint num_queued; /* number of buffers queued in the driver */
guint copy_threshold; /* when our pool runs lower, start handing out copies */
gboolean streaming;
+ gboolean flushing;
+
+ GstBuffer *buffers[VIDEO_MAX_FRAME];
- GstBuffer **buffers;
+ /* signal handlers */
+ gulong group_released_handler;
};
struct _GstV4l2BufferPoolClass
@@ -71,44 +78,17 @@ struct _GstV4l2BufferPoolClass
GstBufferPoolClass parent_class;
};
-struct _GstV4l2Meta {
- GstMeta meta;
-
- /* number of v4l2 planes
- * In MPLANE and non MPLANE case it can be one so
- * it contains all yuv planes
- * In MPLANE mode it can be one per yuv plane.
- * For example, 2 for NV12 and 3 for I420
- *
- * In non MPLANE mode it's always equal to 1
- * In MPLANE mode it's equivalent to vbuffer.length
- */
- guint n_planes;
-
- /* only useful in GST_V4L2_IO_MMAP case.
- * it contains address at which the mapping
- * was placed for each v4l2 plane */
- gpointer mem[GST_VIDEO_MAX_PLANES];
-
- /* plane info for multi-planar buffers */
- struct v4l2_plane vplanes[GST_VIDEO_MAX_PLANES];
-
- /* video buffer info */
- struct v4l2_buffer vbuffer;
-};
-
-GType gst_v4l2_meta_api_get_type (void);
-const GstMetaInfo * gst_v4l2_meta_get_info (void);
-#define GST_V4L2_META_GET(buf) ((GstV4l2Meta *)gst_buffer_get_meta(buf,gst_v4l2_meta_api_get_type()))
-#define GST_V4L2_META_ADD(buf) ((GstV4l2Meta *)gst_buffer_add_meta(buf,gst_v4l2_meta_get_info(),NULL))
-
GType gst_v4l2_buffer_pool_get_type (void);
GstBufferPool * gst_v4l2_buffer_pool_new (GstV4l2Object *obj, GstCaps *caps);
-GstFlowReturn gst_v4l2_buffer_pool_process (GstV4l2BufferPool * bpool, GstBuffer * buf);
+GstFlowReturn gst_v4l2_buffer_pool_process (GstV4l2BufferPool * bpool, GstBuffer ** buf);
+
+gboolean gst_v4l2_buffer_pool_stop_streaming (GstV4l2BufferPool * pool);
+gboolean gst_v4l2_buffer_pool_start_streaming (GstV4l2BufferPool * pool);
-gboolean gst_v4l2_buffer_pool_flush (GstV4l2BufferPool * pool);
+void gst_v4l2_buffer_pool_set_other_pool (GstV4l2BufferPool * pool,
+ GstBufferPool * other_pool);
G_END_DECLS
diff --git a/sys/v4l2/gstv4l2devicemonitor.c b/sys/v4l2/gstv4l2devicemonitor.c
index db2f974f..ef967bc4 100644
--- a/sys/v4l2/gstv4l2devicemonitor.c
+++ b/sys/v4l2/gstv4l2devicemonitor.c
@@ -32,6 +32,7 @@
#include "gstv4l2object.h"
#include "v4l2_calls.h"
+#include "v4l2-utils.h"
#ifdef HAVE_GUDEV
#include <gudev/gudev.h>
@@ -162,29 +163,24 @@ static GList *
gst_v4l2_device_monitor_probe (GstDeviceMonitor * monitor)
{
GstV4l2DeviceMonitor *self = GST_V4L2_DEVICE_MONITOR (monitor);
+ GstV4l2Iterator *it;
GList *devices = NULL;
- const gchar *dev_base[] = { "/dev/video", "/dev/v4l2/video", NULL };
- gint base, n;
-
- /*
- * detect /dev entries
- */
- for (n = 0; n < 64; n++) {
- for (base = 0; dev_base[base] != NULL; base++) {
- gchar *dev = g_strdup_printf ("%s%d", dev_base[base], n);
- GstV4l2Device *device;
-
- device = gst_v4l2_device_monitor_probe_device (self, dev, NULL);
-
- if (device) {
- gst_object_ref_sink (device);
- devices = g_list_prepend (devices, device);
- }
- g_free (dev);
+ it = gst_v4l2_iterator_new ();
+
+ while (gst_v4l2_iterator_next (it)) {
+ GstV4l2Device *device;
+
+ device = gst_v4l2_device_monitor_probe_device (self, it->device_path, NULL);
+
+ if (device) {
+ gst_object_ref_sink (device);
+ devices = g_list_prepend (devices, device);
}
}
+ gst_v4l2_iterator_free (it);
+
return devices;
}
diff --git a/sys/v4l2/gstv4l2object.c b/sys/v4l2/gstv4l2object.c
index 4313c346..f868d56b 100644
--- a/sys/v4l2/gstv4l2object.c
+++ b/sys/v4l2/gstv4l2object.c
@@ -45,7 +45,6 @@
#include <gst/video/video.h>
GST_DEBUG_CATEGORY_EXTERN (v4l2_debug);
-GST_DEBUG_CATEGORY_EXTERN (GST_CAT_PERFORMANCE);
#define GST_CAT_DEFAULT v4l2_debug
#define DEFAULT_PROP_DEVICE_NAME NULL
@@ -64,6 +63,85 @@ enum
V4L2_STD_OBJECT_PROPS,
};
+/*
+ * common format / caps utilities:
+ */
+typedef enum
+{
+ GST_V4L2_RAW = 1 << 0,
+ GST_V4L2_CODEC = 1 << 1,
+ GST_V4L2_TRANSPORT = 1 << 2,
+ GST_V4L2_NO_PARSE = 1 << 3,
+ GST_V4L2_ALL = 0xffff
+} GstV4L2FormatFlags;
+
+typedef struct
+{
+ guint32 format;
+ gboolean dimensions;
+ GstV4L2FormatFlags flags;
+} GstV4L2FormatDesc;
+
+static const GstV4L2FormatDesc gst_v4l2_formats[] = {
+ /* from Linux 2.6.15 videodev2.h */
+ {V4L2_PIX_FMT_RGB332, TRUE, GST_V4L2_RAW},
+ {V4L2_PIX_FMT_RGB555, TRUE, GST_V4L2_RAW},
+ {V4L2_PIX_FMT_RGB565, TRUE, GST_V4L2_RAW},
+ {V4L2_PIX_FMT_RGB555X, TRUE, GST_V4L2_RAW},
+ {V4L2_PIX_FMT_RGB565X, TRUE, GST_V4L2_RAW},
+ {V4L2_PIX_FMT_BGR24, TRUE, GST_V4L2_RAW},
+ {V4L2_PIX_FMT_RGB24, TRUE, GST_V4L2_RAW},
+ {V4L2_PIX_FMT_BGR32, TRUE, GST_V4L2_RAW},
+ {V4L2_PIX_FMT_RGB32, TRUE, GST_V4L2_RAW},
+ {V4L2_PIX_FMT_GREY, TRUE, GST_V4L2_RAW},
+ {V4L2_PIX_FMT_YVU410, TRUE, GST_V4L2_RAW},
+ {V4L2_PIX_FMT_YVU420, TRUE, GST_V4L2_RAW},
+ {V4L2_PIX_FMT_YUYV, TRUE, GST_V4L2_RAW},
+ {V4L2_PIX_FMT_UYVY, TRUE, GST_V4L2_RAW},
+ {V4L2_PIX_FMT_YUV422P, TRUE, GST_V4L2_RAW},
+ {V4L2_PIX_FMT_YUV411P, TRUE, GST_V4L2_RAW},
+ {V4L2_PIX_FMT_Y41P, TRUE, GST_V4L2_RAW},
+
+ /* two planes -- one Y, one Cr + Cb interleaved */
+ {V4L2_PIX_FMT_NV12, TRUE, GST_V4L2_RAW},
+ {V4L2_PIX_FMT_NV12M, TRUE, GST_V4L2_RAW},
+ {V4L2_PIX_FMT_NV12MT, TRUE, GST_V4L2_RAW},
+ {V4L2_PIX_FMT_NV21, TRUE, GST_V4L2_RAW},
+ {V4L2_PIX_FMT_NV21M, TRUE, GST_V4L2_RAW},
+
+ /* The following formats are not defined in the V4L2 specification */
+ {V4L2_PIX_FMT_YUV410, TRUE, GST_V4L2_RAW},
+ {V4L2_PIX_FMT_YUV420, TRUE, GST_V4L2_RAW},
+ {V4L2_PIX_FMT_YYUV, TRUE, GST_V4L2_RAW},
+ {V4L2_PIX_FMT_HI240, TRUE, GST_V4L2_RAW},
+
+ /* see http://www.siliconimaging.com/RGB%20Bayer.htm */
+ {V4L2_PIX_FMT_SBGGR8, TRUE, GST_V4L2_CODEC},
+
+ /* compressed formats */
+ {V4L2_PIX_FMT_MJPEG, FALSE, GST_V4L2_CODEC},
+ {V4L2_PIX_FMT_JPEG, FALSE, GST_V4L2_CODEC},
+ {V4L2_PIX_FMT_PJPG, FALSE, GST_V4L2_CODEC},
+ {V4L2_PIX_FMT_DV, FALSE, GST_V4L2_TRANSPORT},
+ {V4L2_PIX_FMT_MPEG, FALSE, GST_V4L2_TRANSPORT},
+ {V4L2_PIX_FMT_MPEG1, FALSE, GST_V4L2_CODEC},
+ {V4L2_PIX_FMT_MPEG2, FALSE, GST_V4L2_CODEC},
+ {V4L2_PIX_FMT_MPEG4, FALSE, GST_V4L2_CODEC},
+ {V4L2_PIX_FMT_H263, FALSE, GST_V4L2_CODEC},
+ {V4L2_PIX_FMT_H264, FALSE, GST_V4L2_CODEC},
+ /* VP8 not parseable */
+ {V4L2_PIX_FMT_VP8, FALSE, GST_V4L2_CODEC | GST_V4L2_NO_PARSE},
+
+ /* Vendor-specific formats */
+ {V4L2_PIX_FMT_WNVA, TRUE, GST_V4L2_CODEC},
+ {V4L2_PIX_FMT_SN9C10X, TRUE, GST_V4L2_CODEC},
+ {V4L2_PIX_FMT_PWC1, TRUE, GST_V4L2_CODEC},
+ {V4L2_PIX_FMT_PWC2, TRUE, GST_V4L2_CODEC},
+ {V4L2_PIX_FMT_YVYU, TRUE, GST_V4L2_RAW},
+};
+
+#define GST_V4L2_FORMAT_COUNT (G_N_ELEMENTS (gst_v4l2_formats))
+
static GSList *gst_v4l2_object_get_format_list (GstV4l2Object * v4l2object);
@@ -159,6 +237,8 @@ gst_v4l2_io_mode_get_type (void)
{GST_V4L2_IO_MMAP, "GST_V4L2_IO_MMAP", "mmap"},
{GST_V4L2_IO_USERPTR, "GST_V4L2_IO_USERPTR", "userptr"},
{GST_V4L2_IO_DMABUF, "GST_V4L2_IO_DMABUF", "dmabuf"},
+ {GST_V4L2_IO_DMABUF_IMPORT, "GST_V4L2_IO_DMABUF_IMPORT",
+ "dmabuf-import"},
{0, NULL, NULL}
};
@@ -292,6 +372,41 @@ gst_v4l2_object_install_properties_helper (GObjectClass * gobject_class,
}
+void
+gst_v4l2_object_install_m2m_properties_helper (GObjectClass * gobject_class)
+{
+ g_object_class_install_property (gobject_class, PROP_DEVICE,
+ g_param_spec_string ("device", "Device", "Device location",
+ NULL, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_class, PROP_DEVICE_NAME,
+ g_param_spec_string ("device-name", "Device name",
+ "Name of the device", DEFAULT_PROP_DEVICE_NAME,
+ G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_class, PROP_DEVICE_FD,
+ g_param_spec_int ("device-fd", "File descriptor",
+ "File descriptor of the device", -1, G_MAXINT, DEFAULT_PROP_DEVICE_FD,
+ G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_class, PROP_OUTPUT_IO_MODE,
+ g_param_spec_enum ("output-io-mode", "Output IO mode",
+ "Output side I/O mode (matches sink pad)",
+ GST_TYPE_V4L2_IO_MODE, DEFAULT_PROP_IO_MODE,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_class, PROP_CAPTURE_IO_MODE,
+ g_param_spec_enum ("capture-io-mode", "Capture IO mode",
+ "Capture I/O mode (matches src pad)",
+ GST_TYPE_V4L2_IO_MODE, DEFAULT_PROP_IO_MODE,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_class, PROP_EXTRA_CONTROLS,
+ g_param_spec_boxed ("extra-controls", "Extra Controls",
+ "Extra v4l2 controls (CIDs) for the device",
+ GST_TYPE_STRUCTURE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+}
+
GstV4l2Object *
gst_v4l2_object_new (GstElement * element,
enum v4l2_buf_type type,
@@ -330,26 +445,6 @@ gst_v4l2_object_new (GstElement * element,
v4l2object->n_v4l2_planes = 0;
- /*
- * this boolean only applies in v4l2-MPLANE mode.
- * TRUE: means it prefers to use several v4l2 (non contiguous)
- * planes. For example if the device supports NV12 and NV12M
- * both in MPLANE mode, then it will prefer NV12M
- * FALSE: means it prefers to use one v4l2 plane (which contains
- * all gst planes as if it was working in non-v4l2-MPLANE mode.
- * For example if the device supports NV12 and NV12M
- * both in MPLANE mode, then it will prefer NV12
- *
- * this boolean is also used to manage the case where the
- * device only supports the mode MPLANE and at the same time it
- * does not support both NV12 and NV12M. So in this case we first
- * try to use the prefered config, and at least try the other case
- * if it fails. For example in MPLANE mode if it has NV12 and not
- * NV21M then even if you set prefered_non_contiguous to TRUE it will
- * try NV21 as well.
- */
- v4l2object->prefered_non_contiguous = TRUE;
-
v4l2object->no_initial_format = FALSE;
return v4l2object;
@@ -481,9 +576,18 @@ gst_v4l2_object_set_property_helper (GstV4l2Object * v4l2object,
}
break;
#endif
+
case PROP_IO_MODE:
v4l2object->req_mode = g_value_get_enum (value);
break;
+ case PROP_CAPTURE_IO_MODE:
+ g_return_val_if_fail (!V4L2_TYPE_IS_OUTPUT (v4l2object->type), FALSE);
+ v4l2object->req_mode = g_value_get_enum (value);
+ break;
+ case PROP_OUTPUT_IO_MODE:
+ g_return_val_if_fail (V4L2_TYPE_IS_OUTPUT (v4l2object->type), FALSE);
+ v4l2object->req_mode = g_value_get_enum (value);
+ break;
case PROP_EXTRA_CONTROLS:{
const GstStructure *s = gst_value_get_structure (value);
@@ -592,6 +696,14 @@ gst_v4l2_object_get_property_helper (GstV4l2Object * v4l2object,
case PROP_IO_MODE:
g_value_set_enum (value, v4l2object->req_mode);
break;
+ case PROP_CAPTURE_IO_MODE:
+ g_return_val_if_fail (!V4L2_TYPE_IS_OUTPUT (v4l2object->type), FALSE);
+ g_value_set_enum (value, v4l2object->req_mode);
+ break;
+ case PROP_OUTPUT_IO_MODE:
+ g_return_val_if_fail (V4L2_TYPE_IS_OUTPUT (v4l2object->type), FALSE);
+ g_value_set_enum (value, v4l2object->req_mode);
+ break;
case PROP_EXTRA_CONTROLS:
gst_value_set_structure (value, v4l2object->extra_controls);
break;
@@ -703,88 +815,6 @@ gst_v4l2_object_close (GstV4l2Object * v4l2object)
return TRUE;
}
-
-/*
- * common format / caps utilities:
- */
-typedef enum
-{
- GST_V4L2_RAW = 1 << 0,
- GST_V4L2_CODEC = 1 << 1,
- GST_V4L2_TRANSPORT = 1 << 2,
- GST_V4L2_NO_PARSE = 1 << 3,
- GST_V4L2_ALL = 0xffff
-} GstV4L2FormatFlags;
-
-typedef struct
-{
- guint32 format;
- gboolean dimensions;
- GstV4L2FormatFlags flags;
-} GstV4L2FormatDesc;
-
-static const GstV4L2FormatDesc gst_v4l2_formats[] = {
- /* from Linux 2.6.15 videodev2.h */
- {V4L2_PIX_FMT_RGB332, TRUE, GST_V4L2_RAW},
- {V4L2_PIX_FMT_RGB555, TRUE, GST_V4L2_RAW},
- {V4L2_PIX_FMT_RGB565, TRUE, GST_V4L2_RAW},
- {V4L2_PIX_FMT_RGB555X, TRUE, GST_V4L2_RAW},
- {V4L2_PIX_FMT_RGB565X, TRUE, GST_V4L2_RAW},
- {V4L2_PIX_FMT_BGR24, TRUE, GST_V4L2_RAW},
- {V4L2_PIX_FMT_RGB24, TRUE, GST_V4L2_RAW},
- {V4L2_PIX_FMT_BGR32, TRUE, GST_V4L2_RAW},
- {V4L2_PIX_FMT_RGB32, TRUE, GST_V4L2_RAW},
- {V4L2_PIX_FMT_GREY, TRUE, GST_V4L2_RAW},
- {V4L2_PIX_FMT_YVU410, TRUE, GST_V4L2_RAW},
- {V4L2_PIX_FMT_YVU420, TRUE, GST_V4L2_RAW},
- {V4L2_PIX_FMT_YUYV, TRUE, GST_V4L2_RAW},
- {V4L2_PIX_FMT_UYVY, TRUE, GST_V4L2_RAW},
- {V4L2_PIX_FMT_YUV422P, TRUE, GST_V4L2_RAW},
- {V4L2_PIX_FMT_YUV411P, TRUE, GST_V4L2_RAW},
- {V4L2_PIX_FMT_Y41P, TRUE, GST_V4L2_RAW},
-
- /* two planes -- one Y, one Cr + Cb interleaved */
- {V4L2_PIX_FMT_NV12, TRUE, GST_V4L2_RAW},
- {V4L2_PIX_FMT_NV12M, TRUE, GST_V4L2_RAW},
- {V4L2_PIX_FMT_NV12MT, TRUE, GST_V4L2_RAW},
- {V4L2_PIX_FMT_NV21, TRUE, GST_V4L2_RAW},
- {V4L2_PIX_FMT_NV21M, TRUE, GST_V4L2_RAW},
-
- /* The following formats are not defined in the V4L2 specification */
- {V4L2_PIX_FMT_YUV410, TRUE, GST_V4L2_RAW},
- {V4L2_PIX_FMT_YUV420, TRUE, GST_V4L2_RAW},
- {V4L2_PIX_FMT_YYUV, TRUE, GST_V4L2_RAW},
- {V4L2_PIX_FMT_HI240, TRUE, GST_V4L2_RAW},
-
- /* see http://www.siliconimaging.com/RGB%20Bayer.htm */
- {V4L2_PIX_FMT_SBGGR8, TRUE, GST_V4L2_CODEC},
-
- /* compressed formats */
- {V4L2_PIX_FMT_MJPEG, FALSE, GST_V4L2_CODEC},
- {V4L2_PIX_FMT_JPEG, FALSE, GST_V4L2_CODEC},
- {V4L2_PIX_FMT_PJPG, FALSE, GST_V4L2_CODEC},
- {V4L2_PIX_FMT_DV, FALSE, GST_V4L2_TRANSPORT},
- {V4L2_PIX_FMT_MPEG, FALSE, GST_V4L2_TRANSPORT},
- {V4L2_PIX_FMT_MPEG1, FALSE, GST_V4L2_CODEC},
- {V4L2_PIX_FMT_MPEG2, FALSE, GST_V4L2_CODEC},
- {V4L2_PIX_FMT_MPEG4, FALSE, GST_V4L2_CODEC},
-
- {V4L2_PIX_FMT_H263, FALSE, GST_V4L2_CODEC},
- {V4L2_PIX_FMT_H264, FALSE, GST_V4L2_CODEC},
- /* VP8 not parseable */
- {V4L2_PIX_FMT_VP8, FALSE, GST_V4L2_CODEC | GST_V4L2_NO_PARSE},
-
- /* Vendor-specific formats */
- {V4L2_PIX_FMT_WNVA, TRUE, GST_V4L2_CODEC},
- {V4L2_PIX_FMT_SN9C10X, TRUE, GST_V4L2_CODEC},
- {V4L2_PIX_FMT_PWC1, TRUE, GST_V4L2_CODEC},
- {V4L2_PIX_FMT_PWC2, TRUE, GST_V4L2_CODEC},
- {V4L2_PIX_FMT_YVYU, TRUE, GST_V4L2_RAW},
-};
-
-#define GST_V4L2_FORMAT_COUNT (G_N_ELEMENTS (gst_v4l2_formats))
-
-
static struct v4l2_fmtdesc *
gst_v4l2_object_get_format_from_fourcc (GstV4l2Object * v4l2object,
guint32 fourcc)
@@ -1143,15 +1173,14 @@ gst_v4l2_object_v4l2fourcc_to_video_format (guint32 fourcc)
break;
default:
format = GST_VIDEO_FORMAT_UNKNOWN;
- g_assert_not_reached ();
break;
}
return format;
}
-GstStructure *
-gst_v4l2_object_v4l2fourcc_to_structure (guint32 fourcc)
+static GstStructure *
+gst_v4l2_object_v4l2fourcc_to_bare_struct (guint32 fourcc)
{
GstStructure *structure = NULL;
@@ -1258,6 +1287,34 @@ gst_v4l2_object_v4l2fourcc_to_structure (guint32 fourcc)
return structure;
}
+GstStructure *
+gst_v4l2_object_v4l2fourcc_to_structure (guint32 fourcc)
+{
+ GstStructure *template;
+ gint i;
+
+ template = gst_v4l2_object_v4l2fourcc_to_bare_struct (fourcc);
+
+ if (template == NULL)
+ goto done;
+
+ for (i = 0; i < GST_V4L2_FORMAT_COUNT; i++) {
+ if (gst_v4l2_formats[i].format != fourcc)
+ continue;
+
+ if (gst_v4l2_formats[i].dimensions) {
+ gst_structure_set (template,
+ "width", GST_TYPE_INT_RANGE, 1, GST_V4L2_MAX_SIZE,
+ "height", GST_TYPE_INT_RANGE, 1, GST_V4L2_MAX_SIZE,
+ "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, 100, 1, NULL);
+ }
+ break;
+ }
+
+done:
+ return template;
+}
+
static GstCaps *
gst_v4l2_object_get_caps_helper (GstV4L2FormatFlags flags)
@@ -1273,15 +1330,34 @@ gst_v4l2_object_get_caps_helper (GstV4L2FormatFlags flags)
continue;
structure =
- gst_v4l2_object_v4l2fourcc_to_structure (gst_v4l2_formats[i].format);
+ gst_v4l2_object_v4l2fourcc_to_bare_struct (gst_v4l2_formats[i].format);
+
if (structure) {
+ GstStructure *alt_s = NULL;
+
if (gst_v4l2_formats[i].dimensions) {
gst_structure_set (structure,
"width", GST_TYPE_INT_RANGE, 1, GST_V4L2_MAX_SIZE,
"height", GST_TYPE_INT_RANGE, 1, GST_V4L2_MAX_SIZE,
"framerate", GST_TYPE_FRACTION_RANGE, 0, 1, 100, 1, NULL);
}
+
+ switch (gst_v4l2_formats[i].format) {
+ case V4L2_PIX_FMT_RGB32:
+ alt_s = gst_structure_copy (structure);
+ gst_structure_set (alt_s, "format", G_TYPE_STRING, "ARGB", NULL);
+ break;
+ case V4L2_PIX_FMT_BGR32:
+ alt_s = gst_structure_copy (structure);
+ gst_structure_set (alt_s, "format", G_TYPE_STRING, "BGRA", NULL);
+ default:
+ break;
+ }
+
gst_caps_append_structure (caps, structure);
+
+ if (alt_s)
+ gst_caps_append_structure (caps, alt_s);
}
}
@@ -1321,38 +1397,6 @@ gst_v4l2_object_get_codec_caps (void)
return gst_caps_ref (caps);
}
-/* gst_v4l2_object_choose_fourcc:
- * @obj a #GstV4l2Object
- * @fourcc_splane The format type in single plane representation
- * @fourcc_mplane The format type in multi-plane representation
- * @fourcc Set to the first format to try
- * @fourcc_alt The alternative format to use, or zero if mplane is not
- * supported. Note that if alternate is used, the prefered_non_contiguous
- * setting need to be inversed.
- *
- * Certain format can be stored into multi-planar buffer type with two
- * representation. As an example, NV12, which has two planes, can be stored
- * into 1 plane of multi-planar buffer sturcture, or two. This function will
- * choose the right format to use base on the object settings.
- */
-static void
-gst_v4l2_object_choose_fourcc (GstV4l2Object * obj, guint32 fourcc_splane,
- guint32 fourcc_mplane, guint32 * fourcc, guint32 * fourcc_alt)
-{
- if (V4L2_TYPE_IS_MULTIPLANAR (obj->type)) {
- if (obj->prefered_non_contiguous) {
- *fourcc = fourcc_mplane;
- *fourcc_alt = fourcc_splane;
- } else {
- *fourcc = fourcc_splane;
- *fourcc_alt = fourcc_mplane;
- }
- } else {
- *fourcc = fourcc_splane;
- *fourcc_alt = 0;
- }
-}
-
/* collect data for the given caps
* @caps: given input caps
* @format: location for the v4l format
@@ -1365,12 +1409,9 @@ gst_v4l2_object_get_caps_info (GstV4l2Object * v4l2object, GstCaps * caps,
struct v4l2_fmtdesc **format, GstVideoInfo * info)
{
GstStructure *structure;
- guint32 fourcc, fourcc_alt = 0;
+ guint32 fourcc = 0, fourcc_nc = 0;
const gchar *mimetype;
- struct v4l2_fmtdesc *fmt;
-
- /* default unknown values */
- fourcc = 0;
+ struct v4l2_fmtdesc *fmt = NULL;
structure = gst_caps_get_structure (caps, 0);
@@ -1405,15 +1446,15 @@ gst_v4l2_object_get_caps_info (GstV4l2Object * v4l2object, GstCaps * caps,
fourcc = V4L2_PIX_FMT_YUV422P;
break;
case GST_VIDEO_FORMAT_NV12:
- gst_v4l2_object_choose_fourcc (v4l2object, V4L2_PIX_FMT_NV12,
- V4L2_PIX_FMT_NV12M, &fourcc, &fourcc_alt);
+ fourcc = V4L2_PIX_FMT_NV12;
+ fourcc_nc = V4L2_PIX_FMT_NV12M;
break;
case GST_VIDEO_FORMAT_NV12_64Z32:
- fourcc = V4L2_PIX_FMT_NV12MT;
+ fourcc_nc = V4L2_PIX_FMT_NV12MT;
break;
case GST_VIDEO_FORMAT_NV21:
- gst_v4l2_object_choose_fourcc (v4l2object, V4L2_PIX_FMT_NV21,
- V4L2_PIX_FMT_NV21M, &fourcc, &fourcc_alt);
+ fourcc = V4L2_PIX_FMT_NV21;
+ fourcc_nc = V4L2_PIX_FMT_NV21M;
break;
case GST_VIDEO_FORMAT_YVYU:
fourcc = V4L2_PIX_FMT_YVYU;
@@ -1484,17 +1525,18 @@ gst_v4l2_object_get_caps_info (GstV4l2Object * v4l2object, GstCaps * caps,
}
}
- if (fourcc == 0)
- goto unhandled_format;
- fmt = gst_v4l2_object_get_format_from_fourcc (v4l2object, fourcc);
+ /* Prefer the non-contiguous if supported */
+ v4l2object->prefered_non_contiguous = TRUE;
+
+ if (fourcc_nc)
+ fmt = gst_v4l2_object_get_format_from_fourcc (v4l2object, fourcc_nc);
+ else if (fourcc == 0)
+ goto unhandled_format;
- if (fmt == NULL && fourcc_alt != 0) {
- GST_DEBUG_OBJECT (v4l2object, "No support for %" GST_FOURCC_FORMAT
- " trying %" GST_FOURCC_FORMAT, GST_FOURCC_ARGS (fourcc),
- GST_FOURCC_ARGS (fourcc_alt));
- v4l2object->prefered_non_contiguous = !v4l2object->prefered_non_contiguous;
- fmt = gst_v4l2_object_get_format_from_fourcc (v4l2object, fourcc_alt);
+ if (fmt == NULL) {
+ fmt = gst_v4l2_object_get_format_from_fourcc (v4l2object, fourcc);
+ v4l2object->prefered_non_contiguous = FALSE;
}
if (fmt == NULL)
@@ -1550,6 +1592,10 @@ gst_v4l2_object_add_aspect_ratio (GstV4l2Object * v4l2object, GstStructure * s)
num = cropcap.pixelaspect.numerator;
den = cropcap.pixelaspect.denominator;
+ /* Ignore PAR that are 0/0 */
+ if (den == 0)
+ return;
+
done:
gst_structure_set (s, "pixel-aspect-ratio", GST_TYPE_FRACTION, num, den,
NULL);
@@ -1563,6 +1609,25 @@ cropcap_failed:
goto done;
}
+/* returns TRUE if the value was changed in place, otherwise FALSE */
+static gboolean
+gst_v4l2src_value_simplify (GValue * val)
+{
+ /* simplify list of one value to one value */
+ if (GST_VALUE_HOLDS_LIST (val) && gst_value_list_get_size (val) == 1) {
+ const GValue *list_val;
+ GValue new_val = G_VALUE_INIT;
+
+ list_val = gst_value_list_get_value (val, 0);
+ g_value_init (&new_val, G_VALUE_TYPE (list_val));
+ g_value_copy (list_val, &new_val);
+ g_value_unset (val);
+ *val = new_val;
+ return TRUE;
+ }
+
+ return FALSE;
+}
/* The frame interval enumeration code first appeared in Linux 2.6.19. */
static GstStructure *
@@ -1751,10 +1816,10 @@ return_data:
(interlaced ? "mixed" : "progressive"), NULL);
if (G_IS_VALUE (&rates)) {
+ gst_v4l2src_value_simplify (&rates);
/* only change the framerate on the template when we have a valid probed new
* value */
- gst_structure_set_value (s, "framerate", &rates);
- g_value_unset (&rates);
+ gst_structure_take_value (s, "framerate", &rates);
} else if (v4l2object->type == V4L2_BUF_TYPE_VIDEO_CAPTURE ||
v4l2object->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) {
gst_structure_set (s, "framerate", GST_TYPE_FRACTION_RANGE, 0, 1, 100, 1,
@@ -1798,6 +1863,8 @@ static void
gst_v4l2_object_update_and_append (GstV4l2Object * v4l2object,
guint32 format, GstCaps * caps, GstStructure * s)
{
+ GstStructure *alt_s = NULL;
+
/* Encoded stream on output buffer need to be parsed */
if (v4l2object->type == V4L2_BUF_TYPE_VIDEO_OUTPUT ||
v4l2object->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) {
@@ -1813,7 +1880,27 @@ gst_v4l2_object_update_and_append (GstV4l2Object * v4l2object,
}
}
+ if (v4l2object->has_alpha_component &&
+ (v4l2object->type == V4L2_BUF_TYPE_VIDEO_CAPTURE ||
+ v4l2object->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE)) {
+ switch (format) {
+ case V4L2_PIX_FMT_RGB32:
+ alt_s = gst_structure_copy (s);
+ gst_structure_set (alt_s, "format", G_TYPE_STRING, "ARGB", NULL);
+ break;
+ case V4L2_PIX_FMT_BGR32:
+ alt_s = gst_structure_copy (s);
+ gst_structure_set (alt_s, "format", G_TYPE_STRING, "BGRA", NULL);
+ break;
+ default:
+ break;
+ }
+ }
+
gst_caps_append_structure (caps, s);
+
+ if (alt_s)
+ gst_caps_append_structure (caps, alt_s);
}
static GstCaps *
@@ -2229,56 +2316,188 @@ no_supported_capture_method:
}
static void
+gst_v4l2_object_set_stride (GstVideoInfo * info, GstVideoAlignment * align,
+ gint plane, gint stride)
+{
+ const GstVideoFormatInfo *finfo = info->finfo;
+
+ if (GST_VIDEO_FORMAT_INFO_IS_TILED (finfo)) {
+ gint x_tiles, y_tiles, ws, hs, tile_height, padded_height;
+
+
+ ws = GST_VIDEO_FORMAT_INFO_TILE_WS (finfo);
+ hs = GST_VIDEO_FORMAT_INFO_TILE_HS (finfo);
+ tile_height = 1 << hs;
+
+ padded_height = GST_VIDEO_FORMAT_INFO_SCALE_HEIGHT (finfo, plane,
+ info->height + align->padding_top + align->padding_bottom);
+ padded_height = GST_ROUND_UP_N (padded_height, tile_height);
+
+ x_tiles = stride >> ws;
+ y_tiles = padded_height >> hs;
+ info->stride[plane] = GST_VIDEO_TILE_MAKE_STRIDE (x_tiles, y_tiles);
+ } else {
+ info->stride[plane] = stride;
+ }
+}
+
+static void
+gst_v4l2_object_extrapolate_info (GstV4l2Object * v4l2object,
+ GstVideoInfo * info, GstVideoAlignment * align, gint stride)
+{
+ const GstVideoFormatInfo *finfo = info->finfo;
+ gint i, estride, padded_height;
+ gsize offs = 0;
+
+ g_return_if_fail (v4l2object->n_v4l2_planes == 1);
+
+ padded_height = info->height + align->padding_top + align->padding_bottom;
+
+ for (i = 0; i < finfo->n_planes; i++) {
+ switch (finfo->format) {
+ case GST_VIDEO_FORMAT_NV12:
+ case GST_VIDEO_FORMAT_NV12_64Z32:
+ case GST_VIDEO_FORMAT_NV21:
+ case GST_VIDEO_FORMAT_NV16:
+ case GST_VIDEO_FORMAT_NV24:
+ estride = (i == 0 ? 1 : 2) *
+ GST_VIDEO_FORMAT_INFO_SCALE_WIDTH (finfo, i, stride);
+ break;
+ default:
+ estride = GST_VIDEO_FORMAT_INFO_SCALE_WIDTH (finfo, i, stride);
+ break;
+ }
+
+ gst_v4l2_object_set_stride (info, align, i, estride);
+
+ info->offset[i] = offs;
+ offs += estride *
+ GST_VIDEO_FORMAT_INFO_SCALE_HEIGHT (finfo, i, padded_height);
+
+ GST_DEBUG_OBJECT (v4l2object->element,
+ "Extrapolated for plane %d with base stride %d: "
+ "stride %d, offset %" G_GSIZE_FORMAT, i, stride, info->stride[i],
+ info->offset[i]);
+ }
+}
+
+static void
gst_v4l2_object_save_format (GstV4l2Object * v4l2object,
struct v4l2_fmtdesc *fmtdesc, struct v4l2_format *format,
- GstVideoInfo * info)
+ GstVideoInfo * info, GstVideoAlignment * align)
{
const GstVideoFormatInfo *finfo = info->finfo;
- gint i;
+ gboolean standard_stride = TRUE;
+ gint stride, padded_width, padded_height, i;
+
+ if (GST_VIDEO_INFO_FORMAT (info) == GST_VIDEO_FORMAT_ENCODED) {
+ v4l2object->n_v4l2_planes = 1;
+ info->size = format->fmt.pix.sizeimage;
+ goto store_info;
+ }
+
+ /* adjust right padding */
+ if (V4L2_TYPE_IS_MULTIPLANAR (v4l2object->type))
+ stride = format->fmt.pix_mp.plane_fmt[0].bytesperline;
+ else
+ stride = format->fmt.pix.bytesperline;
+
+ padded_width = stride / GST_VIDEO_FORMAT_INFO_PSTRIDE (finfo, 0);
+
+ if (padded_width < format->fmt.pix.width)
+ GST_WARNING_OBJECT (v4l2object->element,
+ "Driver bug detected, stride is too small for the width");
+
+ align->padding_right = padded_width - info->width - align->padding_left;
+
+ /* adjust bottom padding */
+ padded_height = format->fmt.pix.height;
+
+ if (GST_VIDEO_FORMAT_INFO_IS_TILED (finfo)) {
+ guint hs, tile_height;
+
+ hs = GST_VIDEO_FORMAT_INFO_TILE_HS (finfo);
+ tile_height = 1 << hs;
+
+ padded_height = GST_ROUND_UP_N (padded_height, tile_height);
+ }
+
+ align->padding_bottom = padded_height - info->height - align->padding_top;
+ /* setup the strides and offset */
if (V4L2_TYPE_IS_MULTIPLANAR (v4l2object->type)) {
+ struct v4l2_pix_format_mplane *pix_mp = &format->fmt.pix_mp;
+
/* figure out the frame layout */
- v4l2object->n_v4l2_planes = MAX (1, format->fmt.pix_mp.num_planes);
- v4l2object->sizeimage = 0;
- for (i = 0; i < format->fmt.pix_mp.num_planes; i++) {
- v4l2object->bytesperline[i] =
- format->fmt.pix_mp.plane_fmt[i].bytesperline;
- v4l2object->sizeimage += format->fmt.pix_mp.plane_fmt[i].sizeimage;
+ v4l2object->n_v4l2_planes = MAX (1, pix_mp->num_planes);
+ info->size = 0;
+ for (i = 0; i < v4l2object->n_v4l2_planes; i++) {
+ stride = pix_mp->plane_fmt[i].bytesperline;
+
+ if (info->stride[i] != stride)
+ standard_stride = FALSE;
+
+ gst_v4l2_object_set_stride (info, align, i, stride);
+ info->offset[i] = info->size;
+ info->size += pix_mp->plane_fmt[i].sizeimage;
+ }
+
+ /* Extrapolate stride if planar format are being set in 1 v4l2 plane */
+ if (v4l2object->n_v4l2_planes < finfo->n_planes) {
+ stride = format->fmt.pix_mp.plane_fmt[0].bytesperline;
+ gst_v4l2_object_extrapolate_info (v4l2object, info, align, stride);
}
} else {
/* only one plane in non-MPLANE mode */
v4l2object->n_v4l2_planes = 1;
+ info->size = format->fmt.pix.sizeimage;
+ stride = format->fmt.pix.bytesperline;
- /* figure out the frame layout */
+ if (info->stride[0] != stride)
+ standard_stride = FALSE;
+
+ gst_v4l2_object_extrapolate_info (v4l2object, info, align, stride);
+ }
+
+ /* adjust the offset to take into account left and top */
+ if (GST_VIDEO_FORMAT_INFO_IS_TILED (finfo)) {
+ if ((align->padding_left + align->padding_top) > 0)
+ GST_WARNING_OBJECT (v4l2object->element,
+ "Left and top padding is not permitted for tiled formats");
+ } else {
for (i = 0; i < finfo->n_planes; i++) {
- guint stride = format->fmt.pix.bytesperline;
-
- switch (finfo->format) {
- case GST_VIDEO_FORMAT_NV12:
- case GST_VIDEO_FORMAT_NV21:
- case GST_VIDEO_FORMAT_NV16:
- case GST_VIDEO_FORMAT_NV24:
- v4l2object->bytesperline[i] = (i == 0 ? 1 : 2) *
- GST_VIDEO_FORMAT_INFO_SCALE_WIDTH (finfo, i, stride);
- break;
- default:
- v4l2object->bytesperline[i] =
- GST_VIDEO_FORMAT_INFO_SCALE_WIDTH (finfo, i, stride);
- break;
- }
+ gint vedge, hedge;
- GST_DEBUG_OBJECT (v4l2object->element,
- "Extrapolated stride for plane %d from %d to %d", i, stride,
- v4l2object->bytesperline[i]);
- }
+ /* FIXME we assume plane as component as this is true for all supported
+ * format we support. */
+
+ hedge = GST_VIDEO_FORMAT_INFO_SCALE_WIDTH (finfo, i, align->padding_left);
+ vedge = GST_VIDEO_FORMAT_INFO_SCALE_HEIGHT (finfo, i, align->padding_top);
- v4l2object->sizeimage = format->fmt.pix.sizeimage;
+ info->offset[i] += (vedge * info->stride[i]) +
+ (hedge * GST_VIDEO_INFO_COMP_PSTRIDE (info, i));
+ }
}
- GST_DEBUG_OBJECT (v4l2object->element, "Got sizeimage %u",
- v4l2object->sizeimage);
+store_info:
+ GST_DEBUG_OBJECT (v4l2object->element, "Got sizeimage %" G_GSIZE_FORMAT,
+ info->size);
+
+ /* to avoid copies we need video meta if top or left padding */
+ v4l2object->need_video_meta =
+ ((align->padding_top + align->padding_left) != 0);
+
+ /* ... or if stride is non "standard" */
+ if (!standard_stride)
+ v4l2object->need_video_meta = TRUE;
+
+ /* ... or also video meta if we use multiple, non-contiguous, planes */
+ if (v4l2object->n_v4l2_planes > 1)
+ v4l2object->need_video_meta = TRUE;
v4l2object->info = *info;
+ v4l2object->align = *align;
+ v4l2object->format = *format;
v4l2object->fmtdesc = fmtdesc;
/* if we have a framerate pre-calculate duration */
@@ -2300,12 +2519,20 @@ gst_v4l2_object_set_format (GstV4l2Object * v4l2object, GstCaps * caps)
guint32 pixelformat;
struct v4l2_fmtdesc *fmtdesc;
GstVideoInfo info;
+ GstVideoAlignment align;
gint width, height, fps_n, fps_d;
+ gint n_v4l_planes;
gint i = 0;
+ gboolean is_mplane, format_changed;
GST_V4L2_CHECK_OPEN (v4l2object);
GST_V4L2_CHECK_NOT_ACTIVE (v4l2object);
+ is_mplane = V4L2_TYPE_IS_MULTIPLANAR (v4l2object->type);
+
+ gst_video_info_init (&info);
+ gst_video_alignment_reset (&align);
+
if (!gst_v4l2_object_get_caps_info (v4l2object, caps, &fmtdesc, &info))
goto invalid_caps;
@@ -2315,9 +2542,11 @@ gst_v4l2_object_set_format (GstV4l2Object * v4l2object, GstCaps * caps)
fps_n = GST_VIDEO_INFO_FPS_N (&info);
fps_d = GST_VIDEO_INFO_FPS_D (&info);
- /* get bytesperline for each plane */
- for (i = 0; i < GST_VIDEO_INFO_N_PLANES (&info); i++)
- v4l2object->bytesperline[i] = GST_VIDEO_INFO_PLANE_STRIDE (&info, i);
+ /* if encoded format (GST_VIDEO_INFO_N_PLANES return 0)
+ * or if contiguous is prefered */
+ n_v4l_planes = GST_VIDEO_INFO_N_PLANES (&info);
+ if (!n_v4l_planes || !v4l2object->prefered_non_contiguous)
+ n_v4l_planes = 1;
if (GST_VIDEO_INFO_IS_INTERLACED (&info)) {
GST_DEBUG_OBJECT (v4l2object->element, "interlaced video");
@@ -2332,22 +2561,19 @@ gst_v4l2_object_set_format (GstV4l2Object * v4l2object, GstCaps * caps)
GST_DEBUG_OBJECT (v4l2object->element, "Desired format %dx%d, format "
"%" GST_FOURCC_FORMAT " stride: %d", width, height,
- GST_FOURCC_ARGS (pixelformat), v4l2object->bytesperline[0]);
+ GST_FOURCC_ARGS (pixelformat), GST_VIDEO_INFO_PLANE_STRIDE (&info, 0));
memset (&format, 0x00, sizeof (struct v4l2_format));
format.type = v4l2object->type;
- if (!v4l2object->no_initial_format) {
+ if (v4l2object->no_initial_format) {
+ format_changed = TRUE;
+ } else {
if (v4l2_ioctl (fd, VIDIOC_G_FMT, &format) < 0)
goto get_fmt_failed;
- }
- if (V4L2_TYPE_IS_MULTIPLANAR (v4l2object->type)) {
- GST_DEBUG_OBJECT (v4l2object->element, "Got format to %dx%d, format "
- "%" GST_FOURCC_FORMAT " colorspace %d, nb planes %d",
- format.fmt.pix_mp.width, format.fmt.pix_mp.height,
- GST_FOURCC_ARGS (format.fmt.pix.pixelformat),
- format.fmt.pix_mp.colorspace, format.fmt.pix_mp.num_planes);
+ /* Note that four first fields are the same between v4l2_pix_format and
+ * v4l2_pix_format_mplane, so we don't need to duplicate he checks */
/* If no size in caps, use configured size */
if (width == 0 && height == 0) {
@@ -2355,132 +2581,151 @@ gst_v4l2_object_set_format (GstV4l2Object * v4l2object, GstCaps * caps)
height = format.fmt.pix_mp.height;
}
- if (format.type != v4l2object->type ||
+ format_changed = format.type != v4l2object->type ||
format.fmt.pix_mp.width != width ||
format.fmt.pix_mp.height != height ||
format.fmt.pix_mp.pixelformat != pixelformat ||
- format.fmt.pix_mp.field != field) {
- /* even in v4l2 multiplanar mode we can work in contiguous mode
- * if the device supports it */
- gint n_v4l_planes = GST_VIDEO_INFO_N_PLANES (&info);
-
- /* if encoded format (GST_VIDEO_INFO_N_PLANES return 0)
- * or if contiguous is prefered */
- if (!n_v4l_planes || !v4l2object->prefered_non_contiguous)
- n_v4l_planes = 1;
-
- /* something different, set the format */
- GST_DEBUG_OBJECT (v4l2object->element, "Setting format to %dx%d, format "
- "%" GST_FOURCC_FORMAT, width, height, GST_FOURCC_ARGS (pixelformat));
-
- format.type = v4l2object->type;
- format.fmt.pix_mp.pixelformat = pixelformat;
- format.fmt.pix_mp.width = width;
- format.fmt.pix_mp.height = height;
- format.fmt.pix_mp.field = field;
- format.fmt.pix_mp.num_planes = n_v4l_planes;
- /* try to ask our prefered stride but it's not a failure
- * if not accepted */
- for (i = 0; i < format.fmt.pix_mp.num_planes; i++)
- format.fmt.pix_mp.plane_fmt[i].bytesperline =
- v4l2object->bytesperline[i];
-
- if (GST_VIDEO_INFO_FORMAT (&info) == GST_VIDEO_FORMAT_ENCODED) {
- format.fmt.pix_mp.plane_fmt[0].sizeimage = ENCODED_BUFFER_SIZE;
- }
-
- if (v4l2_ioctl (fd, VIDIOC_S_FMT, &format) < 0)
- goto set_fmt_failed;
-
- GST_DEBUG_OBJECT (v4l2object->element, "Got format to %dx%d, format "
- "%" GST_FOURCC_FORMAT ", nb planes %d", format.fmt.pix.width,
- format.fmt.pix_mp.height,
- GST_FOURCC_ARGS (format.fmt.pix.pixelformat),
- format.fmt.pix_mp.num_planes);
+ format.fmt.pix_mp.field != field;
+ }
#ifndef GST_DISABLE_GST_DEBUG
- for (i = 0; i < format.fmt.pix_mp.num_planes; i++)
- GST_DEBUG_OBJECT (v4l2object->element, " stride %d",
- format.fmt.pix_mp.plane_fmt[i].bytesperline);
+ if (is_mplane) {
+ GST_DEBUG_OBJECT (v4l2object->element, "Current size is %dx%d, format "
+ "%" GST_FOURCC_FORMAT " colorspace %d, nb planes %d",
+ format.fmt.pix_mp.width, format.fmt.pix_mp.height,
+ GST_FOURCC_ARGS (format.fmt.pix.pixelformat),
+ format.fmt.pix_mp.colorspace, format.fmt.pix_mp.num_planes);
+
+ for (i = 0; i < format.fmt.pix_mp.num_planes; i++)
+ GST_DEBUG_OBJECT (v4l2object->element, " stride %d",
+ format.fmt.pix_mp.plane_fmt[i].bytesperline);
+ } else {
+ GST_DEBUG_OBJECT (v4l2object->element, "Current size is %dx%d, format "
+ "%" GST_FOURCC_FORMAT " stride %d, colorspace %d",
+ format.fmt.pix.width, format.fmt.pix.height,
+ GST_FOURCC_ARGS (format.fmt.pix.pixelformat),
+ format.fmt.pix.bytesperline, format.fmt.pix.colorspace);
+ }
#endif
- if (format.fmt.pix_mp.pixelformat != pixelformat)
- goto invalid_pixelformat;
+ /* If nothing changed, we are done */
+ if (!format_changed)
+ goto done;
- /* we set the dimensions just in case but don't validate them afterwards
- * For some codecs the dimensions are *not* in the bitstream, IIRC VC1
- * in ASF mode for example. */
- if (info.finfo->format != GST_VIDEO_FORMAT_ENCODED) {
- if (format.fmt.pix_mp.width != width
- || format.fmt.pix_mp.height != height)
- goto invalid_dimensions;
- }
+ /* something different, set the format */
+ GST_DEBUG_OBJECT (v4l2object->element, "Setting format to %dx%d, format "
+ "%" GST_FOURCC_FORMAT, width, height, GST_FOURCC_ARGS (pixelformat));
- if (format.fmt.pix_mp.num_planes != n_v4l_planes)
- goto invalid_planes;
- }
+ if (is_mplane) {
+ format.type = v4l2object->type;
+ format.fmt.pix_mp.pixelformat = pixelformat;
+ format.fmt.pix_mp.width = width;
+ format.fmt.pix_mp.height = height;
+ format.fmt.pix_mp.field = field;
+ format.fmt.pix_mp.num_planes = n_v4l_planes;
- /* figure out the frame layout */
- v4l2object->n_v4l2_planes = format.fmt.pix_mp.num_planes;
- v4l2object->sizeimage = 0;
- for (i = 0; i < format.fmt.pix_mp.num_planes; i++) {
- v4l2object->bytesperline[i] = format.fmt.pix_mp.plane_fmt[i].bytesperline;
- v4l2object->sizeimage += format.fmt.pix_mp.plane_fmt[i].sizeimage;
+ /* try to ask our prefered stride but it's not a failure if not
+ * accepted */
+ for (i = 0; i < n_v4l_planes; i++) {
+ gint stride = GST_VIDEO_INFO_PLANE_STRIDE (&info, i);
+
+ if (GST_VIDEO_FORMAT_INFO_IS_TILED (info.finfo))
+ stride = GST_VIDEO_TILE_X_TILES (stride) <<
+ GST_VIDEO_FORMAT_INFO_TILE_WS (info.finfo);
+
+ format.fmt.pix_mp.plane_fmt[i].bytesperline = stride;
}
+
+ if (GST_VIDEO_INFO_FORMAT (&info) == GST_VIDEO_FORMAT_ENCODED)
+ format.fmt.pix_mp.plane_fmt[0].sizeimage = ENCODED_BUFFER_SIZE;
} else {
- GST_DEBUG_OBJECT (v4l2object->element, "Got format to %dx%d, format "
- "%" GST_FOURCC_FORMAT " bytesperline %d, colorspace %d",
- format.fmt.pix.width, format.fmt.pix.height,
- GST_FOURCC_ARGS (format.fmt.pix.pixelformat),
- format.fmt.pix.bytesperline, format.fmt.pix.colorspace);
+ gint stride = GST_VIDEO_INFO_PLANE_STRIDE (&info, 0);
- /* If no size in caps, use configured size */
- if (width == 0 && height == 0) {
- width = format.fmt.pix_mp.width;
- height = format.fmt.pix_mp.height;
- }
+ format.type = v4l2object->type;
+ format.fmt.pix.width = width;
+ format.fmt.pix.height = height;
+ format.fmt.pix.pixelformat = pixelformat;
+ format.fmt.pix.field = field;
- if (format.type != v4l2object->type ||
- format.fmt.pix.width != width ||
- format.fmt.pix.height != height ||
- format.fmt.pix.pixelformat != pixelformat ||
- format.fmt.pix.field != field) {
- /* something different, set the format */
- GST_DEBUG_OBJECT (v4l2object->element, "Setting format to %dx%d, format "
- "%" GST_FOURCC_FORMAT " bytesperline %d", width, height,
- GST_FOURCC_ARGS (pixelformat), v4l2object->bytesperline[0]);
-
- format.type = v4l2object->type;
- format.fmt.pix.width = width;
- format.fmt.pix.height = height;
- format.fmt.pix.pixelformat = pixelformat;
- format.fmt.pix.field = field;
- /* try to ask our prefered stride */
- format.fmt.pix.bytesperline = v4l2object->bytesperline[0];
-
- if (GST_VIDEO_INFO_FORMAT (&info) == GST_VIDEO_FORMAT_ENCODED) {
- format.fmt.pix.sizeimage = ENCODED_BUFFER_SIZE;
- }
+ if (GST_VIDEO_FORMAT_INFO_IS_TILED (info.finfo))
+ stride = GST_VIDEO_TILE_X_TILES (stride) <<
+ GST_VIDEO_FORMAT_INFO_TILE_WS (info.finfo);
- if (v4l2_ioctl (fd, VIDIOC_S_FMT, &format) < 0)
- goto set_fmt_failed;
+ /* try to ask our prefered stride */
+ format.fmt.pix.bytesperline = stride;
- GST_DEBUG_OBJECT (v4l2object->element, "Got format to %dx%d, format "
- "%" GST_FOURCC_FORMAT " stride %d", format.fmt.pix.width,
- format.fmt.pix.height, GST_FOURCC_ARGS (format.fmt.pix.pixelformat),
- format.fmt.pix.bytesperline);
+ if (GST_VIDEO_INFO_FORMAT (&info) == GST_VIDEO_FORMAT_ENCODED)
+ format.fmt.pix.sizeimage = ENCODED_BUFFER_SIZE;
+ }
- /* we set the dimensions just in case but don't validate them afterwards
- * For some codecs the dimensions are *not* in the bitstream, IIRC VC1
- * in ASF mode for example. */
- if (info.finfo->format != GST_VIDEO_FORMAT_ENCODED) {
- if (format.fmt.pix.width != width || format.fmt.pix.height != height)
- goto invalid_dimensions;
- }
+ GST_DEBUG_OBJECT (v4l2object->element, "Desired format is %dx%d, format "
+ "%" GST_FOURCC_FORMAT ", nb planes %d", format.fmt.pix.width,
+ format.fmt.pix_mp.height,
+ GST_FOURCC_ARGS (format.fmt.pix.pixelformat),
+ is_mplane ? format.fmt.pix_mp.num_planes : 1);
- if (format.fmt.pix.pixelformat != pixelformat)
- goto invalid_pixelformat;
- }
+#ifndef GST_DISABLE_GST_DEBUG
+ if (is_mplane) {
+ for (i = 0; i < format.fmt.pix_mp.num_planes; i++)
+ GST_DEBUG_OBJECT (v4l2object->element, " stride %d",
+ format.fmt.pix_mp.plane_fmt[i].bytesperline);
+ } else {
+ GST_DEBUG_OBJECT (v4l2object->element, " stride %d",
+ format.fmt.pix.bytesperline);
+ }
+#endif
+
+ if (v4l2_ioctl (fd, VIDIOC_S_FMT, &format) < 0)
+ goto set_fmt_failed;
+
+ GST_DEBUG_OBJECT (v4l2object->element, "Got format of %dx%d, format "
+ "%" GST_FOURCC_FORMAT ", nb planes %d", format.fmt.pix.width,
+ format.fmt.pix_mp.height,
+ GST_FOURCC_ARGS (format.fmt.pix.pixelformat),
+ is_mplane ? format.fmt.pix_mp.num_planes : 1);
+
+#ifndef GST_DISABLE_GST_DEBUG
+ if (is_mplane) {
+ for (i = 0; i < format.fmt.pix_mp.num_planes; i++)
+ GST_DEBUG_OBJECT (v4l2object->element, " stride %d, sizeimage %d",
+ format.fmt.pix_mp.plane_fmt[i].bytesperline,
+ format.fmt.pix_mp.plane_fmt[i].sizeimage);
+ } else {
+ GST_DEBUG_OBJECT (v4l2object->element, " stride %d, sizeimage %d",
+ format.fmt.pix.bytesperline, format.fmt.pix.sizeimage);
+ }
+#endif
+
+ if (format.fmt.pix.pixelformat != pixelformat)
+ goto invalid_pixelformat;
+
+ /* Only negotiate size with raw data.
+ * For some codecs the dimensions are *not* in the bitstream, IIRC VC1
+ * in ASF mode for example, there is also not reason for a driver to
+ * change the size. */
+ if (info.finfo->format != GST_VIDEO_FORMAT_ENCODED) {
+ /* We can crop larger images */
+ if (format.fmt.pix.width < width || format.fmt.pix.height < height)
+ goto invalid_dimensions;
+
+ /* Note, this will be adjusted if upstream has non-centered cropping. */
+ align.padding_top = 0;
+ align.padding_bottom = format.fmt.pix.height - height;
+ align.padding_left = 0;
+ align.padding_right = format.fmt.pix.width - width;
+ }
+
+ if (is_mplane && format.fmt.pix_mp.num_planes != n_v4l_planes)
+ goto invalid_planes;
+
+ if (GST_VIDEO_INFO_HAS_ALPHA (&info)) {
+ struct v4l2_control ctl = { 0, };
+ ctl.id = V4L2_CID_ALPHA_COMPONENT;
+ ctl.value = 0xff;
+
+ if (v4l2_ioctl (fd, VIDIOC_S_CTRL, &ctl) < 0)
+ GST_WARNING_OBJECT (v4l2object->element,
+ "Failed to set alpha component value");
}
/* Is there a reason we require the caller to always specify a framerate? */
@@ -2538,9 +2783,10 @@ gst_v4l2_object_set_format (GstV4l2Object * v4l2object, GstCaps * caps)
}
done:
- gst_v4l2_object_save_format (v4l2object, fmtdesc, &format, &info);
+ /* add boolean return, so we can fail on drivers bugs */
+ gst_v4l2_object_save_format (v4l2object, fmtdesc, &format, &info, &align);
- /* now configure ther pools */
+ /* now configure the pool */
if (!gst_v4l2_object_setup_pool (v4l2object, caps))
goto pool_failed;
@@ -2626,36 +2872,33 @@ set_parm_failed:
}
pool_failed:
{
- GST_ELEMENT_ERROR (v4l2object->element, RESOURCE, SETTINGS,
- (_("Video device could not create buffer pool.")), GST_ERROR_SYSTEM);
+ /* setup_pool already send the error */
return FALSE;
}
}
/**
- * gst_v4l2_object_setup_format:
+ * gst_v4l2_object_acquire_format:
* @v4l2object the object
* @info a GstVideoInfo to be filled
- * @align a GstVideoAlignment to be filled
*
- * Setup the format base on the currently configured format. This is useful in
- * decoder or encoder elements where the output format is dictated by the
- * input.
+ * Acquire the driver choosen format. This is useful in decoder or encoder elements where
+ * the output format is choosen by the HW.
*
* Returns: %TRUE on success, %FALSE on failure.
*/
gboolean
-gst_v4l2_object_setup_format (GstV4l2Object * v4l2object,
- GstVideoInfo * info, GstVideoAlignment * align)
+gst_v4l2_object_acquire_format (GstV4l2Object * v4l2object, GstVideoInfo * info)
{
struct v4l2_fmtdesc *fmtdesc;
struct v4l2_format fmt;
struct v4l2_crop crop;
GstVideoFormat format;
guint width, height;
+ GstVideoAlignment align;
gst_video_info_init (info);
- gst_video_alignment_reset (align);
+ gst_video_alignment_reset (&align);
memset (&fmt, 0x00, sizeof (struct v4l2_format));
fmt.type = v4l2object->type;
@@ -2670,12 +2913,6 @@ gst_v4l2_object_setup_format (GstV4l2Object * v4l2object,
/* No need to care about mplane, the four first params are the same */
format = gst_v4l2_object_v4l2fourcc_to_video_format (fmt.fmt.pix.pixelformat);
- /* FIXME do more work in the whole function if
- * format is GST_VIDEO_FORMAT_ENCODED
- * Also gst_v4l2_object_v4l2fourcc_to_video_format should be improved
- * because for now it never returns GST_VIDEO_FORMAT_ENCODED
- */
-
/* fails if we do no translate the fmt.pix.pixelformat to GstVideoFormat */
if (format == GST_VIDEO_FORMAT_UNKNOWN)
goto unsupported_format;
@@ -2689,10 +2926,10 @@ gst_v4l2_object_setup_format (GstV4l2Object * v4l2object,
memset (&crop, 0, sizeof (struct v4l2_crop));
crop.type = v4l2object->type;
if (v4l2_ioctl (v4l2object->video_fd, VIDIOC_G_CROP, &crop) >= 0) {
- align->padding_left = crop.c.left;
- align->padding_top = crop.c.top;
- align->padding_right = width - crop.c.width - crop.c.left;
- align->padding_bottom = height - crop.c.height - crop.c.top;
+ align.padding_left = crop.c.left;
+ align.padding_top = crop.c.top;
+ align.padding_right = width - crop.c.width - crop.c.left;
+ align.padding_bottom = height - crop.c.height - crop.c.top;
width = crop.c.width;
height = crop.c.height;
}
@@ -2713,7 +2950,7 @@ gst_v4l2_object_setup_format (GstV4l2Object * v4l2object,
goto unsupported_field;
}
- gst_v4l2_object_save_format (v4l2object, fmtdesc, &fmt, info);
+ gst_v4l2_object_save_format (v4l2object, fmtdesc, &fmt, info, &align);
/* Shall we setup the pool ? */
@@ -2751,18 +2988,56 @@ unsupported_format:
}
gboolean
+gst_v4l2_object_set_crop (GstV4l2Object * obj)
+{
+ struct v4l2_crop crop = { 0 };
+
+ crop.type = obj->type;
+ crop.c.left = obj->align.padding_left;
+ crop.c.top = obj->align.padding_top;
+ crop.c.width = obj->info.width;
+ crop.c.height = obj->info.height;
+
+ if (obj->align.padding_left + obj->align.padding_top +
+ obj->align.padding_right + obj->align.padding_bottom == 0) {
+ GST_DEBUG_OBJECT (obj->element, "no cropping needed");
+ return TRUE;
+ }
+
+ GST_DEBUG_OBJECT (obj->element,
+ "Desired cropping left %u, top %u, size %ux%u", crop.c.left, crop.c.top,
+ crop.c.width, crop.c.height);
+
+ if (v4l2_ioctl (obj->video_fd, VIDIOC_S_CROP, &crop) < 0) {
+ GST_WARNING_OBJECT (obj->element, "VIDIOC_S_CROP failed");
+ return FALSE;
+ }
+
+ GST_DEBUG_OBJECT (obj->element,
+ "Got cropping left %u, top %u, size %ux%u", crop.c.left, crop.c.top,
+ crop.c.width, crop.c.height);
+
+ return TRUE;
+}
+
+gboolean
gst_v4l2_object_caps_equal (GstV4l2Object * v4l2object, GstCaps * caps)
{
- GstStructure *s;
+ GstStructure *config;
GstCaps *oldcaps;
+ gboolean ret;
if (!v4l2object->pool)
return FALSE;
- s = gst_buffer_pool_get_config (GST_BUFFER_POOL_CAST (v4l2object->pool));
- gst_buffer_pool_config_get_params (s, &oldcaps, NULL, NULL, NULL);
+ config = gst_buffer_pool_get_config (v4l2object->pool);
+ gst_buffer_pool_config_get_params (config, &oldcaps, NULL, NULL, NULL);
+
+ ret = oldcaps && gst_caps_is_equal (caps, oldcaps);
- return oldcaps && gst_caps_is_equal (caps, oldcaps);
+ gst_structure_free (config);
+
+ return ret;
}
gboolean
@@ -2795,7 +3070,7 @@ gst_v4l2_object_stop (GstV4l2Object * v4l2object)
if (v4l2object->pool) {
GST_DEBUG_OBJECT (v4l2object->element, "deactivating pool");
- gst_buffer_pool_set_active (GST_BUFFER_POOL_CAST (v4l2object->pool), FALSE);
+ gst_buffer_pool_set_active (v4l2object->pool, FALSE);
gst_object_unref (v4l2object->pool);
v4l2object->pool = NULL;
}
@@ -2806,55 +3081,6 @@ done:
return TRUE;
}
-gboolean
-gst_v4l2_object_copy (GstV4l2Object * v4l2object, GstBuffer * dest,
- GstBuffer * src)
-{
- const GstVideoFormatInfo *finfo = v4l2object->info.finfo;
-
- if (finfo && (finfo->format != GST_VIDEO_FORMAT_UNKNOWN &&
- finfo->format != GST_VIDEO_FORMAT_ENCODED)) {
- GstVideoFrame src_frame, dest_frame;
-
- GST_DEBUG_OBJECT (v4l2object->element, "copy video frame");
-
- /* we have raw video, use videoframe copy to get strides right */
- if (!gst_video_frame_map (&src_frame, &v4l2object->info, src, GST_MAP_READ))
- goto invalid_buffer;
-
- if (!gst_video_frame_map (&dest_frame, &v4l2object->info, dest,
- GST_MAP_WRITE)) {
- gst_video_frame_unmap (&src_frame);
- goto invalid_buffer;
- }
-
- gst_video_frame_copy (&dest_frame, &src_frame);
-
- gst_video_frame_unmap (&src_frame);
- gst_video_frame_unmap (&dest_frame);
- } else {
- GstMapInfo map;
-
- GST_DEBUG_OBJECT (v4l2object->element, "copy raw bytes");
- gst_buffer_map (src, &map, GST_MAP_READ);
- gst_buffer_fill (dest, 0, map.data, gst_buffer_get_size (src));
- gst_buffer_unmap (src, &map);
- gst_buffer_resize (dest, 0, gst_buffer_get_size (src));
- }
- GST_CAT_LOG_OBJECT (GST_CAT_PERFORMANCE, v4l2object->element,
- "slow copy into buffer %p", dest);
-
- return TRUE;
-
- /* ERRORS */
-invalid_buffer:
- {
- /* No Window available to put our image into */
- GST_WARNING_OBJECT (v4l2object->element, "could not map image");
- return FALSE;
- }
-}
-
GstCaps *
gst_v4l2_object_get_caps (GstV4l2Object * v4l2object, GstCaps * filter)
{
@@ -2873,7 +3099,8 @@ gst_v4l2_object_get_caps (GstV4l2Object * v4l2object, GstCaps * filter)
format = (struct v4l2_fmtdesc *) walk->data;
- template = gst_v4l2_object_v4l2fourcc_to_structure (format->pixelformat);
+ template =
+ gst_v4l2_object_v4l2fourcc_to_bare_struct (format->pixelformat);
if (template) {
GstCaps *tmp;
@@ -2908,9 +3135,13 @@ gst_v4l2_object_get_caps (GstV4l2Object * v4l2object, GstCaps * filter)
gboolean
gst_v4l2_object_decide_allocation (GstV4l2Object * obj, GstQuery * query)
{
- GstBufferPool *pool;
- guint size, min, max;
+ GstCaps *caps;
+ GstBufferPool *pool = NULL, *other_pool = NULL;
+ GstStructure *config;
+ guint size, min, max, own_min = 0;
gboolean update;
+ gboolean has_video_meta;
+ gboolean can_share_own_pool, pushing_from_our_pool = FALSE;
struct v4l2_control ctl = { 0, };
GST_DEBUG_OBJECT (obj->element, "decide allocation");
@@ -2918,10 +3149,9 @@ gst_v4l2_object_decide_allocation (GstV4l2Object * obj, GstQuery * query)
g_return_val_if_fail (obj->type == V4L2_BUF_TYPE_VIDEO_CAPTURE ||
obj->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE, FALSE);
- if (obj->pool == NULL) {
- GstCaps *caps;
- gst_query_parse_allocation (query, &caps, NULL);
+ gst_query_parse_allocation (query, &caps, NULL);
+ if (obj->pool == NULL) {
if (!gst_v4l2_object_setup_pool (obj, caps))
goto pool_failed;
}
@@ -2939,37 +3169,15 @@ gst_v4l2_object_decide_allocation (GstV4l2Object * obj, GstQuery * query)
GST_DEBUG_OBJECT (obj->element, "allocation: size:%u min:%u max:%u pool:%"
GST_PTR_FORMAT, size, min, max, pool);
- if (min != 0) {
- /* if there is a min-buffers suggestion, use it. We add 1 because we need 1
- * buffer extra to capture while the other two buffers are downstream */
- min += 1;
- } else {
- min = 2;
- }
+ has_video_meta =
+ gst_query_find_allocation_meta (query, GST_VIDEO_META_API_TYPE, NULL);
- /* Certain driver may expose a minimum through controls */
- ctl.id = V4L2_CID_MIN_BUFFERS_FOR_CAPTURE;
- if (v4l2_ioctl (obj->video_fd, VIDIOC_G_CTRL, &ctl) >= 0) {
- GST_DEBUG_OBJECT (obj->element, "driver require a minimum of %d buffers",
- ctl.value);
- obj->min_buffers_for_capture = ctl.value;
- min += ctl.value;
- }
-
- /* Request a bigger max, if one was suggested but it's too small */
- if (max != 0 && max < min)
- max = min;
+ can_share_own_pool = (has_video_meta || !obj->need_video_meta);
/* select a pool */
switch (obj->mode) {
case GST_V4L2_IO_RW:
- if (pool == NULL) {
- /* no downstream pool, use our own then */
- GST_DEBUG_OBJECT (obj->element,
- "read/write mode: no downstream pool, using our own");
- pool = GST_BUFFER_POOL_CAST (obj->pool);
- size = obj->sizeimage;
- } else {
+ if (pool) {
/* in READ/WRITE mode, prefer a downstream pool because our own pool
* doesn't help much, we have to write to it as well */
GST_DEBUG_OBJECT (obj->element,
@@ -2977,20 +3185,52 @@ gst_v4l2_object_decide_allocation (GstV4l2Object * obj, GstQuery * query)
/* use the bigest size, when we use our own pool we can't really do any
* other size than what the hardware gives us but for downstream pools
* we can try */
- size = MAX (size, obj->sizeimage);
+ size = MAX (size, obj->info.size);
+ } else if (can_share_own_pool) {
+ /* no downstream pool, use our own then */
+ GST_DEBUG_OBJECT (obj->element,
+ "read/write mode: no downstream pool, using our own");
+ pool = gst_object_ref (obj->pool);
+ size = obj->info.size;
+ pushing_from_our_pool = TRUE;
}
break;
- case GST_V4L2_IO_MMAP:
+
case GST_V4L2_IO_USERPTR:
+ case GST_V4L2_IO_DMABUF_IMPORT:
+ /* in importing mode, prefer our own pool, and pass the other pool to
+ * our own, so it can serve itself */
+ if (pool == NULL)
+ goto no_downstream_pool;
+ gst_v4l2_buffer_pool_set_other_pool (GST_V4L2_BUFFER_POOL (obj->pool),
+ pool);
+ other_pool = pool;
+ gst_object_unref (pool);
+ pool = gst_object_ref (obj->pool);
+ size = obj->info.size;
+ break;
+
+ case GST_V4L2_IO_MMAP:
case GST_V4L2_IO_DMABUF:
/* in streaming mode, prefer our own pool */
- if (pool)
- gst_object_unref (pool);
- pool = GST_BUFFER_POOL_CAST (obj->pool);
- size = obj->sizeimage;
- max = 0;
- GST_DEBUG_OBJECT (obj->element,
- "streaming mode: using our own pool %" GST_PTR_FORMAT, pool);
+ /* Check if we can use it ... */
+ if (can_share_own_pool) {
+ if (pool)
+ gst_object_unref (pool);
+ pool = gst_object_ref (obj->pool);
+ size = obj->info.size;
+ GST_DEBUG_OBJECT (obj->element,
+ "streaming mode: using our own pool %" GST_PTR_FORMAT, pool);
+ pushing_from_our_pool = TRUE;
+ } else if (pool) {
+ GST_DEBUG_OBJECT (obj->element,
+ "streaming mode: copying to downstream pool %" GST_PTR_FORMAT,
+ pool);
+ } else {
+ GST_DEBUG_OBJECT (obj->element,
+ "streaming mode: no usable pool, copying to generic pool");
+ size = MAX (size, obj->info.size);
+ }
break;
case GST_V4L2_IO_AUTO:
default:
@@ -2998,35 +3238,213 @@ gst_v4l2_object_decide_allocation (GstV4l2Object * obj, GstQuery * query)
break;
}
- if (pool) {
- GstStructure *config;
- GstCaps *caps;
+ if (size == 0)
+ goto no_size;
+
+ /* Certain driver may expose a minimum through controls */
+ ctl.id = V4L2_CID_MIN_BUFFERS_FOR_CAPTURE;
+ if (v4l2_ioctl (obj->video_fd, VIDIOC_G_CTRL, &ctl) >= 0) {
+ GST_DEBUG_OBJECT (obj->element, "driver require a minimum of %d buffers",
+ ctl.value);
+ obj->min_buffers_for_capture = ctl.value;
+ } else {
+ obj->min_buffers_for_capture = 0;
+ }
+
+ /* If pushing from our own pool, configure it with queried minimum,
+ * otherwise use the minimum required */
+ if (pushing_from_our_pool) {
+ /* When pushing from our own pool, we need what downstream one, to be able
+ * to fill the pipeline, the minimum required to decoder according to the
+ * driver and 1 more, so we don't endup up with everything downstream or
+ * held by the decoder. */
+ own_min = min + obj->min_buffers_for_capture + 1;
+
+ /* Update min/max so the base class does not reset our settings */
+ min = own_min;
+ max = 0;
+ } else {
+ /* In this case we'll have to configure two buffer pool. For our buffer
+ * pool, we'll need what the driver one, and one more, so we can dequeu */
+ own_min = obj->min_buffers_for_capture + 1;
+
+ /* for the downstream pool, we keep what downstream wants, though ensure
+ * at least a minimum if downstream didn't suggest anything (we are
+ * expecting the base class to create a default one for the context) */
+ min = MAX (min, GST_V4L2_MIN_BUFFERS);
+ }
+
+ /* Request a bigger max, if one was suggested but it's too small */
+ if (max != 0)
+ max = MAX (min, max);
+
+ /* First step, configure our own pool */
+
+ config = gst_buffer_pool_get_config (obj->pool);
+
+ /* If already configured/active, skip it */
+ /* FIXME not entirely correct, See bug 728268 */
+ if (gst_buffer_pool_is_active (obj->pool)) {
+ gst_buffer_pool_config_get_params (config, NULL, &size, &min, &max);
+ goto setup_other_pool;
+ }
+
+ if (obj->need_video_meta) {
+ GST_DEBUG_OBJECT (obj->element, "activate Video Meta");
+ gst_buffer_pool_config_add_option (config,
+ GST_BUFFER_POOL_OPTION_VIDEO_META);
+ }
+
+ gst_buffer_pool_config_set_params (config, caps, size, own_min, 0);
+
+ GST_DEBUG_OBJECT (obj->element, "setting own pool config to %"
+ GST_PTR_FORMAT, config);
+
+ /* Our pool often need to adjust the value */
+ if (!gst_buffer_pool_set_config (obj->pool, config)) {
+ config = gst_buffer_pool_get_config (obj->pool);
+
+ GST_DEBUG_OBJECT (obj->element, "own pool config changed to %"
+ GST_PTR_FORMAT, config);
+
+ /* our pool will adjust the maximum buffer, which we are fine with */
+ if (obj->pool == pool)
+ gst_buffer_pool_config_get_params (config, NULL, &size, &min, &max);
+
+ if (!gst_buffer_pool_set_config (obj->pool, config))
+ goto config_failed;
+ }
+
+setup_other_pool:
+
+ /* Now configure the other pool if different */
+ if (obj->pool != pool)
+ other_pool = pool;
+
+ if (other_pool) {
+ if (gst_buffer_pool_is_active (obj->pool))
+ goto done;
config = gst_buffer_pool_get_config (pool);
- gst_buffer_pool_config_get_params (config, &caps, NULL, NULL, NULL);
gst_buffer_pool_config_set_params (config, caps, size, min, max);
+ GST_DEBUG_OBJECT (obj->element, "setting other pool config to %"
+ GST_PTR_FORMAT, config);
+
/* if downstream supports video metadata, add this to the pool config */
- if (gst_query_find_allocation_meta (query, GST_VIDEO_META_API_TYPE, NULL)) {
- GST_DEBUG_OBJECT (pool, "activate Video Meta");
+ if (has_video_meta) {
+ GST_DEBUG_OBJECT (obj->element, "activate Video Meta");
gst_buffer_pool_config_add_option (config,
GST_BUFFER_POOL_OPTION_VIDEO_META);
}
+ /* TODO check return value, validate changes and confirm */
gst_buffer_pool_set_config (pool, config);
}
+done:
if (update)
gst_query_set_nth_allocation_pool (query, 0, pool, size, min, max);
else
gst_query_add_allocation_pool (query, pool, size, min, max);
+ if (pool)
+ gst_object_unref (pool);
+
return TRUE;
pool_failed:
{
+ /* setup_pool already send the error */
+ goto cleanup;
+ }
+config_failed:
+ {
+ GST_ELEMENT_ERROR (obj->element, RESOURCE, SETTINGS,
+ (_("Failed to configure internal buffer pool.")), (NULL));
+ goto cleanup;
+ }
+no_size:
+ {
GST_ELEMENT_ERROR (obj->element, RESOURCE, SETTINGS,
- (_("Video device could not create buffer pool.")), GST_ERROR_SYSTEM);
+ (_("Video device did not suggest any buffer size.")), (NULL));
+ goto cleanup;
+ }
+cleanup:
+ {
+ if (pool)
+ gst_object_unref (pool);
+ return FALSE;
+ }
+no_downstream_pool:
+ {
+ GST_ELEMENT_ERROR (obj->element, RESOURCE, SETTINGS,
+ (_("No downstream pool to import from.")),
+ ("When importing DMABUF or USERPTR, we need a pool to import from"));
+ return FALSE;
+ }
+}
+
+gboolean
+gst_v4l2_object_propose_allocation (GstV4l2Object * obj, GstQuery * query)
+{
+ GstBufferPool *pool;
+ /* we need at least 2 buffers to operate */
+ guint size, min, max;
+ GstCaps *caps;
+ gboolean need_pool;
+
+ /* Set defaults allocation parameters */
+ size = obj->info.size;
+ min = GST_V4L2_MIN_BUFFERS;
+ max = VIDEO_MAX_FRAME;
+
+ gst_query_parse_allocation (query, &caps, &need_pool);
+
+ if (caps == NULL)
+ goto no_caps;
+
+ if ((pool = obj->pool))
+ gst_object_ref (pool);
+
+ if (pool != NULL) {
+ GstCaps *pcaps;
+ GstStructure *config;
+
+ /* we had a pool, check caps */
+ config = gst_buffer_pool_get_config (pool);
+ gst_buffer_pool_config_get_params (config, &pcaps, NULL, NULL, NULL);
+
+ GST_DEBUG_OBJECT (obj->element,
+ "we had a pool with caps %" GST_PTR_FORMAT, pcaps);
+ if (!gst_caps_is_equal (caps, pcaps)) {
+ gst_structure_free (config);
+ gst_object_unref (pool);
+ goto different_caps;
+ }
+ gst_structure_free (config);
+ }
+
+ gst_query_add_allocation_pool (query, pool, size, min, max);
+
+ /* we also support various metadata */
+ gst_query_add_allocation_meta (query, GST_VIDEO_META_API_TYPE, NULL);
+
+ if (pool)
+ gst_object_unref (pool);
+
+ return TRUE;
+
+ /* ERRORS */
+no_caps:
+ {
+ GST_DEBUG_OBJECT (obj->element, "no caps specified");
+ return FALSE;
+ }
+different_caps:
+ {
+ /* different caps, we can't use this pool */
+ GST_DEBUG_OBJECT (obj->element, "pool has different caps");
return FALSE;
}
}
diff --git a/sys/v4l2/gstv4l2object.h b/sys/v4l2/gstv4l2object.h
index c205b2ef..dbab5274 100644
--- a/sys/v4l2/gstv4l2object.h
+++ b/sys/v4l2/gstv4l2object.h
@@ -38,8 +38,7 @@ typedef struct _GstV4l2Xv GstV4l2Xv;
#include <gstv4l2bufferpool.h>
/* size of v4l2 buffer pool in streaming case */
-#define GST_V4L2_MAX_BUFFERS 16
-#define GST_V4L2_MIN_BUFFERS 1
+#define GST_V4L2_MIN_BUFFERS 2
/* max frame width/height */
#define GST_V4L2_MAX_SIZE (1<<15) /* 2^15 == 32768 */
@@ -52,11 +51,12 @@ GType gst_v4l2_io_mode_get_type (void);
#define GST_V4L2_OBJECT(obj) (GstV4l2Object *)(obj)
typedef enum {
- GST_V4L2_IO_AUTO = 0,
- GST_V4L2_IO_RW = 1,
- GST_V4L2_IO_MMAP = 2,
- GST_V4L2_IO_USERPTR = 3,
- GST_V4L2_IO_DMABUF = 4
+ GST_V4L2_IO_AUTO = 0,
+ GST_V4L2_IO_RW = 1,
+ GST_V4L2_IO_MMAP = 2,
+ GST_V4L2_IO_USERPTR = 3,
+ GST_V4L2_IO_DMABUF = 4,
+ GST_V4L2_IO_DMABUF_IMPORT = 5
} GstV4l2IOMode;
typedef gboolean (*GstV4l2GetInOutFunction) (GstV4l2Object * v4l2object, gint * input);
@@ -96,7 +96,13 @@ struct _GstV4l2Object {
/* the current format */
struct v4l2_fmtdesc *fmtdesc;
+ struct v4l2_format format;
GstVideoInfo info;
+ GstVideoAlignment align;
+
+ /* Features */
+ gboolean need_video_meta;
+ gboolean has_alpha_component;
/* only used if the device supports MPLANE
* nb planes is meaning of v4l2 planes
@@ -104,11 +110,10 @@ struct _GstV4l2Object {
*/
gint n_v4l2_planes;
- guint32 bytesperline[GST_VIDEO_MAX_PLANES];
- guint32 sizeimage;
+ /* We cache the frame duration if known */
GstClockTime duration;
- /* if the MPLANE device support both contiguous and non contiguous
+ /* if the MPLANE device support both contiguous and non contiguous
* it allows to select which one we want. But we prefered_non_contiguous
* non contiguous mode.
*/
@@ -185,6 +190,8 @@ GType gst_v4l2_object_get_type (void);
PROP_HUE, \
PROP_TV_NORM, \
PROP_IO_MODE, \
+ PROP_OUTPUT_IO_MODE, \
+ PROP_CAPTURE_IO_MODE, \
PROP_EXTRA_CONTROLS, \
PROP_PIXEL_ASPECT_RATIO, \
PROP_FORCE_ASPECT_RATIO
@@ -204,6 +211,8 @@ void gst_v4l2_object_destroy (GstV4l2Object * v4l2object);
void gst_v4l2_object_install_properties_helper (GObjectClass * gobject_class,
const char * default_device);
+void gst_v4l2_object_install_m2m_properties_helper (GObjectClass * gobject_class);
+
gboolean gst_v4l2_object_set_property_helper (GstV4l2Object * v4l2object,
guint prop_id,
const GValue * value,
@@ -246,20 +255,20 @@ gboolean gst_v4l2_object_unlock_stop (GstV4l2Object * v4l2object);
gboolean gst_v4l2_object_stop (GstV4l2Object * v4l2object);
-
-gboolean gst_v4l2_object_copy (GstV4l2Object * v4l2object,
- GstBuffer * dest, GstBuffer * src);
-
GstCaps * gst_v4l2_object_get_caps (GstV4l2Object * v4l2object,
GstCaps * filter);
-gboolean gst_v4l2_object_setup_format (GstV4l2Object * v4l2object,
- GstVideoInfo * info,
- GstVideoAlignment * align);
+gboolean gst_v4l2_object_acquire_format (GstV4l2Object * v4l2object,
+ GstVideoInfo * info);
+
+gboolean gst_v4l2_object_set_crop (GstV4l2Object * obj);
gboolean gst_v4l2_object_decide_allocation (GstV4l2Object * v4l2object,
GstQuery * query);
+gboolean gst_v4l2_object_propose_allocation (GstV4l2Object * obj,
+ GstQuery * query);
+
GstStructure * gst_v4l2_object_v4l2fourcc_to_structure (guint32 fourcc);
diff --git a/sys/v4l2/gstv4l2sink.c b/sys/v4l2/gstv4l2sink.c
index 24f6d3f9..93f20bb8 100644
--- a/sys/v4l2/gstv4l2sink.c
+++ b/sys/v4l2/gstv4l2sink.c
@@ -536,61 +536,7 @@ static gboolean
gst_v4l2sink_propose_allocation (GstBaseSink * bsink, GstQuery * query)
{
GstV4l2Sink *v4l2sink = GST_V4L2SINK (bsink);
- GstV4l2Object *obj = v4l2sink->v4l2object;
- GstBufferPool *pool;
- guint size = 0;
- GstCaps *caps;
- gboolean need_pool;
-
- gst_query_parse_allocation (query, &caps, &need_pool);
-
- if (caps == NULL)
- goto no_caps;
-
- if ((pool = obj->pool))
- gst_object_ref (pool);
-
- if (pool != NULL) {
- GstCaps *pcaps;
- GstStructure *config;
-
- /* we had a pool, check caps */
- config = gst_buffer_pool_get_config (pool);
- gst_buffer_pool_config_get_params (config, &pcaps, &size, NULL, NULL);
-
- GST_DEBUG_OBJECT (v4l2sink,
- "we had a pool with caps %" GST_PTR_FORMAT, pcaps);
- if (!gst_caps_is_equal (caps, pcaps)) {
- gst_structure_free (config);
- gst_object_unref (pool);
- goto different_caps;
- }
- gst_structure_free (config);
- }
- /* we need at least 2 buffers to operate */
- gst_query_add_allocation_pool (query, pool, size, 2, 0);
-
- /* we also support various metadata */
- gst_query_add_allocation_meta (query, GST_VIDEO_META_API_TYPE, NULL);
- gst_query_add_allocation_meta (query, GST_VIDEO_CROP_META_API_TYPE, NULL);
-
- if (pool)
- gst_object_unref (pool);
-
- return TRUE;
-
- /* ERRORS */
-no_caps:
- {
- GST_DEBUG_OBJECT (v4l2sink, "no caps specified");
- return FALSE;
- }
-different_caps:
- {
- /* different caps, we can't use this pool */
- GST_DEBUG_OBJECT (v4l2sink, "pool has different caps");
- return FALSE;
- }
+ return gst_v4l2_object_propose_allocation (v4l2sink->v4l2object, query);
}
/* called after A/V sync to render frame */
@@ -600,14 +546,30 @@ gst_v4l2sink_show_frame (GstBaseSink * bsink, GstBuffer * buf)
GstFlowReturn ret;
GstV4l2Sink *v4l2sink = GST_V4L2SINK (bsink);
GstV4l2Object *obj = v4l2sink->v4l2object;
+ GstBufferPool *bpool = GST_BUFFER_POOL (obj->pool);
GST_DEBUG_OBJECT (v4l2sink, "render buffer: %p", buf);
if (G_UNLIKELY (obj->pool == NULL))
goto not_negotiated;
- ret =
- gst_v4l2_buffer_pool_process (GST_V4L2_BUFFER_POOL_CAST (obj->pool), buf);
+ if (G_UNLIKELY (!gst_buffer_pool_is_active (bpool))) {
+ GstStructure *config;
+
+ /* this pool was not activated, configure and activate */
+ GST_DEBUG_OBJECT (bsink, "activating pool");
+
+ config = gst_buffer_pool_get_config (bpool);
+ gst_buffer_pool_config_add_option (config,
+ GST_BUFFER_POOL_OPTION_VIDEO_META);
+ gst_buffer_pool_set_config (bpool, config);
+
+ if (!gst_buffer_pool_set_active (bpool, TRUE))
+ goto activate_failed;
+ }
+
+ ret = gst_v4l2_buffer_pool_process (GST_V4L2_BUFFER_POOL_CAST (obj->pool),
+ &buf);
return ret;
@@ -617,4 +579,11 @@ not_negotiated:
GST_ERROR_OBJECT (bsink, "not negotiated");
return GST_FLOW_NOT_NEGOTIATED;
}
+activate_failed:
+ {
+ GST_ELEMENT_ERROR (bsink, RESOURCE, SETTINGS,
+ (_("Failed to allocated required memory.")),
+ ("Buffer pool activation failed"));
+ return GST_FLOW_ERROR;
+ }
}
diff --git a/sys/v4l2/gstv4l2src.c b/sys/v4l2/gstv4l2src.c
index e388a3f3..12a30df2 100644
--- a/sys/v4l2/gstv4l2src.c
+++ b/sys/v4l2/gstv4l2src.c
@@ -112,7 +112,7 @@ static GstCaps *gst_v4l2src_get_caps (GstBaseSrc * src, GstCaps * filter);
static gboolean gst_v4l2src_query (GstBaseSrc * bsrc, GstQuery * query);
static gboolean gst_v4l2src_decide_allocation (GstBaseSrc * src,
GstQuery * query);
-static GstFlowReturn gst_v4l2src_fill (GstPushSrc * src, GstBuffer * out);
+static GstFlowReturn gst_v4l2src_create (GstPushSrc * src, GstBuffer ** out);
static GstCaps *gst_v4l2src_fixate (GstBaseSrc * basesrc, GstCaps * caps);
static gboolean gst_v4l2src_negotiate (GstBaseSrc * basesrc);
@@ -185,7 +185,7 @@ gst_v4l2src_class_init (GstV4l2SrcClass * klass)
basesrc_class->decide_allocation =
GST_DEBUG_FUNCPTR (gst_v4l2src_decide_allocation);
- pushsrc_class->fill = GST_DEBUG_FUNCPTR (gst_v4l2src_fill);
+ pushsrc_class->create = GST_DEBUG_FUNCPTR (gst_v4l2src_create);
klass->v4l2_class_devices = NULL;
@@ -612,7 +612,7 @@ gst_v4l2src_change_state (GstElement * element, GstStateChange transition)
}
static GstFlowReturn
-gst_v4l2src_fill (GstPushSrc * src, GstBuffer * buf)
+gst_v4l2src_create (GstPushSrc * src, GstBuffer ** buf)
{
GstV4l2Src *v4l2src = GST_V4L2SRC (src);
GstV4l2Object *obj = v4l2src->v4l2object;
@@ -621,14 +621,19 @@ gst_v4l2src_fill (GstPushSrc * src, GstBuffer * buf)
GstClockTime abs_time, base_time, timestamp, duration;
GstClockTime delay;
+ ret = GST_BASE_SRC_CLASS (parent_class)->alloc (GST_BASE_SRC (src), 0,
+ obj->info.size, buf);
+
+ if (G_UNLIKELY (ret != GST_FLOW_OK))
+ goto alloc_failed;
+
ret =
gst_v4l2_buffer_pool_process (GST_V4L2_BUFFER_POOL_CAST (obj->pool), buf);
if (G_UNLIKELY (ret != GST_FLOW_OK))
goto error;
-
- timestamp = GST_BUFFER_TIMESTAMP (buf);
+ timestamp = GST_BUFFER_TIMESTAMP (*buf);
duration = obj->duration;
/* timestamps, LOCK to get clock and base time. */
@@ -688,8 +693,8 @@ gst_v4l2src_fill (GstPushSrc * src, GstBuffer * buf)
}
/* set buffer metadata */
- GST_BUFFER_OFFSET (buf) = v4l2src->offset++;
- GST_BUFFER_OFFSET_END (buf) = v4l2src->offset;
+ GST_BUFFER_OFFSET (*buf) = v4l2src->offset++;
+ GST_BUFFER_OFFSET_END (*buf) = v4l2src->offset;
if (G_LIKELY (abs_time != GST_CLOCK_TIME_NONE)) {
/* the time now is the time of the clock minus the base time */
@@ -718,12 +723,19 @@ gst_v4l2src_fill (GstPushSrc * src, GstBuffer * buf)
GST_INFO_OBJECT (src, "sync to %" GST_TIME_FORMAT " out ts %" GST_TIME_FORMAT,
GST_TIME_ARGS (v4l2src->ctrl_time), GST_TIME_ARGS (timestamp));
- GST_BUFFER_TIMESTAMP (buf) = timestamp;
- GST_BUFFER_DURATION (buf) = duration;
+ GST_BUFFER_TIMESTAMP (*buf) = timestamp;
+ GST_BUFFER_DURATION (*buf) = duration;
return ret;
/* ERROR */
+alloc_failed:
+ {
+ if (ret != GST_FLOW_FLUSHING)
+ GST_ELEMENT_ERROR (src, RESOURCE, NO_SPACE_LEFT,
+ ("Failed to allocate a buffer"), (NULL));
+ return ret;
+ }
error:
{
GST_DEBUG_OBJECT (src, "error processing buffer %d (%s)", ret,
diff --git a/sys/v4l2/gstv4l2transform.c b/sys/v4l2/gstv4l2transform.c
new file mode 100644
index 00000000..a314bd0e
--- /dev/null
+++ b/sys/v4l2/gstv4l2transform.c
@@ -0,0 +1,773 @@
+/*
+ * Copyright (C) 2014 Collabora Ltd.
+ * Author: Nicolas Dufresne <nicolas.dufresne@collabora.co.uk>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <unistd.h>
+#include <string.h>
+
+#include "gstv4l2transform.h"
+#include "v4l2_calls.h"
+
+#include <string.h>
+#include <gst/gst-i18n-plugin.h>
+
+#define DEFAULT_PROP_DEVICE "/dev/video10"
+
+#define V4L2_TRANSFORM_QUARK \
+ g_quark_from_static_string("gst-v4l2-transform-info")
+
+GST_DEBUG_CATEGORY_STATIC (gst_v4l2_transform_debug);
+#define GST_CAT_DEFAULT gst_v4l2_transform_debug
+
+
+enum
+{
+ PROP_0,
+ V4L2_STD_OBJECT_PROPS
+};
+
+typedef struct
+{
+ gchar *device;
+ GstCaps *sink_caps;
+ GstCaps *src_caps;
+} GstV4l2TransformCData;
+
+#define gst_v4l2_transform_parent_class parent_class
+G_DEFINE_ABSTRACT_TYPE (GstV4l2Transform, gst_v4l2_transform,
+ GST_TYPE_BASE_TRANSFORM);
+
+static void
+gst_v4l2_transform_set_property (GObject * object,
+ guint prop_id, const GValue * value, GParamSpec * pspec)
+{
+ GstV4l2Transform *self = GST_V4L2_TRANSFORM (object);
+
+ switch (prop_id) {
+ case PROP_OUTPUT_IO_MODE:
+ gst_v4l2_object_set_property_helper (self->v4l2output, prop_id, value,
+ pspec);
+ break;
+ case PROP_CAPTURE_IO_MODE:
+ gst_v4l2_object_set_property_helper (self->v4l2capture, PROP_IO_MODE,
+ value, pspec);
+ break;
+
+ /* By default, only set on output */
+ default:
+ if (!gst_v4l2_object_set_property_helper (self->v4l2output,
+ prop_id, value, pspec)) {
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ }
+ break;
+ }
+}
+
+static void
+gst_v4l2_transform_get_property (GObject * object,
+ guint prop_id, GValue * value, GParamSpec * pspec)
+{
+ GstV4l2Transform *self = GST_V4L2_TRANSFORM (object);
+
+ switch (prop_id) {
+ case PROP_OUTPUT_IO_MODE:
+ gst_v4l2_object_get_property_helper (self->v4l2output, prop_id, value,
+ pspec);
+ break;
+ case PROP_CAPTURE_IO_MODE:
+ gst_v4l2_object_get_property_helper (self->v4l2capture, prop_id, value,
+ pspec);
+ break;
+
+ /* By default read from output */
+ default:
+ if (!gst_v4l2_object_get_property_helper (self->v4l2output,
+ prop_id, value, pspec)) {
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ }
+ break;
+ }
+}
+
+static gboolean
+gst_v4l2_transform_open (GstV4l2Transform * self)
+{
+ GST_DEBUG_OBJECT (self, "Opening");
+
+ if (!gst_v4l2_object_open (self->v4l2output))
+ goto failure;
+
+ if (!gst_v4l2_object_open_shared (self->v4l2capture, self->v4l2output))
+ goto failure;
+
+ self->probed_sinkcaps = gst_v4l2_object_get_caps (self->v4l2output,
+ gst_v4l2_object_get_raw_caps ());
+
+ if (gst_caps_is_empty (self->probed_sinkcaps))
+ goto no_input_format;
+
+ self->probed_srccaps = gst_v4l2_object_get_caps (self->v4l2capture,
+ gst_v4l2_object_get_raw_caps ());
+
+ if (gst_caps_is_empty (self->probed_srccaps))
+ goto no_output_format;
+
+ return TRUE;
+
+no_input_format:
+ GST_ELEMENT_ERROR (self, RESOURCE, SETTINGS,
+ (_("Converter on device %s has no supported input format"),
+ self->v4l2output->videodev), (NULL));
+ goto failure;
+
+
+no_output_format:
+ GST_ELEMENT_ERROR (self, RESOURCE, SETTINGS,
+ (_("Converter on device %s has no supported output format"),
+ self->v4l2output->videodev), (NULL));
+ goto failure;
+
+failure:
+ if (GST_V4L2_IS_OPEN (self->v4l2output))
+ gst_v4l2_object_close (self->v4l2output);
+
+ if (GST_V4L2_IS_OPEN (self->v4l2capture))
+ gst_v4l2_object_close (self->v4l2capture);
+
+ gst_caps_replace (&self->probed_srccaps, NULL);
+ gst_caps_replace (&self->probed_sinkcaps, NULL);
+
+ return FALSE;
+}
+
+static void
+gst_v4l2_transform_close (GstV4l2Transform * self)
+{
+ GST_DEBUG_OBJECT (self, "Closing");
+
+ gst_v4l2_object_close (self->v4l2output);
+ gst_v4l2_object_close (self->v4l2capture);
+
+ gst_caps_replace (&self->probed_srccaps, NULL);
+ gst_caps_replace (&self->probed_srccaps, NULL);
+}
+
+static gboolean
+gst_v4l2_transform_stop (GstBaseTransform * trans)
+{
+ GstV4l2Transform *self = GST_V4L2_TRANSFORM (trans);
+
+ GST_DEBUG_OBJECT (self, "Stop");
+
+ gst_v4l2_object_stop (self->v4l2output);
+ gst_v4l2_object_stop (self->v4l2capture);
+ gst_caps_replace (&self->incaps, NULL);
+ gst_caps_replace (&self->outcaps, NULL);
+
+ return TRUE;
+}
+
+static gboolean
+gst_v4l2_transform_set_caps (GstBaseTransform * trans, GstCaps * incaps,
+ GstCaps * outcaps)
+{
+ GstV4l2Transform *self = GST_V4L2_TRANSFORM (trans);
+
+ if (self->incaps && self->outcaps) {
+ if (gst_caps_is_equal (incaps, self->incaps) &&
+ gst_caps_is_equal (outcaps, self->outcaps)) {
+ GST_DEBUG_OBJECT (trans, "Caps did not changed");
+ return TRUE;
+ }
+ }
+
+ /* TODO Add renegotiation support */
+ g_return_val_if_fail (!GST_V4L2_IS_ACTIVE (self->v4l2output), FALSE);
+ g_return_val_if_fail (!GST_V4L2_IS_ACTIVE (self->v4l2capture), FALSE);
+
+ gst_caps_replace (&self->incaps, incaps);
+ gst_caps_replace (&self->outcaps, outcaps);
+
+ if (!gst_v4l2_object_set_format (self->v4l2output, incaps))
+ goto incaps_failed;
+
+ if (!gst_v4l2_object_set_format (self->v4l2capture, outcaps))
+ goto outcaps_failed;
+
+ /* FIXME implement fallback if crop not supported */
+ if (!gst_v4l2_object_set_crop (self->v4l2output))
+ goto failed;
+
+ if (!gst_v4l2_object_set_crop (self->v4l2capture))
+ goto failed;
+
+ return TRUE;
+
+incaps_failed:
+ {
+ GST_ERROR_OBJECT (self, "failed to set input caps: %" GST_PTR_FORMAT,
+ incaps);
+ goto failed;
+ }
+outcaps_failed:
+ {
+ gst_v4l2_object_stop (self->v4l2output);
+ GST_ERROR_OBJECT (self, "failed to set output caps: %" GST_PTR_FORMAT,
+ outcaps);
+ goto failed;
+ }
+failed:
+ return FALSE;
+}
+
+static gboolean
+gst_v4l2_transform_query (GstBaseTransform * trans, GstPadDirection direction,
+ GstQuery * query)
+{
+ GstV4l2Transform *self = GST_V4L2_TRANSFORM (trans);
+ gboolean ret = TRUE;
+
+ switch (GST_QUERY_TYPE (query)) {
+ case GST_QUERY_CAPS:{
+ GstCaps *filter, *caps = NULL, *result = NULL;
+ GstPad *pad, *otherpad;
+
+ gst_query_parse_caps (query, &filter);
+
+ if (direction == GST_PAD_SRC) {
+ pad = GST_BASE_TRANSFORM_SRC_PAD (trans);
+ otherpad = GST_BASE_TRANSFORM_SINK_PAD (trans);
+ if (self->probed_srccaps)
+ caps = gst_caps_ref (self->probed_srccaps);
+ } else {
+ pad = GST_BASE_TRANSFORM_SINK_PAD (trans);
+ otherpad = GST_BASE_TRANSFORM_SRC_PAD (trans);
+ if (self->probed_sinkcaps)
+ caps = gst_caps_ref (self->probed_sinkcaps);
+ }
+
+ if (!caps)
+ caps = gst_pad_get_pad_template_caps (pad);
+
+ if (filter) {
+ GstCaps *tmp = caps;
+ caps = gst_caps_intersect_full (filter, tmp, GST_CAPS_INTERSECT_FIRST);
+ gst_caps_unref (tmp);
+ }
+
+ result = gst_pad_peer_query_caps (otherpad, caps);
+ result = gst_caps_make_writable (result);
+ gst_caps_append (result, caps);
+
+ GST_DEBUG_OBJECT (self, "Returning %s caps %" GST_PTR_FORMAT,
+ GST_PAD_NAME (pad), result);
+
+ gst_query_set_caps_result (query, result);
+ gst_caps_unref (result);
+ break;
+ }
+
+ default:
+ ret = GST_BASE_TRANSFORM_CLASS (parent_class)->query (trans, direction,
+ query);
+ break;
+ }
+
+ return ret;
+}
+
+static gboolean
+gst_v4l2_transform_decide_allocation (GstBaseTransform * trans,
+ GstQuery * query)
+{
+ GstV4l2Transform *self = GST_V4L2_TRANSFORM (trans);
+ gboolean ret = FALSE;
+
+ GST_DEBUG_OBJECT (self, "called");
+
+ if (gst_v4l2_object_decide_allocation (self->v4l2capture, query)) {
+ GstBufferPool *pool = GST_BUFFER_POOL (self->v4l2capture->pool);
+
+ ret = GST_BASE_TRANSFORM_CLASS (parent_class)->decide_allocation (trans,
+ query);
+
+ if (!gst_buffer_pool_set_active (pool, TRUE))
+ goto activate_failed;
+ }
+
+ return ret;
+
+activate_failed:
+ GST_ELEMENT_ERROR (self, RESOURCE, SETTINGS,
+ ("failed to activate bufferpool"), ("failed to activate bufferpool"));
+ return TRUE;
+}
+
+static gboolean
+gst_v4l2_transform_propose_allocation (GstBaseTransform * trans,
+ GstQuery * decide_query, GstQuery * query)
+{
+ GstV4l2Transform *self = GST_V4L2_TRANSFORM (trans);
+ gboolean ret = FALSE;
+
+ GST_DEBUG_OBJECT (self, "called");
+
+ if (decide_query == NULL)
+ ret = TRUE;
+ else
+ ret = gst_v4l2_object_propose_allocation (self->v4l2output, query);
+
+ if (ret)
+ ret = GST_BASE_TRANSFORM_CLASS (parent_class)->propose_allocation (trans,
+ decide_query, query);
+
+ return ret;
+}
+
+/* copies the given caps */
+static GstCaps *
+gst_v4l2_transform_caps_remove_format_info (GstCaps * caps)
+{
+ GstStructure *st;
+ GstCapsFeatures *f;
+ gint i, n;
+ GstCaps *res;
+
+ res = gst_caps_new_empty ();
+
+ n = gst_caps_get_size (caps);
+ for (i = 0; i < n; i++) {
+ st = gst_caps_get_structure (caps, i);
+ f = gst_caps_get_features (caps, i);
+
+ /* If this is already expressed by the existing caps
+ * skip this structure */
+ if (i > 0 && gst_caps_is_subset_structure_full (res, st, f))
+ continue;
+
+ st = gst_structure_copy (st);
+ /* Only remove format info for the cases when we can actually convert */
+ if (!gst_caps_features_is_any (f)
+ && gst_caps_features_is_equal (f,
+ GST_CAPS_FEATURES_MEMORY_SYSTEM_MEMORY))
+ gst_structure_remove_fields (st, "format", "colorimetry", "chroma-site",
+ NULL);
+
+ gst_caps_append_structure_full (res, st, gst_caps_features_copy (f));
+ }
+
+ return res;
+}
+
+/* The caps can be transformed into any other caps with format info removed.
+ * However, we should prefer passthrough, so if passthrough is possible,
+ * put it first in the list. */
+static GstCaps *
+gst_v4l2_transform_transform_caps (GstBaseTransform * btrans,
+ GstPadDirection direction, GstCaps * caps, GstCaps * filter)
+{
+ GstCaps *tmp, *tmp2;
+ GstCaps *result;
+
+ /* Get all possible caps that we can transform to */
+ tmp = gst_v4l2_transform_caps_remove_format_info (caps);
+
+ if (filter) {
+ tmp2 = gst_caps_intersect_full (filter, tmp, GST_CAPS_INTERSECT_FIRST);
+ gst_caps_unref (tmp);
+ tmp = tmp2;
+ }
+
+ result = tmp;
+
+ GST_DEBUG_OBJECT (btrans, "transformed %" GST_PTR_FORMAT " into %"
+ GST_PTR_FORMAT, caps, result);
+
+ return result;
+}
+
+static GstCaps *
+gst_v4l2_transform_fixate_caps (GstBaseTransform * trans,
+ GstPadDirection direction, GstCaps * caps, GstCaps * othercaps)
+{
+ GstCaps *result;
+
+ GST_DEBUG_OBJECT (trans, "trying to fixate othercaps %" GST_PTR_FORMAT
+ " based on caps %" GST_PTR_FORMAT, othercaps, caps);
+
+ result = gst_caps_intersect (othercaps, caps);
+ if (gst_caps_is_empty (result)) {
+ gst_caps_unref (result);
+ result = othercaps;
+ } else {
+ gst_caps_unref (othercaps);
+ }
+
+ GST_DEBUG_OBJECT (trans, "now fixating %" GST_PTR_FORMAT, result);
+
+ result = gst_caps_fixate (result);
+
+ return result;
+}
+
+static GstFlowReturn
+gst_v4l2_transform_prepare_output_buffer (GstBaseTransform * trans,
+ GstBuffer * inbuf, GstBuffer ** outbuf)
+{
+ GstV4l2Transform *self = GST_V4L2_TRANSFORM (trans);
+ GstBufferPool *pool = GST_BUFFER_POOL (self->v4l2output->pool);
+ GstFlowReturn ret = GST_FLOW_OK;
+ GstBaseTransformClass *bclass = GST_BASE_TRANSFORM_CLASS (parent_class);
+
+ if (gst_base_transform_is_passthrough (trans)) {
+ GST_DEBUG_OBJECT (self, "Passthrough, no need to do anything");
+ *outbuf = inbuf;
+ goto beach;
+ }
+
+ /* Ensure input internal pool is active */
+ if (!gst_buffer_pool_is_active (pool)) {
+ GstStructure *config = gst_buffer_pool_get_config (pool);
+ gst_buffer_pool_config_set_params (config, self->incaps,
+ self->v4l2output->info.size, 2, 2);
+
+ /* There is no reason to refuse this config */
+ if (!gst_buffer_pool_set_config (pool, config))
+ goto activate_failed;
+
+ if (!gst_buffer_pool_set_active (pool, TRUE))
+ goto activate_failed;
+ }
+
+ GST_DEBUG_OBJECT (self, "Queue input buffer");
+ ret = gst_v4l2_buffer_pool_process (GST_V4L2_BUFFER_POOL (pool), &inbuf);
+ if (G_UNLIKELY (ret != GST_FLOW_OK))
+ goto beach;
+
+ pool = gst_base_transform_get_buffer_pool (trans);
+
+ if (!gst_buffer_pool_set_active (pool, TRUE))
+ goto activate_failed;
+
+ GST_DEBUG_OBJECT (self, "Dequeue output buffer");
+ ret = gst_buffer_pool_acquire_buffer (pool, outbuf, NULL);
+ g_object_unref (pool);
+
+ if (ret != GST_FLOW_OK)
+ goto alloc_failed;
+
+ pool = self->v4l2capture->pool;
+ ret = gst_v4l2_buffer_pool_process (GST_V4L2_BUFFER_POOL (pool), outbuf);
+
+ if (ret != GST_FLOW_OK) {
+ gst_buffer_unref (*outbuf);
+ *outbuf = NULL;
+ }
+
+ if (bclass->copy_metadata)
+ if (!bclass->copy_metadata (trans, inbuf, *outbuf)) {
+ /* something failed, post a warning */
+ GST_ELEMENT_WARNING (self, STREAM, NOT_IMPLEMENTED,
+ ("could not copy metadata"), (NULL));
+ }
+
+beach:
+ return ret;
+
+activate_failed:
+ GST_ELEMENT_ERROR (self, RESOURCE, SETTINGS,
+ ("failed to activate bufferpool"), ("failed to activate bufferpool"));
+ g_object_unref (pool);
+ return GST_FLOW_ERROR;
+
+alloc_failed:
+ GST_DEBUG_OBJECT (self, "could not allocate buffer from pool");
+ return ret;
+}
+
+static GstFlowReturn
+gst_v4l2_transform_transform (GstBaseTransform * trans, GstBuffer * inbuf,
+ GstBuffer * outbuf)
+{
+ /* Nothing to do */
+ return GST_FLOW_OK;
+}
+
+static gboolean
+gst_v4l2_transform_sink_event (GstBaseTransform * trans, GstEvent * event)
+{
+ GstV4l2Transform *self = GST_V4L2_TRANSFORM (trans);
+ gboolean ret;
+
+ /* Nothing to flush in passthrough */
+ if (gst_base_transform_is_passthrough (trans))
+ return GST_BASE_TRANSFORM_CLASS (parent_class)->sink_event (trans, event);
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_FLUSH_START:
+ GST_DEBUG_OBJECT (self, "flush start");
+ gst_v4l2_object_unlock (self->v4l2output);
+ gst_v4l2_object_unlock (self->v4l2capture);
+ break;
+ case GST_EVENT_FLUSH_STOP:
+ GST_DEBUG_OBJECT (self, "flush stop");
+
+ if (self->v4l2output->pool) {
+ gst_v4l2_buffer_pool_stop_streaming (GST_V4L2_BUFFER_POOL
+ (self->v4l2output->pool));
+ gst_v4l2_buffer_pool_start_streaming (GST_V4L2_BUFFER_POOL
+ (self->v4l2capture->pool));
+ gst_v4l2_object_unlock_stop (self->v4l2output);
+ }
+ if (self->v4l2capture->pool)
+ gst_v4l2_buffer_pool_stop_streaming (GST_V4L2_BUFFER_POOL
+ (self->v4l2capture->pool));
+ default:
+ break;
+ }
+
+ ret = GST_BASE_TRANSFORM_CLASS (parent_class)->sink_event (trans, event);
+
+ switch (GST_EVENT_TYPE (event)) {
+ case GST_EVENT_FLUSH_STOP:
+ /* Buffer should be back now */
+ if (self->v4l2capture->pool) {
+ gst_v4l2_buffer_pool_start_streaming (GST_V4L2_BUFFER_POOL
+ (self->v4l2capture->pool));
+ gst_v4l2_object_unlock_stop (self->v4l2capture);
+ }
+ GST_DEBUG_OBJECT (self, "flush stop done");
+ break;
+ default:
+ break;
+ }
+
+ return ret;
+}
+
+static GstStateChangeReturn
+gst_v4l2_transform_change_state (GstElement * element,
+ GstStateChange transition)
+{
+ GstV4l2Transform *self = GST_V4L2_TRANSFORM (element);
+ GstStateChangeReturn ret;
+
+ switch (transition) {
+ case GST_STATE_CHANGE_NULL_TO_READY:
+ if (!gst_v4l2_transform_open (self))
+ return GST_STATE_CHANGE_FAILURE;
+ break;
+ case GST_STATE_CHANGE_PAUSED_TO_READY:
+ gst_v4l2_object_unlock (self->v4l2output);
+ gst_v4l2_object_unlock (self->v4l2capture);
+ break;
+ default:
+ break;
+ }
+
+ ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
+
+ switch (transition) {
+ case GST_STATE_CHANGE_READY_TO_NULL:
+ gst_v4l2_transform_close (self);
+ break;
+ default:
+ break;
+ }
+
+ return ret;
+}
+
+static void
+gst_v4l2_transform_dispose (GObject * object)
+{
+ GstV4l2Transform *self = GST_V4L2_TRANSFORM (object);
+
+ gst_caps_replace (&self->probed_sinkcaps, NULL);
+ gst_caps_replace (&self->probed_srccaps, NULL);
+
+ G_OBJECT_CLASS (parent_class)->dispose (object);
+}
+
+static void
+gst_v4l2_transform_finalize (GObject * object)
+{
+ GstV4l2Transform *self = GST_V4L2_TRANSFORM (object);
+
+ gst_v4l2_object_destroy (self->v4l2capture);
+ gst_v4l2_object_destroy (self->v4l2output);
+
+ G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+static void
+gst_v4l2_transform_init (GstV4l2Transform * self)
+{
+ /* V4L2 object are created in subinstance_init */
+ /* enable QoS */
+ gst_base_transform_set_qos_enabled (GST_BASE_TRANSFORM (self), TRUE);
+}
+
+static void
+gst_v4l2_transform_subinstance_init (GTypeInstance * instance, gpointer g_class)
+{
+ GstV4l2TransformClass *klass = GST_V4L2_TRANSFORM_CLASS (g_class);
+ GstV4l2Transform *self = GST_V4L2_TRANSFORM (instance);
+
+ self->v4l2output = gst_v4l2_object_new (GST_ELEMENT (self),
+ V4L2_BUF_TYPE_VIDEO_OUTPUT, klass->default_device,
+ gst_v4l2_get_output, gst_v4l2_set_output, NULL);
+ self->v4l2output->no_initial_format = TRUE;
+ self->v4l2output->keep_aspect = FALSE;
+
+ self->v4l2capture = gst_v4l2_object_new (GST_ELEMENT (self),
+ V4L2_BUF_TYPE_VIDEO_CAPTURE, klass->default_device,
+ gst_v4l2_get_input, gst_v4l2_set_input, NULL);
+ self->v4l2capture->no_initial_format = TRUE;
+ self->v4l2output->keep_aspect = FALSE;
+}
+
+static void
+gst_v4l2_transform_class_init (GstV4l2TransformClass * klass)
+{
+ GstElementClass *element_class;
+ GObjectClass *gobject_class;
+ GstBaseTransformClass *base_transform_class;
+
+ element_class = (GstElementClass *) klass;
+ gobject_class = (GObjectClass *) klass;
+ base_transform_class = (GstBaseTransformClass *) klass;
+
+ GST_DEBUG_CATEGORY_INIT (gst_v4l2_transform_debug, "v4l2transform", 0,
+ "V4L2 Converter");
+
+ gst_element_class_set_static_metadata (element_class,
+ "V4L2 Video Converter",
+ "Filter/Converter/Video",
+ "Transform streams via V4L2 API",
+ "Nicolas Dufresne <nicolas.dufresne@collabora.com>");
+
+ gobject_class->dispose = GST_DEBUG_FUNCPTR (gst_v4l2_transform_dispose);
+ gobject_class->finalize = GST_DEBUG_FUNCPTR (gst_v4l2_transform_finalize);
+ gobject_class->set_property =
+ GST_DEBUG_FUNCPTR (gst_v4l2_transform_set_property);
+ gobject_class->get_property =
+ GST_DEBUG_FUNCPTR (gst_v4l2_transform_get_property);
+
+ base_transform_class->stop = GST_DEBUG_FUNCPTR (gst_v4l2_transform_stop);
+ base_transform_class->set_caps =
+ GST_DEBUG_FUNCPTR (gst_v4l2_transform_set_caps);
+ base_transform_class->query = GST_DEBUG_FUNCPTR (gst_v4l2_transform_query);
+ base_transform_class->sink_event =
+ GST_DEBUG_FUNCPTR (gst_v4l2_transform_sink_event);
+ base_transform_class->decide_allocation =
+ GST_DEBUG_FUNCPTR (gst_v4l2_transform_decide_allocation);
+ base_transform_class->propose_allocation =
+ GST_DEBUG_FUNCPTR (gst_v4l2_transform_propose_allocation);
+ base_transform_class->transform_caps =
+ GST_DEBUG_FUNCPTR (gst_v4l2_transform_transform_caps);
+ base_transform_class->fixate_caps =
+ GST_DEBUG_FUNCPTR (gst_v4l2_transform_fixate_caps);
+ base_transform_class->prepare_output_buffer =
+ GST_DEBUG_FUNCPTR (gst_v4l2_transform_prepare_output_buffer);
+ base_transform_class->transform =
+ GST_DEBUG_FUNCPTR (gst_v4l2_transform_transform);
+
+ base_transform_class->passthrough_on_same_caps = TRUE;
+
+ element_class->change_state =
+ GST_DEBUG_FUNCPTR (gst_v4l2_transform_change_state);
+
+ gst_v4l2_object_install_m2m_properties_helper (gobject_class);
+}
+
+static void
+gst_v4l2_transform_subclass_init (gpointer g_class, gpointer data)
+{
+ GstV4l2TransformClass *klass = GST_V4L2_TRANSFORM_CLASS (g_class);
+ GstElementClass *element_class = GST_ELEMENT_CLASS (g_class);
+ GstV4l2TransformCData *cdata = data;
+
+ klass->default_device = cdata->device;
+
+ /* Note: gst_pad_template_new() take the floating ref from the caps */
+ gst_element_class_add_pad_template (element_class,
+ gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS,
+ cdata->sink_caps));
+ gst_element_class_add_pad_template (element_class,
+ gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS,
+ cdata->src_caps));
+
+ g_free (cdata);
+}
+
+/* Probing functions */
+gboolean
+gst_v4l2_is_transform (GstCaps * sink_caps, GstCaps * src_caps)
+{
+ gboolean ret = FALSE;
+
+ if (gst_caps_is_subset (sink_caps, gst_v4l2_object_get_raw_caps ())
+ && gst_caps_is_subset (src_caps, gst_v4l2_object_get_raw_caps ()))
+ ret = TRUE;
+
+ return ret;
+}
+
+gboolean
+gst_v4l2_transform_register (GstPlugin * plugin, const gchar * basename,
+ const gchar * device_path, GstCaps * sink_caps, GstCaps * src_caps)
+{
+ GTypeQuery type_query;
+ GTypeInfo type_info = { 0, };
+ GType type, subtype;
+ gchar *type_name;
+ GstV4l2TransformCData *cdata;
+
+ cdata = g_new0 (GstV4l2TransformCData, 1);
+ cdata->device = g_strdup (device_path);
+ cdata->sink_caps = gst_caps_ref (sink_caps);
+ cdata->src_caps = gst_caps_ref (src_caps);
+
+ type = gst_v4l2_transform_get_type ();
+ g_type_query (type, &type_query);
+ memset (&type_info, 0, sizeof (type_info));
+ type_info.class_size = type_query.class_size;
+ type_info.instance_size = type_query.instance_size;
+ type_info.class_init = gst_v4l2_transform_subclass_init;
+ type_info.class_data = cdata;
+ type_info.instance_init = gst_v4l2_transform_subinstance_init;
+
+ type_name = g_strdup_printf ("v4l2%sconvert", basename);
+ subtype = g_type_register_static (type, type_name, &type_info, 0);
+
+ gst_element_register (plugin, type_name, GST_RANK_PRIMARY + 1, subtype);
+
+ g_free (type_name);
+
+ return TRUE;
+}
diff --git a/sys/v4l2/gstv4l2transform.h b/sys/v4l2/gstv4l2transform.h
new file mode 100644
index 00000000..13d56c3d
--- /dev/null
+++ b/sys/v4l2/gstv4l2transform.h
@@ -0,0 +1,84 @@
+/*
+ * Copyright (C) 2014 Collabora Ltd.
+ * Author: Nicolas Dufresne <nicolas.dufresne@collabora.co.uk>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef __GST_V4L2_TRANSFORM_H__
+#define __GST_V4L2_TRANSFORM_H__
+
+#include <gst/gst.h>
+#include <gst/base/gstbasetransform.h>
+
+#include <gstv4l2object.h>
+#include <gstv4l2bufferpool.h>
+
+GST_DEBUG_CATEGORY_EXTERN (v4l2transform_debug);
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_V4L2_TRANSFORM \
+ (gst_v4l2_transform_get_type())
+#define GST_V4L2_TRANSFORM(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_V4L2_TRANSFORM,GstV4l2Transform))
+#define GST_V4L2_TRANSFORM_CLASS(klass) \
+ (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_V4L2_TRANSFORM,GstV4l2TransformClass))
+#define GST_IS_V4L2_TRANSFORM(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_V4L2_TRANSFORM))
+#define GST_IS_V4L2_TRANSFORM_CLASS(obj) \
+ (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_V4L2_TRANSFORM))
+#define GST_V4L2_TRANSFORM_GET_CLASS(inst) \
+ (G_TYPE_INSTANCE_GET_CLASS ((inst),GST_TYPE_V4L2_TRANSFORM,GstV4l2TransformClass))
+
+typedef struct _GstV4l2Transform GstV4l2Transform;
+typedef struct _GstV4l2TransformClass GstV4l2TransformClass;
+
+struct _GstV4l2Transform
+{
+ GstBaseTransform parent;
+
+ /* < private > */
+ GstV4l2Object * v4l2output;
+ GstV4l2Object * v4l2capture;
+
+ /* pads */
+ GstCaps *probed_srccaps;
+ GstCaps *probed_sinkcaps;
+
+ /* Selected caps */
+ GstCaps *incaps;
+ GstCaps *outcaps;
+};
+
+struct _GstV4l2TransformClass
+{
+ GstBaseTransformClass parent_class;
+ gchar *default_device;
+};
+
+GType gst_v4l2_transform_get_type (void);
+
+gboolean gst_v4l2_is_transform (GstCaps * sink_caps, GstCaps * src_caps);
+gboolean gst_v4l2_transform_register (GstPlugin * plugin,
+ const gchar *basename,
+ const gchar *device_path,
+ GstCaps * sink_caps, GstCaps * src_caps);
+
+G_END_DECLS
+
+#endif /* __GST_V4L2_TRANSFORM_H__ */
diff --git a/sys/v4l2/gstv4l2videodec.c b/sys/v4l2/gstv4l2videodec.c
index 50a51104..1b4a051c 100644
--- a/sys/v4l2/gstv4l2videodec.c
+++ b/sys/v4l2/gstv4l2videodec.c
@@ -35,11 +35,6 @@
#include <string.h>
#include <gst/gst-i18n-plugin.h>
-#define DEFAULT_PROP_DEVICE "/dev/video0"
-
-#define V4L2_VIDEO_DEC_QUARK \
- g_quark_from_static_string("gst-v4l2-video-dec-info")
-
GST_DEBUG_CATEGORY_STATIC (gst_v4l2_video_dec_debug);
#define GST_CAT_DEFAULT gst_v4l2_video_dec_debug
@@ -50,48 +45,17 @@ typedef struct
gchar *device;
GstCaps *sink_caps;
GstCaps *src_caps;
-} Gstv4l2VideoDecQData;
+} GstV4l2VideoDecCData;
enum
{
PROP_0,
- V4L2_STD_OBJECT_PROPS,
- PROP_CAPTURE_IO_MODE,
+ V4L2_STD_OBJECT_PROPS
};
-static void gst_v4l2_video_dec_class_init (GstV4l2VideoDecClass * klass);
-static void gst_v4l2_video_dec_init (GstV4l2VideoDec * self, gpointer g_class);
-static void gst_v4l2_video_dec_base_init (gpointer g_class);
-
-static GstVideoDecoderClass *parent_class = NULL;
-
-GType
-gst_v4l2_video_dec_get_type (void)
-{
- static volatile gsize type = 0;
-
- if (g_once_init_enter (&type)) {
- GType _type;
- static const GTypeInfo info = {
- sizeof (GstV4l2VideoDecClass),
- gst_v4l2_video_dec_base_init,
- NULL,
- (GClassInitFunc) gst_v4l2_video_dec_class_init,
- NULL,
- NULL,
- sizeof (GstV4l2VideoDec),
- 0,
- (GInstanceInitFunc) gst_v4l2_video_dec_init,
- NULL
- };
-
- _type = g_type_register_static (GST_TYPE_VIDEO_DECODER, "GstV4l2VideoDec",
- &info, 0);
-
- g_once_init_leave (&type, _type);
- }
- return type;
-}
+#define gst_v4l2_video_dec_parent_class parent_class
+G_DEFINE_ABSTRACT_TYPE (GstV4l2VideoDec, gst_v4l2_video_dec,
+ GST_TYPE_VIDEO_DECODER);
static void
gst_v4l2_video_dec_set_property (GObject * object,
@@ -100,9 +64,7 @@ gst_v4l2_video_dec_set_property (GObject * object,
GstV4l2VideoDec *self = GST_V4L2_VIDEO_DEC (object);
switch (prop_id) {
- /* Split IO mode so output is configure through 'io-mode' and capture
- * through 'capture-io-mode' */
- case PROP_IO_MODE:
+ case PROP_OUTPUT_IO_MODE:
gst_v4l2_object_set_property_helper (self->v4l2output, prop_id, value,
pspec);
break;
@@ -111,13 +73,6 @@ gst_v4l2_video_dec_set_property (GObject * object,
pspec);
break;
- case PROP_DEVICE:
- gst_v4l2_object_set_property_helper (self->v4l2output, prop_id, value,
- pspec);
- gst_v4l2_object_set_property_helper (self->v4l2capture, prop_id, value,
- pspec);
- break;
-
/* By default, only set on output */
default:
if (!gst_v4l2_object_set_property_helper (self->v4l2output,
@@ -243,6 +198,16 @@ gst_v4l2_video_dec_stop (GstVideoDecoder * decoder)
GST_DEBUG_OBJECT (self, "Stopping");
+ gst_v4l2_object_unlock (self->v4l2output);
+ gst_v4l2_object_unlock (self->v4l2capture);
+
+ /* Wait for capture thread to stop */
+ gst_pad_stop_task (decoder->srcpad);
+
+ GST_VIDEO_DECODER_STREAM_LOCK (decoder);
+ self->output_flow = GST_FLOW_OK;
+ GST_VIDEO_DECODER_STREAM_UNLOCK (decoder);
+
/* Should have been flushed already */
g_assert (g_atomic_int_get (&self->active) == FALSE);
g_assert (g_atomic_int_get (&self->processing) == FALSE);
@@ -275,6 +240,7 @@ gst_v4l2_video_dec_set_format (GstVideoDecoder * decoder,
goto done;
}
gst_video_codec_state_unref (self->input_state);
+ self->input_state = NULL;
/* FIXME we probably need to do more work if pools are active */
}
@@ -296,14 +262,20 @@ gst_v4l2_video_dec_flush (GstVideoDecoder * decoder)
GST_DEBUG_OBJECT (self, "Flushing");
/* Wait for capture thread to stop */
+ GST_VIDEO_DECODER_STREAM_UNLOCK (decoder);
+ gst_v4l2_object_unlock (self->v4l2capture);
gst_pad_stop_task (decoder->srcpad);
+ GST_VIDEO_DECODER_STREAM_LOCK (decoder);
+
self->output_flow = GST_FLOW_OK;
- gst_v4l2_buffer_pool_flush (GST_V4L2_BUFFER_POOL (self->v4l2output->pool));
- gst_v4l2_buffer_pool_flush (GST_V4L2_BUFFER_POOL (self->v4l2capture->pool));
+ if (self->v4l2output->pool)
+ gst_v4l2_buffer_pool_stop_streaming (GST_V4L2_BUFFER_POOL
+ (self->v4l2output->pool));
- /* Output will remain flushing until new frame comes in */
- gst_v4l2_object_unlock_stop (self->v4l2capture);
+ if (self->v4l2capture->pool)
+ gst_v4l2_buffer_pool_stop_streaming (GST_V4L2_BUFFER_POOL
+ (self->v4l2capture->pool));
return TRUE;
}
@@ -321,7 +293,7 @@ gst_v4l2_video_dec_finish (GstVideoDecoder * decoder)
GstFlowReturn ret = GST_FLOW_OK;
GstBuffer *buffer;
- if (!self->input_state)
+ if (!self->processing)
goto done;
GST_DEBUG_OBJECT (self, "Finishing decoding");
@@ -333,12 +305,17 @@ gst_v4l2_video_dec_finish (GstVideoDecoder * decoder)
buffer = gst_buffer_new ();
ret =
gst_v4l2_buffer_pool_process (GST_V4L2_BUFFER_POOL (self->
- v4l2output->pool), buffer);
+ v4l2output->pool), &buffer);
gst_buffer_unref (buffer);
}
GST_VIDEO_DECODER_STREAM_LOCK (decoder);
- g_assert (g_atomic_int_get (&self->processing) == FALSE);
+ /* Ensure the processing thread has stopped */
+ if (g_atomic_int_get (&self->processing)) {
+ gst_v4l2_object_unlock (self->v4l2capture);
+ gst_pad_stop_task (decoder->srcpad);
+ g_assert (g_atomic_int_get (&self->processing) == FALSE);
+ }
if (ret == GST_FLOW_FLUSHING)
ret = self->output_flow;
@@ -395,20 +372,23 @@ gst_v4l2_video_dec_loop (GstVideoDecoder * decoder)
* comes in and holding this lock would prevent that.
*/
pool = gst_video_decoder_get_buffer_pool (decoder);
+
+ /* Pool may be NULL if we started going to READY state */
+ if (pool == NULL) {
+ ret = GST_FLOW_FLUSHING;
+ goto beach;
+ }
+
ret = gst_buffer_pool_acquire_buffer (pool, &buffer, NULL);
g_object_unref (pool);
if (ret != GST_FLOW_OK)
goto beach;
- /* Check if buffer isn't the last one */
- if (gst_buffer_get_size (buffer) == 0)
- goto beach;
-
GST_LOG_OBJECT (decoder, "Process output buffer");
ret =
gst_v4l2_buffer_pool_process (GST_V4L2_BUFFER_POOL (self->
- v4l2capture->pool), buffer);
+ v4l2capture->pool), &buffer);
if (ret != GST_FLOW_OK)
goto beach;
@@ -430,7 +410,8 @@ gst_v4l2_video_dec_loop (GstVideoDecoder * decoder)
return;
beach:
- GST_DEBUG_OBJECT (decoder, "Leaving output thread");
+ GST_DEBUG_OBJECT (decoder, "Leaving output thread: %s",
+ gst_flow_get_name (ret));
gst_buffer_replace (&buffer, NULL);
self->output_flow = ret;
@@ -452,11 +433,14 @@ gst_v4l2_video_dec_handle_frame (GstVideoDecoder * decoder,
goto flushing;
if (G_UNLIKELY (!GST_V4L2_IS_ACTIVE (self->v4l2output))) {
+ if (!self->input_state)
+ goto not_negotiated;
if (!gst_v4l2_object_set_format (self->v4l2output, self->input_state->caps))
goto not_negotiated;
}
if (G_UNLIKELY (!GST_V4L2_IS_ACTIVE (self->v4l2capture))) {
+ GstBufferPool *pool = GST_BUFFER_POOL (self->v4l2output->pool);
GstVideoInfo info;
GstVideoCodecState *output_state;
GstBuffer *codec_data;
@@ -476,17 +460,31 @@ gst_v4l2_video_dec_handle_frame (GstVideoDecoder * decoder,
frame->input_buffer = NULL;
}
+ /* Ensure input internal pool is active */
+ if (!gst_buffer_pool_is_active (pool)) {
+ GstStructure *config = gst_buffer_pool_get_config (pool);
+ gst_buffer_pool_config_set_params (config, self->input_state->caps,
+ self->v4l2output->info.size, 2, 2);
+
+ /* There is no reason to refuse this config */
+ if (!gst_buffer_pool_set_config (pool, config))
+ goto activate_failed;
+
+ if (!gst_buffer_pool_set_active (pool, TRUE))
+ goto activate_failed;
+ }
+
GST_VIDEO_DECODER_STREAM_UNLOCK (decoder);
gst_v4l2_object_unlock_stop (self->v4l2output);
ret =
gst_v4l2_buffer_pool_process (GST_V4L2_BUFFER_POOL (self->
- v4l2output->pool), codec_data);
+ v4l2output->pool), &codec_data);
gst_v4l2_object_unlock (self->v4l2output);
GST_VIDEO_DECODER_STREAM_LOCK (decoder);
gst_buffer_unref (codec_data);
- if (!gst_v4l2_object_setup_format (self->v4l2capture, &info, &self->align))
+ if (!gst_v4l2_object_acquire_format (self->v4l2capture, &info))
goto not_negotiated;
output_state = gst_video_decoder_set_output_state (decoder,
@@ -502,6 +500,11 @@ gst_v4l2_video_dec_handle_frame (GstVideoDecoder * decoder,
else
goto not_negotiated;
}
+
+ /* Ensure our internal pool is activated */
+ if (!gst_buffer_pool_set_active (GST_BUFFER_POOL (self->v4l2capture->pool),
+ TRUE))
+ goto activate_failed;
}
if (g_atomic_int_get (&self->processing) == FALSE) {
@@ -515,7 +518,12 @@ gst_v4l2_video_dec_handle_frame (GstVideoDecoder * decoder,
GST_DEBUG_OBJECT (self, "Starting decoding thread");
/* Enable processing input */
+ if (!gst_v4l2_buffer_pool_start_streaming (GST_V4L2_BUFFER_POOL
+ (self->v4l2capture->pool)))
+ goto start_streaming_failed;
+
gst_v4l2_object_unlock_stop (self->v4l2output);
+ gst_v4l2_object_unlock_stop (self->v4l2capture);
/* Start the processing task, when it quits, the task will disable input
* processing to unlock input if draining, or prevent potential block */
@@ -528,7 +536,7 @@ gst_v4l2_video_dec_handle_frame (GstVideoDecoder * decoder,
GST_VIDEO_DECODER_STREAM_UNLOCK (decoder);
ret =
gst_v4l2_buffer_pool_process (GST_V4L2_BUFFER_POOL (self->v4l2output->
- pool), frame->input_buffer);
+ pool), &frame->input_buffer);
GST_VIDEO_DECODER_STREAM_LOCK (decoder);
if (ret == GST_FLOW_FLUSHING) {
@@ -550,6 +558,20 @@ not_negotiated:
ret = GST_FLOW_NOT_NEGOTIATED;
goto drop;
}
+start_streaming_failed:
+ {
+ GST_ELEMENT_ERROR (self, RESOURCE, SETTINGS,
+ (_("Failed to re-enabled decoder.")),
+ ("Could not re-enqueue and start streaming on decide."));
+ return GST_FLOW_ERROR;
+ }
+activate_failed:
+ {
+ GST_ELEMENT_ERROR (self, RESOURCE, SETTINGS,
+ (_("Failed to allocate required memory.")),
+ ("Buffer pool activation failed"));
+ return GST_FLOW_ERROR;
+ }
flushing:
{
ret = GST_FLOW_FLUSHING;
@@ -590,12 +612,14 @@ gst_v4l2_video_dec_src_query (GstVideoDecoder * decoder, GstQuery * query)
switch (GST_QUERY_TYPE (query)) {
case GST_QUERY_CAPS:{
GstCaps *filter, *result = NULL;
+ GstPad *pad = GST_VIDEO_DECODER_SRC_PAD (decoder);
+
gst_query_parse_caps (query, &filter);
if (self->probed_srccaps)
result = gst_caps_ref (self->probed_srccaps);
else
- result = gst_v4l2_object_get_raw_caps ();
+ result = gst_pad_get_pad_template_caps (pad);
if (filter) {
GstCaps *tmp = result;
@@ -628,12 +652,13 @@ gst_v4l2_video_dec_sink_query (GstVideoDecoder * decoder, GstQuery * query)
switch (GST_QUERY_TYPE (query)) {
case GST_QUERY_CAPS:{
GstCaps *filter, *result = NULL;
+ GstPad *pad = GST_VIDEO_DECODER_SINK_PAD (decoder);
gst_query_parse_caps (query, &filter);
if (self->probed_sinkcaps)
result = gst_caps_ref (self->probed_sinkcaps);
else
- result = gst_v4l2_object_get_codec_caps ();
+ result = gst_pad_get_pad_template_caps (pad);
if (filter) {
GstCaps *tmp = result;
@@ -711,52 +736,31 @@ gst_v4l2_video_dec_finalize (GObject * object)
}
static void
-gst_v4l2_video_dec_base_init (gpointer g_class)
+gst_v4l2_video_dec_init (GstV4l2VideoDec * self)
{
- GstElementClass *element_class = GST_ELEMENT_CLASS (g_class);
- Gstv4l2VideoDecQData *qdata;
- GstPadTemplate *templ;
-
- qdata = g_type_get_qdata (G_TYPE_FROM_CLASS (g_class), V4L2_VIDEO_DEC_QUARK);
- if (!qdata)
- return;
-
- templ =
- gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS,
- qdata->sink_caps);
- gst_element_class_add_pad_template (element_class, templ);
-
- templ =
- gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS,
- qdata->src_caps);
- gst_element_class_add_pad_template (element_class, templ);
+ /* V4L2 object are created in subinstance_init */
}
static void
-gst_v4l2_video_dec_init (GstV4l2VideoDec * self, gpointer g_class)
+gst_v4l2_video_dec_subinstance_init (GTypeInstance * instance, gpointer g_class)
{
- GstVideoDecoder *decoder = (GstVideoDecoder *) self;
- Gstv4l2VideoDecQData *qdata;
-
- qdata = g_type_get_qdata (G_TYPE_FROM_CLASS (g_class), V4L2_VIDEO_DEC_QUARK);
- if (!qdata)
- return;
+ GstV4l2VideoDecClass *klass = GST_V4L2_VIDEO_DEC_CLASS (g_class);
+ GstV4l2VideoDec *self = GST_V4L2_VIDEO_DEC (instance);
+ GstVideoDecoder *decoder = GST_VIDEO_DECODER (instance);
gst_video_decoder_set_packetized (decoder, TRUE);
self->v4l2output = gst_v4l2_object_new (GST_ELEMENT (self),
- V4L2_BUF_TYPE_VIDEO_OUTPUT, qdata->device,
+ V4L2_BUF_TYPE_VIDEO_OUTPUT, klass->default_device,
gst_v4l2_get_output, gst_v4l2_set_output, NULL);
self->v4l2output->no_initial_format = TRUE;
self->v4l2output->keep_aspect = FALSE;
self->v4l2capture = gst_v4l2_object_new (GST_ELEMENT (self),
- V4L2_BUF_TYPE_VIDEO_CAPTURE, qdata->device,
+ V4L2_BUF_TYPE_VIDEO_CAPTURE, klass->default_device,
gst_v4l2_get_input, gst_v4l2_set_input, NULL);
self->v4l2capture->no_initial_format = TRUE;
self->v4l2output->keep_aspect = FALSE;
-
- g_object_set (self, "device", qdata->device, NULL);
}
static void
@@ -772,6 +776,9 @@ gst_v4l2_video_dec_class_init (GstV4l2VideoDecClass * klass)
gobject_class = (GObjectClass *) klass;
video_decoder_class = (GstVideoDecoderClass *) klass;
+ GST_DEBUG_CATEGORY_INIT (gst_v4l2_video_dec_debug, "v4l2videodec", 0,
+ "V4L2 Video Decoder");
+
gst_element_class_set_static_metadata (element_class,
"V4L2 Video Decoder",
"Codec/Decoder/Video",
@@ -810,136 +817,72 @@ gst_v4l2_video_dec_class_init (GstV4l2VideoDecClass * klass)
element_class->change_state =
GST_DEBUG_FUNCPTR (gst_v4l2_video_dec_change_state);
- gst_v4l2_object_install_properties_helper (gobject_class,
- DEFAULT_PROP_DEVICE);
-
- /**
- * GstV4l2VideoDec:capture-io-mode
- *
- * Capture IO Mode
- */
- g_object_class_install_property (gobject_class, PROP_IO_MODE,
- g_param_spec_enum ("capture-io-mode", "Capture IO mode",
- "Capture I/O mode",
- GST_TYPE_V4L2_IO_MODE, GST_V4L2_IO_AUTO,
- G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ gst_v4l2_object_install_m2m_properties_helper (gobject_class);
}
-/* Probing functions */
-static GstCaps *
-gst_v4l2_video_dec_probe_caps (gchar * device, gint video_fd,
- enum v4l2_buf_type type, GstCaps * filter)
+static void
+gst_v4l2_video_dec_subclass_init (gpointer g_class, gpointer data)
{
- gint n;
- struct v4l2_fmtdesc format;
- GstCaps *ret, *caps;
-
- GST_DEBUG ("Getting %s format enumerations", device);
- caps = gst_caps_new_empty ();
-
- for (n = 0;; n++) {
- GstStructure *template;
-
- memset (&format, 0, sizeof (format));
-
- format.index = n;
- format.type = type;
-
- if (v4l2_ioctl (video_fd, VIDIOC_ENUM_FMT, &format) < 0)
- break; /* end of enumeration */
+ GstV4l2VideoDecClass *klass = GST_V4L2_VIDEO_DEC_CLASS (g_class);
+ GstElementClass *element_class = GST_ELEMENT_CLASS (g_class);
+ GstV4l2VideoDecCData *cdata = data;
- GST_LOG ("index: %u", format.index);
- GST_LOG ("type: %d", format.type);
- GST_LOG ("flags: %08x", format.flags);
- GST_LOG ("description: '%s'", format.description);
- GST_LOG ("pixelformat: %" GST_FOURCC_FORMAT,
- GST_FOURCC_ARGS (format.pixelformat));
+ klass->default_device = cdata->device;
- template = gst_v4l2_object_v4l2fourcc_to_structure (format.pixelformat);
+ /* Note: gst_pad_template_new() take the floating ref from the caps */
+ gst_element_class_add_pad_template (element_class,
+ gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS,
+ cdata->sink_caps));
+ gst_element_class_add_pad_template (element_class,
+ gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS,
+ cdata->src_caps));
- if (template)
- gst_caps_append_structure (caps, template);
- }
+ g_free (cdata);
+}
- caps = gst_caps_simplify (caps);
+/* Probing functions */
+gboolean
+gst_v4l2_is_video_dec (GstCaps * sink_caps, GstCaps * src_caps)
+{
+ gboolean ret = FALSE;
- ret = gst_caps_intersect (filter, caps);
- gst_caps_unref (filter);
- gst_caps_unref (caps);
+ if (gst_caps_is_subset (sink_caps, gst_v4l2_object_get_codec_caps ())
+ && gst_caps_is_subset (src_caps, gst_v4l2_object_get_raw_caps ()))
+ ret = TRUE;
return ret;
}
gboolean
-gst_v4l2_video_dec_register (GstPlugin * plugin)
+gst_v4l2_video_dec_register (GstPlugin * plugin, const gchar * basename,
+ const gchar * device_path, GstCaps * sink_caps, GstCaps * src_caps)
{
- gint i = -1;
- gchar *device = NULL;
-
- GST_DEBUG_CATEGORY_INIT (gst_v4l2_video_dec_debug, "v4l2videodec", 0,
- "V4L2 Video Decoder");
-
- while (TRUE) {
- GstCaps *src_caps, *sink_caps;
- gint video_fd;
-
- g_free (device);
- device = g_strdup_printf ("/dev/video%d", ++i);
-
- if (!g_file_test (device, G_FILE_TEST_EXISTS))
- break;
-
- video_fd = open (device, O_RDWR);
- if (video_fd == -1) {
- GST_WARNING ("Failed to open %s", device);
- continue;
- }
-
- /* get sink supported format (no MPLANE for codec) */
- sink_caps = gst_v4l2_video_dec_probe_caps (device, video_fd,
- V4L2_BUF_TYPE_VIDEO_OUTPUT, gst_v4l2_object_get_codec_caps ());
-
- /* get src supported format */
- src_caps = gst_caps_merge (gst_v4l2_video_dec_probe_caps (device, video_fd,
- V4L2_BUF_TYPE_VIDEO_CAPTURE, gst_v4l2_object_get_raw_caps ()),
- gst_v4l2_video_dec_probe_caps (device, video_fd,
- V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE,
- gst_v4l2_object_get_raw_caps ()));
-
- if (!gst_caps_is_empty (sink_caps) && !gst_caps_is_empty (src_caps)) {
- GTypeQuery type_query;
- GTypeInfo type_info = { 0, };
- GType type, subtype;
- gchar *type_name;
- Gstv4l2VideoDecQData *qdata;
-
- type = gst_v4l2_video_dec_get_type ();
- g_type_query (type, &type_query);
- memset (&type_info, 0, sizeof (type_info));
- type_info.class_size = type_query.class_size;
- type_info.instance_size = type_query.instance_size;
-
- type_name = g_strdup_printf ("v4l2video%ddec", i);
- subtype = g_type_register_static (type, type_name, &type_info, 0);
-
- qdata = g_new0 (Gstv4l2VideoDecQData, 1);
- qdata->device = g_strdup (device);
- qdata->sink_caps = gst_caps_ref (sink_caps);
- qdata->src_caps = gst_caps_ref (src_caps);
-
- g_type_set_qdata (subtype, V4L2_VIDEO_DEC_QUARK, qdata);
-
- gst_element_register (plugin, type_name, GST_RANK_PRIMARY + 1, subtype);
-
- g_free (type_name);
- }
-
- close (video_fd);
- gst_caps_unref (src_caps);
- gst_caps_unref (sink_caps);
- }
-
- g_free (device);
+ GTypeQuery type_query;
+ GTypeInfo type_info = { 0, };
+ GType type, subtype;
+ gchar *type_name;
+ GstV4l2VideoDecCData *cdata;
+
+ cdata = g_new0 (GstV4l2VideoDecCData, 1);
+ cdata->device = g_strdup (device_path);
+ cdata->sink_caps = gst_caps_ref (sink_caps);
+ cdata->src_caps = gst_caps_ref (src_caps);
+
+ type = gst_v4l2_video_dec_get_type ();
+ g_type_query (type, &type_query);
+ memset (&type_info, 0, sizeof (type_info));
+ type_info.class_size = type_query.class_size;
+ type_info.instance_size = type_query.instance_size;
+ type_info.class_init = gst_v4l2_video_dec_subclass_init;
+ type_info.class_data = cdata;
+ type_info.instance_init = gst_v4l2_video_dec_subinstance_init;
+
+ type_name = g_strdup_printf ("v4l2%sdec", basename);
+ subtype = g_type_register_static (type, type_name, &type_info, 0);
+
+ gst_element_register (plugin, type_name, GST_RANK_PRIMARY + 1, subtype);
+
+ g_free (type_name);
return TRUE;
}
diff --git a/sys/v4l2/gstv4l2videodec.h b/sys/v4l2/gstv4l2videodec.h
index 6ff2e736..2ea3e83f 100644
--- a/sys/v4l2/gstv4l2videodec.h
+++ b/sys/v4l2/gstv4l2videodec.h
@@ -65,18 +65,22 @@ struct _GstV4l2VideoDec
gboolean active;
gboolean processing;
GstFlowReturn output_flow;
-
- GstVideoAlignment align;
};
struct _GstV4l2VideoDecClass
{
GstVideoDecoderClass parent_class;
+
+ gchar *default_device;
};
GType gst_v4l2_video_dec_get_type (void);
-gboolean gst_v4l2_video_dec_register (GstPlugin * plugin);
+gboolean gst_v4l2_is_video_dec (GstCaps * sink_caps, GstCaps * src_caps);
+gboolean gst_v4l2_video_dec_register (GstPlugin * plugin,
+ const gchar *basename,
+ const gchar *device_path,
+ GstCaps * sink_caps, GstCaps * src_caps);
G_END_DECLS
diff --git a/sys/v4l2/v4l2-utils.c b/sys/v4l2/v4l2-utils.c
new file mode 100644
index 00000000..899c1911
--- /dev/null
+++ b/sys/v4l2/v4l2-utils.c
@@ -0,0 +1,166 @@
+/*
+ * Copyright (C) 2014 Collabora Ltd.
+ * Author: Nicolas Dufresne <nicolas.dufresne@collabora.co.uk>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "v4l2-utils.h"
+
+/**************************/
+/* Common device iterator */
+/**************************/
+
+#if HAVE_GUDEV
+#include <gudev/gudev.h>
+
+struct _GstV4l2GUdevIterator
+{
+ GstV4l2Iterator parent;
+ GList *devices;
+ GUdevDevice *device;
+ GUdevClient *client;
+};
+
+GstV4l2Iterator *
+gst_v4l2_iterator_new (void)
+{
+ static const gchar *subsystems[] = { "video4linux", NULL };
+ struct _GstV4l2GUdevIterator *it;
+
+ it = g_slice_new0 (struct _GstV4l2GUdevIterator);
+
+ it->client = g_udev_client_new (subsystems);
+ it->devices = g_udev_client_query_by_subsystem (it->client, "video4linux");
+
+ return (GstV4l2Iterator *) it;
+}
+
+gboolean
+gst_v4l2_iterator_next (GstV4l2Iterator * _it)
+{
+ struct _GstV4l2GUdevIterator *it = (struct _GstV4l2GUdevIterator *) _it;
+ const gchar *device_name;
+
+ if (it->device)
+ g_object_unref (it->device);
+
+ it->device = NULL;
+ it->parent.device_path = NULL;
+ it->parent.device_name = NULL;
+
+ if (it->devices == NULL)
+ return FALSE;
+
+ it->device = it->devices->data;
+ it->devices = g_list_delete_link (it->devices, it->devices);
+
+ device_name = g_udev_device_get_property (it->device, "ID_V4L_PRODUCT");
+ if (!device_name)
+ device_name = g_udev_device_get_property (it->device, "ID_MODEL_ENC");
+ if (!device_name)
+ device_name = g_udev_device_get_property (it->device, "ID_MODEL");
+
+ it->parent.device_path = g_udev_device_get_device_file (it->device);
+ it->parent.device_name = device_name;
+ it->parent.sys_path = g_udev_device_get_sysfs_path (it->device);
+
+ return TRUE;
+}
+
+void
+gst_v4l2_iterator_free (GstV4l2Iterator * _it)
+{
+ struct _GstV4l2GUdevIterator *it = (struct _GstV4l2GUdevIterator *) _it;
+ g_list_free_full (it->devices, g_object_unref);
+ gst_object_unref (it->client);
+ g_slice_free (struct _GstV4l2GUdevIterator, it);
+}
+
+#else /* No GUDEV */
+
+struct _GstV4l2FsIterator
+{
+ GstV4l2Iterator parent;
+ gint base_idx;
+ gint video_idx;
+ gchar *device;
+};
+
+GstV4l2Iterator *
+gst_v4l2_iterator_new (void)
+{
+ struct _GstV4l2FsIterator *it;
+
+ it = g_slice_new0 (struct _GstV4l2FsIterator);
+ it->base_idx = 0;
+ it->video_idx = -1;
+ it->device = NULL;
+
+ return (GstV4l2Iterator *) it;
+}
+
+gboolean
+gst_v4l2_iterator_next (GstV4l2Iterator * _it)
+{
+ struct _GstV4l2FsIterator *it = (struct _GstV4l2FsIterator *) _it;
+ static const gchar *dev_base[] = { "/dev/video", "/dev/v4l2/video", NULL };
+ gchar *device = NULL;
+
+ g_free ((gchar *) it->parent.device_path);
+ it->parent.device_path = NULL;
+
+ while (device == NULL) {
+ it->video_idx++;
+
+ if (it->video_idx >= 64) {
+ it->video_idx = 0;
+ it->base_idx++;
+ }
+
+ if (dev_base[it->base_idx] == NULL) {
+ it->video_idx = 0;
+ break;
+ }
+
+ device = g_strdup_printf ("%s%d", dev_base[it->base_idx], it->video_idx);
+
+ if (g_file_test (device, G_FILE_TEST_EXISTS)) {
+ it->parent.device_path = device;
+ break;
+ }
+
+ g_free (device);
+ device = NULL;
+ }
+
+ return it->parent.device_path != NULL;
+}
+
+void
+gst_v4l2_iterator_free (GstV4l2Iterator * _it)
+{
+ struct _GstV4l2FsIterator *it = (struct _GstV4l2FsIterator *) _it;
+ g_free ((gchar *) it->parent.device_path);
+ g_slice_free (struct _GstV4l2FsIterator, it);
+}
+
+#endif
diff --git a/sys/v4l2/v4l2-utils.h b/sys/v4l2/v4l2-utils.h
new file mode 100644
index 00000000..9a73bd91
--- /dev/null
+++ b/sys/v4l2/v4l2-utils.h
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2014 Collabora Ltd.
+ * Author: Nicolas Dufresne <nicolas.dufresne@collabora.co.uk>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef __V4L2_UTILS_H__
+#define __V4L2_UTILS_H__
+
+#include <gst/gst.h>
+
+G_BEGIN_DECLS
+
+typedef struct _GstV4l2Iterator GstV4l2Iterator;
+
+struct _GstV4l2Iterator
+{
+ const gchar *device_path;
+ const gchar *device_name;
+ const gchar *sys_path;
+};
+
+GstV4l2Iterator * gst_v4l2_iterator_new (void);
+gboolean gst_v4l2_iterator_next (GstV4l2Iterator *it);
+void gst_v4l2_iterator_free (GstV4l2Iterator *it);
+
+const gchar * gst_v4l2_iterator_get_device_path (GstV4l2Iterator *it);
+const gchar * gst_v4l2_iterator_get_device_name (GstV4l2Iterator *it);
+const gchar * gst_v4l2_iterator_get_sys_path (GstV4l2Iterator *it);
+
+G_END_DECLS
+
+#endif /* __V4L2_UTILS_H__ */
+
+
diff --git a/sys/v4l2/v4l2_calls.c b/sys/v4l2/v4l2_calls.c
index 186e7801..79368538 100644
--- a/sys/v4l2/v4l2_calls.c
+++ b/sys/v4l2/v4l2_calls.c
@@ -374,6 +374,9 @@ gst_v4l2_fill_lists (GstV4l2Object * v4l2object)
/* FIXME: We should implement GstMixer interface instead */
/* but let's not be pedantic and make element more useful for now */
break;
+ case V4L2_CID_ALPHA_COMPONENT:
+ v4l2object->has_alpha_component = TRUE;
+ break;
default:
GST_DEBUG_OBJECT (e,
"ControlID %s (%x) unhandled, FIXME", control.name, n);
diff --git a/sys/v4l2/v4l2_calls.h b/sys/v4l2/v4l2_calls.h
index 3c85dae9..5a4bd843 100644
--- a/sys/v4l2/v4l2_calls.h
+++ b/sys/v4l2/v4l2_calls.h
@@ -29,8 +29,10 @@
#ifdef HAVE_LIBV4L2
# include <libv4l2.h>
#else
-# include <sys/ioctl.h>
# include <linux/videodev2.h>
+# include <sys/ioctl.h>
+# include <sys/mman.h>
+# include <unistd.h>
# define v4l2_fd_open(fd, flags) (fd)
# define v4l2_close close
# define v4l2_dup dup
diff --git a/sys/waveform/Makefile.in b/sys/waveform/Makefile.in
index 24229535..08a9dcff 100644
--- a/sys/waveform/Makefile.in
+++ b/sys/waveform/Makefile.in
@@ -104,6 +104,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/sys/ximage/Makefile.in b/sys/ximage/Makefile.in
index e36649da..e89dcba2 100644
--- a/sys/ximage/Makefile.in
+++ b/sys/ximage/Makefile.in
@@ -104,6 +104,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/tests/Makefile.in b/tests/Makefile.in
index ab595350..0c284d48 100644
--- a/tests/Makefile.in
+++ b/tests/Makefile.in
@@ -101,6 +101,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/tests/check/Makefile.in b/tests/check/Makefile.in
index b34317a0..268076e4 100644
--- a/tests/check/Makefile.in
+++ b/tests/check/Makefile.in
@@ -121,6 +121,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/tests/check/elements/rtpaux.c b/tests/check/elements/rtpaux.c
index 0fe5585a..1f410bf2 100644
--- a/tests/check/elements/rtpaux.c
+++ b/tests/check/elements/rtpaux.c
@@ -24,7 +24,8 @@
#include <gst/check/gsttestclock.h>
#include <gst/rtp/gstrtpbuffer.h>
-static GMainLoop *main_loop;
+static gboolean send_pipeline_eos = FALSE;
+static gboolean receive_pipeline_eos = FALSE;
static void
message_received (GstBus * bus, GstMessage * message, GstPipeline * bin)
@@ -34,7 +35,15 @@ message_received (GstBus * bus, GstMessage * message, GstPipeline * bin)
switch (message->type) {
case GST_MESSAGE_EOS:
- g_main_loop_quit (main_loop);
+ if (!strcmp ("pipeline_send",
+ GST_OBJECT_NAME (GST_MESSAGE_SRC (message))))
+ send_pipeline_eos = TRUE;
+ else if (!strcmp ("pipeline_receive",
+ GST_OBJECT_NAME (GST_MESSAGE_SRC (message))))
+ receive_pipeline_eos = TRUE;
+ else
+ fail ("Unknown pipeline: %s",
+ GST_OBJECT_NAME (GST_MESSAGE_SRC (message)));
break;
case GST_MESSAGE_WARNING:{
GError *gerror;
@@ -54,7 +63,7 @@ message_received (GstBus * bus, GstMessage * message, GstPipeline * bin)
gst_object_default_error (GST_MESSAGE_SRC (message), gerror, debug);
g_error_free (gerror);
g_free (debug);
- g_main_loop_quit (main_loop);
+ fail ("Error!");
break;
}
default:
@@ -334,7 +343,6 @@ GST_START_TEST (test_simple_rtpbin_aux)
recvrtcp_udpsink, "sink", GST_PAD_LINK_CHECK_NOTHING);
fail_unless (res == TRUE, NULL);
- main_loop = g_main_loop_new (NULL, FALSE);
g_signal_connect (bussend, "message::error", (GCallback) message_received,
binsend);
g_signal_connect (bussend, "message::warning", (GCallback) message_received,
@@ -359,8 +367,8 @@ GST_START_TEST (test_simple_rtpbin_aux)
g_timeout_add (5000, on_timeout, binreceive);
GST_INFO ("enter mainloop");
- g_main_loop_run (main_loop);
- g_main_loop_run (main_loop);
+ while (!send_pipeline_eos && !receive_pipeline_eos)
+ g_main_context_iteration (NULL, TRUE);
GST_INFO ("exit mainloop");
/* check that FB NACK is working */
@@ -381,8 +389,6 @@ GST_START_TEST (test_simple_rtpbin_aux)
fail_if (nb_rtx_recv_packets < 1);
/* cleanup */
- g_main_loop_unref (main_loop);
-
gst_bus_remove_signal_watch (bussend);
gst_object_unref (bussend);
gst_object_unref (binsend);
diff --git a/tests/check/elements/rtpcollision.c b/tests/check/elements/rtpcollision.c
index 6c09ef19..e9528f9a 100644
--- a/tests/check/elements/rtpcollision.c
+++ b/tests/check/elements/rtpcollision.c
@@ -76,10 +76,10 @@ message_received (GstBus * bus, GstMessage * message, GstPipeline * bin)
}
static GstBuffer *
-create_rtcp_app (guint32 ssrc)
+create_rtcp_app (guint32 ssrc, guint count)
{
GInetAddress *inet_addr_0;
- guint16 port = 5678;
+ guint16 port = 5678 + count;
GSocketAddress *socket_addr_0;
GstBuffer *rtcp_buffer;
GstRTCPPacket *rtcp_packet = NULL;
@@ -140,7 +140,7 @@ rtpsession_sinkpad_probe (GstPad * pad, GstPadProbeInfo * info,
* (note that after being marked as collied the rtpsession ignores
* all non bye packets)
*/
- rtcp_buffer = create_rtcp_app (ssrc);
+ rtcp_buffer = create_rtcp_app (ssrc, nb_ssrc_changes);
/* push collied packet on recv_rtcp_sink */
gst_pad_push (srcpad, rtcp_buffer);
@@ -313,7 +313,7 @@ rtpsession_sinkpad_probe2 (GstPad * pad, GstPadProbeInfo * info,
* all non bye packets)
*/
if (i == 2) {
- GstBuffer *rtcp_buffer = create_rtcp_app (rtx_ssrc_before);
+ GstBuffer *rtcp_buffer = create_rtcp_app (rtx_ssrc_before, 0);
/* push collied packet on recv_rtcp_sink */
gst_pad_push (srcpad, rtcp_buffer);
diff --git a/tests/check/elements/rtpjitterbuffer.c b/tests/check/elements/rtpjitterbuffer.c
index 578c8e9a..31999ef6 100644
--- a/tests/check/elements/rtpjitterbuffer.c
+++ b/tests/check/elements/rtpjitterbuffer.c
@@ -654,7 +654,6 @@ GST_START_TEST (test_only_one_lost_event_on_large_gaps)
setup_testharness (&data);
g_object_set (data.jitter_buffer, "latency", jb_latency_ms, NULL);
-
/* push the first buffer in */
in_buf = generate_test_buffer (0 * GST_MSECOND, TRUE, 0, 0);
gst_test_clock_set_time (GST_TEST_CLOCK (data.clock), 0);
@@ -1253,8 +1252,6 @@ GST_START_TEST (test_rtx_packet_delay)
g_object_set (data.jitter_buffer, "latency", jb_latency_ms, NULL);
g_object_set (data.jitter_buffer, "rtx-retry-period", 120, NULL);
- gst_test_clock_set_time (GST_TEST_CLOCK (data.clock), 0);
-
/* push the first buffer in */
in_buf = generate_test_buffer (0 * GST_MSECOND, TRUE, 0, 0);
GST_BUFFER_FLAG_SET (in_buf, GST_BUFFER_FLAG_DISCONT);
@@ -1399,6 +1396,179 @@ GST_START_TEST (test_rtx_packet_delay)
GST_END_TEST;
+GST_START_TEST (test_gap_exceeds_latency)
+{
+ TestData data;
+ GstBuffer *in_buf, *out_buf;
+ GstClockID id, tid;
+ GstEvent *out_event;
+ guint32 timestamp_ms = 0;
+ guint32 last_ts = 0;
+ gint jb_latency_ms = 200;
+ guint32 rtp_ts = 0;
+ guint32 last_rtp = 0;
+ const GstStructure *s = NULL;
+ guint32 seqnum = 0;
+ gint i;
+
+ setup_testharness (&data);
+ g_object_set (data.jitter_buffer, "do-retransmission", TRUE, NULL);
+ g_object_set (data.jitter_buffer, "latency", jb_latency_ms, NULL);
+ g_object_set (data.jitter_buffer, "rtx-retry-period", 120, NULL);
+
+ gst_test_clock_set_time (GST_TEST_CLOCK (data.clock), 0);
+ in_buf = generate_test_buffer (timestamp_ms * GST_MSECOND, TRUE, 0, rtp_ts);
+ GST_BUFFER_FLAG_SET (in_buf, GST_BUFFER_FLAG_DISCONT);
+ g_assert_cmpint (gst_pad_push (data.test_src_pad, in_buf), ==, GST_FLOW_OK);
+
+ timestamp_ms += 20;
+ rtp_ts += 160;
+ gst_test_clock_set_time (GST_TEST_CLOCK (data.clock),
+ timestamp_ms * GST_MSECOND);
+
+ in_buf = generate_test_buffer (timestamp_ms * GST_MSECOND, TRUE, 1, rtp_ts);
+ g_assert_cmpint (gst_pad_push (data.test_src_pad, in_buf), ==, GST_FLOW_OK);
+ last_rtp = rtp_ts;
+ last_ts = timestamp_ms;
+
+ /* Allow seqnum 2 to be declared lost */
+ do {
+ out_event = g_async_queue_try_pop (data.sink_event_queue);
+ if (!out_event) {
+ if (gst_test_clock_peek_next_pending_id (GST_TEST_CLOCK (data.clock),
+ &id)) {
+
+ GstClockTime t = gst_clock_id_get_time (id);
+ if (t > gst_clock_get_time (data.clock)) {
+ gst_test_clock_set_time (GST_TEST_CLOCK (data.clock), t);
+ }
+ tid =
+ gst_test_clock_process_next_clock_id (GST_TEST_CLOCK (data.clock));
+ gst_clock_id_unref (id);
+ gst_clock_id_unref (tid);
+ }
+ }
+ } while (!out_event);
+
+ out_buf = g_async_queue_pop (data.buf_queue);
+ gst_buffer_unref (out_buf);
+
+ out_buf = g_async_queue_pop (data.buf_queue);
+ gst_buffer_unref (out_buf);
+
+ timestamp_ms += (20 * 15);
+ s = gst_event_get_structure (out_event);
+ g_assert (gst_structure_get_uint (s, "seqnum", &seqnum));
+ g_assert_cmpint (seqnum, ==, 2);
+ gst_event_unref (out_event);
+
+ /* Now data comes in again, a "bulk" lost packet is created for 3 -> 6 */
+ rtp_ts += (160 * 15);
+ in_buf = generate_test_buffer (timestamp_ms * GST_MSECOND, TRUE, 16, rtp_ts);
+ g_assert_cmpint (gst_pad_push (data.test_src_pad, in_buf), ==, GST_FLOW_OK);
+
+ last_ts += 60;
+ last_rtp += 480;
+ in_buf = generate_test_buffer (last_ts * GST_MSECOND, TRUE, 8, last_rtp);
+ g_assert_cmpint (gst_pad_push (data.test_src_pad, in_buf), ==, GST_FLOW_OK);
+
+ last_ts += 20;
+ last_rtp += 160;
+ in_buf = generate_test_buffer (last_ts * GST_MSECOND, TRUE, 9, last_rtp);
+ g_assert_cmpint (gst_pad_push (data.test_src_pad, in_buf), ==, GST_FLOW_OK);
+
+ last_ts += 20;
+ last_rtp += 160;
+ in_buf = generate_test_buffer (last_ts * GST_MSECOND, TRUE, 10, last_rtp);
+ g_assert_cmpint (gst_pad_push (data.test_src_pad, in_buf), ==, GST_FLOW_OK);
+
+ last_ts += 20;
+ last_rtp += 160;
+ in_buf = generate_test_buffer (last_ts * GST_MSECOND, TRUE, 11, last_rtp);
+ g_assert_cmpint (gst_pad_push (data.test_src_pad, in_buf), ==, GST_FLOW_OK);
+
+ last_ts += 20;
+ last_rtp += 160;
+ in_buf = generate_test_buffer (last_ts * GST_MSECOND, TRUE, 12, last_rtp);
+ g_assert_cmpint (gst_pad_push (data.test_src_pad, in_buf), ==, GST_FLOW_OK);
+
+ last_ts += 20;
+ last_rtp += 160;
+ in_buf = generate_test_buffer (last_ts * GST_MSECOND, TRUE, 13, last_rtp);
+ g_assert_cmpint (gst_pad_push (data.test_src_pad, in_buf), ==, GST_FLOW_OK);
+
+ last_ts += 20;
+ last_rtp += 160;
+ in_buf = generate_test_buffer (last_ts * GST_MSECOND, TRUE, 14, last_rtp);
+ g_assert_cmpint (gst_pad_push (data.test_src_pad, in_buf), ==, GST_FLOW_OK);
+
+ last_ts += 20;
+ last_rtp += 160;
+ in_buf = generate_test_buffer (last_ts * GST_MSECOND, TRUE, 15, last_rtp);
+ g_assert_cmpint (gst_pad_push (data.test_src_pad, in_buf), ==, GST_FLOW_OK);
+
+ /* Wait for data to be pushed. */
+ while (g_async_queue_length (data.buf_queue) < 1) {
+ if (gst_test_clock_peek_next_pending_id (GST_TEST_CLOCK (data.clock), &id)) {
+ GstClockTime t = gst_clock_id_get_time (id);
+ if (t > gst_clock_get_time (data.clock)) {
+ gst_test_clock_set_time (GST_TEST_CLOCK (data.clock), t);
+ }
+ tid = gst_test_clock_process_next_clock_id (GST_TEST_CLOCK (data.clock));
+ gst_clock_id_unref (id);
+ gst_clock_id_unref (tid);
+ }
+ }
+
+ out_event = g_async_queue_pop (data.sink_event_queue);
+ s = gst_event_get_structure (out_event);
+ g_assert (gst_structure_get_uint (s, "seqnum", &seqnum));
+ g_assert_cmpint (seqnum, ==, 3);
+ gst_event_unref (out_event);
+
+ out_event = g_async_queue_pop (data.sink_event_queue);
+ s = gst_event_get_structure (out_event);
+ g_assert (gst_structure_get_uint (s, "seqnum", &seqnum));
+ g_assert_cmpint (seqnum, ==, 7);
+ gst_event_unref (out_event);
+
+ /* 8 */
+ for (i = 8; i <= 16; i++) {
+ out_buf = g_async_queue_pop (data.buf_queue);
+ GST_DEBUG ("pop %d", i);
+ gst_buffer_unref (out_buf);
+ }
+
+ do {
+ out_event = g_async_queue_try_pop (data.sink_event_queue);
+ if (!out_event) {
+ if (gst_test_clock_peek_next_pending_id (GST_TEST_CLOCK (data.clock),
+ &id)) {
+
+ GstClockTime t = gst_clock_id_get_time (id);
+ if (t > gst_clock_get_time (data.clock)) {
+ gst_test_clock_set_time (GST_TEST_CLOCK (data.clock), t);
+ }
+ tid =
+ gst_test_clock_process_next_clock_id (GST_TEST_CLOCK (data.clock));
+ gst_clock_id_unref (id);
+ gst_clock_id_unref (tid);
+ }
+ }
+ } while (!out_event);
+
+ /* and lost of 17 */
+ s = gst_event_get_structure (out_event);
+ g_assert (gst_structure_get_uint (s, "seqnum", &seqnum));
+ g_assert_cmpint (seqnum, ==, 17);
+ gst_event_unref (out_event);
+
+ destroy_testharness (&data);
+}
+
+GST_END_TEST;
+
+
static Suite *
rtpjitterbuffer_suite (void)
{
@@ -1418,6 +1588,7 @@ rtpjitterbuffer_suite (void)
tcase_add_test (tc_chain, test_rtx_expected_next);
tcase_add_test (tc_chain, test_rtx_two_missing);
tcase_add_test (tc_chain, test_rtx_packet_delay);
+ tcase_add_test (tc_chain, test_gap_exceeds_latency);
return s;
}
diff --git a/tests/check/elements/rtpmux.c b/tests/check/elements/rtpmux.c
index 2a81294d..60683b76 100644
--- a/tests/check/elements/rtpmux.c
+++ b/tests/check/elements/rtpmux.c
@@ -226,7 +226,7 @@ basic_check_cb (GstPad * pad, int i)
fail_unless (buffers && g_list_length (buffers) == 1);
gst_rtp_buffer_map (buffers->data, GST_MAP_READ, &rtpbuffer);
- fail_unless (gst_rtp_buffer_get_ssrc (&rtpbuffer) == 55);
+ fail_unless (gst_rtp_buffer_get_ssrc (&rtpbuffer) == 66);
fail_unless (gst_rtp_buffer_get_timestamp (&rtpbuffer) ==
200 - 57 + 1000 + i);
fail_unless (gst_rtp_buffer_get_seq (&rtpbuffer) == 100 + 1 + i);
@@ -260,7 +260,7 @@ lock_check_cb (GstPad * pad, int i)
fail_unless (buffers && g_list_length (buffers) == 1);
gst_rtp_buffer_map (buffers->data, GST_MAP_READ, &rtpbuffer);
- fail_unless (gst_rtp_buffer_get_ssrc (&rtpbuffer) == 55);
+ fail_unless (gst_rtp_buffer_get_ssrc (&rtpbuffer) == 66);
fail_unless (gst_rtp_buffer_get_timestamp (&rtpbuffer) ==
200 - 57 + 1000 + i);
fail_unless (gst_rtp_buffer_get_seq (&rtpbuffer) == 100 + 1 + i);
diff --git a/tests/check/elements/rtprtx.c b/tests/check/elements/rtprtx.c
index 40e4a952..9c6206a1 100644
--- a/tests/check/elements/rtprtx.c
+++ b/tests/check/elements/rtprtx.c
@@ -31,8 +31,6 @@ static GstPad *srcpad, *sinkpad;
/* we also have a list of src buffers */
static GList *inbuffers = NULL;
-static GMainLoop *main_loop;
-
#define RTP_CAPS_STRING \
"application/x-rtp, " \
"media = (string)audio, " \
@@ -256,14 +254,14 @@ GST_START_TEST (test_push_forward_seq)
GST_END_TEST;
static void
-message_received (GstBus * bus, GstMessage * message, GstPipeline * bin)
+message_received (GstBus * bus, GstMessage * message, gboolean * eos)
{
GST_INFO ("bus message from \"%" GST_PTR_FORMAT "\": %" GST_PTR_FORMAT,
GST_MESSAGE_SRC (message), message);
switch (message->type) {
case GST_MESSAGE_EOS:
- g_main_loop_quit (main_loop);
+ *eos = TRUE;
break;
case GST_MESSAGE_WARNING:{
GError *gerror;
@@ -281,9 +279,9 @@ message_received (GstBus * bus, GstMessage * message, GstPipeline * bin)
gst_message_parse_error (message, &gerror, &debug);
gst_object_default_error (GST_MESSAGE_SRC (message), gerror, debug);
+ fail ("Error: %s / %s", gerror->message, debug);
g_error_free (gerror);
g_free (debug);
- g_main_loop_quit (main_loop);
break;
}
default:
@@ -392,7 +390,7 @@ static void
start_test_drop_and_check_results (GstElement * bin, GstElement * rtppayloader,
GstElement * rtprtxsend, GstElement * rtprtxreceive,
RTXSendData * send_rtxdata, RTXReceiveData * receive_rtxdata,
- guint drop_every_n_packets)
+ guint drop_every_n_packets, gboolean * eos)
{
GstStateChangeReturn state_res = GST_STATE_CHANGE_FAILURE;
guint nbrtxrequests = 0;
@@ -439,7 +437,8 @@ start_test_drop_and_check_results (GstElement * bin, GstElement * rtppayloader,
ck_assert_int_ne (state_res, GST_STATE_CHANGE_FAILURE);
GST_INFO ("running main loop");
- g_main_loop_run (main_loop);
+ while (!*eos)
+ g_main_context_iteration (NULL, TRUE);
/* check results */
@@ -495,6 +494,7 @@ GST_START_TEST (test_drop_one_sender)
guint drop_every_n_packets = 0;
RTXSendData send_rtxdata;
RTXReceiveData receive_rtxdata;
+ gboolean eos = FALSE;
GST_INFO ("preparing test");
@@ -547,19 +547,19 @@ GST_START_TEST (test_drop_one_sender)
gst_object_unref (sinkpad);
gst_object_unref (srcpad);
- main_loop = g_main_loop_new (NULL, FALSE);
- g_signal_connect (bus, "message::error", (GCallback) message_received, bin);
- g_signal_connect (bus, "message::warning", (GCallback) message_received, bin);
- g_signal_connect (bus, "message::eos", (GCallback) message_received, bin);
+ g_signal_connect (bus, "message::error", (GCallback) message_received, NULL);
+ g_signal_connect (bus, "message::warning", (GCallback) message_received,
+ NULL);
+ g_signal_connect (bus, "message::eos", (GCallback) message_received, &eos);
for (drop_every_n_packets = 2; drop_every_n_packets < 10;
drop_every_n_packets++) {
start_test_drop_and_check_results (bin, rtppayloader, rtprtxsend,
- rtprtxreceive, &send_rtxdata, &receive_rtxdata, drop_every_n_packets);
+ rtprtxreceive, &send_rtxdata, &receive_rtxdata, drop_every_n_packets,
+ &eos);
}
/* cleanup */
- g_main_loop_unref (main_loop);
gst_consistency_checker_free (chk_1);
gst_consistency_checker_free (chk_2);
gst_consistency_checker_free (chk_3);
@@ -570,21 +570,13 @@ GST_START_TEST (test_drop_one_sender)
GST_END_TEST;
-GMutex lock_eos;
-static gint nb_sources;
-static gint nb_eos;
-
static void
-message_received_multiple (GstBus * bus, GstMessage * message,
- GstPipeline * bin)
+message_received_multiple (GstBus * bus, GstMessage * message, gpointer data)
{
GST_INFO ("bus message from \"%" GST_PTR_FORMAT "\": %" GST_PTR_FORMAT,
GST_MESSAGE_SRC (message), message);
switch (message->type) {
- case GST_MESSAGE_EOS:
- g_main_loop_quit (main_loop);
- break;
case GST_MESSAGE_WARNING:{
GError *gerror;
gchar *debug;
@@ -601,9 +593,9 @@ message_received_multiple (GstBus * bus, GstMessage * message,
gst_message_parse_error (message, &gerror, &debug);
gst_object_default_error (GST_MESSAGE_SRC (message), gerror, debug);
+ fail ("Error: %s / %s", gerror->message, debug);
g_error_free (gerror);
g_free (debug);
- g_main_loop_quit (main_loop);
break;
}
default:
@@ -617,6 +609,7 @@ typedef struct
guint nb_packets;
guint drop_every_n_packets;
guint payload_type_master;
+ guint total_packets;
} RTXSendMultipleData;
/* drop some packets */
@@ -640,7 +633,11 @@ rtprtxsend_srcpad_probe_multiple (GstPad * pad, GstPadProbeInfo * info,
/* count packets of the main stream */
++rtxdata->nb_packets;
/* drop some packets */
- if (rtxdata->count < rtxdata->drop_every_n_packets) {
+ /* but make sure we never drop the last one, otherwise there
+ * will be nothing to trigger a retransmission.
+ */
+ if (rtxdata->count < rtxdata->drop_every_n_packets ||
+ rtxdata->nb_packets == rtxdata->total_packets) {
++rtxdata->count;
} else {
/* drop a packet every 'rtxdata->count' packets */
@@ -659,33 +656,37 @@ rtprtxsend_srcpad_probe_multiple (GstPad * pad, GstPadProbeInfo * info,
/* make sure every sources has sent all their buffers */
static GstPadProbeReturn
-source_srcpad_probe_multiple (GstPad * pad, GstPadProbeInfo * info,
+source_srcpad_probe_multiple_drop_eos (GstPad * pad, GstPadProbeInfo * info,
gpointer user_data)
{
- GstPadProbeReturn ret = GST_PAD_PROBE_OK;
+ GstEvent *event = GST_PAD_PROBE_INFO_EVENT (info);
- if (info->type ==
- (GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM | GST_PAD_PROBE_TYPE_PUSH)) {
- GstEvent *event = GST_PAD_PROBE_INFO_EVENT (info);
- if (GST_EVENT_TYPE (event) == GST_EVENT_EOS) {
- g_mutex_lock (&lock_eos);
- ++nb_eos;
- if (nb_eos < nb_sources)
- ret = GST_PAD_PROBE_DROP;
- g_mutex_unlock (&lock_eos);
- }
- }
-
- return ret;
+ if (GST_EVENT_TYPE (event) == GST_EVENT_EOS)
+ return GST_PAD_PROBE_DROP;
+ else
+ return GST_PAD_PROBE_OK;
}
+typedef struct
+{
+ GHashTable *ssrc_to_nb_packets_map;
+ GHashTable *ssrc_to_seqnum_offset_map;
+ guint seqnum_offset;
+
+ gint to_send;
+ volatile gint dropped_requests;
+ volatile gint received;
+ gboolean request_passed;
+} RTXReceiveMultipleData;
+
/* add one branch videotestsrc ! rtpvrawpay ! rtprtxsend ! queue ! funnel. */
static RTXSendMultipleData *
add_sender (GstElement * bin, const gchar * src_name,
const gchar * payloader_name, guint payload_type_master,
- guint payload_type_aux)
+ guint payload_type_aux, RTXReceiveMultipleData * rtxdata)
{
GstElement *src = NULL;
+ GstCaps *caps;
GstElement *rtppayloader = NULL;
GstElement *rtprtxsend = NULL;
GstElement *queue = NULL;
@@ -700,6 +701,8 @@ add_sender (GstElement * bin, const gchar * src_name,
send_rtxdata->nb_packets = 0;
send_rtxdata->drop_every_n_packets = 0;
send_rtxdata->payload_type_master = payload_type_master;
+ send_rtxdata->total_packets = 25;
+ rtxdata->to_send += send_rtxdata->total_packets;
src = gst_element_factory_make (src_name, NULL);
rtppayloader = gst_element_factory_make (payloader_name, NULL);
@@ -712,7 +715,8 @@ add_sender (GstElement * bin, const gchar * src_name,
pt_master, G_TYPE_UINT, payload_type_aux, NULL);
g_free (pt_master);
- g_object_set (src, "num-buffers", 25, NULL);
+ g_object_set (src, "num-buffers", send_rtxdata->total_packets, NULL);
+ g_object_set (src, "is-live", TRUE, NULL);
g_object_set (rtppayloader, "pt", payload_type_master, NULL);
g_object_set (rtppayloader, "seqnum-offset", 1, NULL);
g_object_set (rtprtxsend, "payload-type-map", pt_map, NULL);
@@ -724,7 +728,11 @@ add_sender (GstElement * bin, const gchar * src_name,
gst_bin_add_many (GST_BIN (bin), src, rtppayloader, rtprtxsend, queue, NULL);
- res = gst_element_link (src, rtppayloader);
+ /* Make sure we have one buffer per frame, makes it easier to count! */
+ caps =
+ gst_caps_from_string ("video/x-raw, width=20, height=10, framerate=30/1");
+ res = gst_element_link_filtered (src, rtppayloader, caps);
+ gst_caps_unref (caps);
fail_unless (res == TRUE, NULL);
res = gst_element_link (rtppayloader, rtprtxsend);
fail_unless (res == TRUE, NULL);
@@ -743,23 +751,36 @@ add_sender (GstElement * bin, const gchar * src_name,
gst_object_unref (srcpad);
/* to make sure every sources has sent all their buffers */
- srcpad = gst_element_get_static_pad (queue, "src");
- gst_pad_add_probe (srcpad,
- (GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM | GST_PAD_PROBE_TYPE_PUSH),
- (GstPadProbeCallback) source_srcpad_probe_multiple, NULL, NULL);
+ srcpad = gst_element_get_static_pad (src, "src");
+ gst_pad_add_probe (srcpad, GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM,
+ (GstPadProbeCallback) source_srcpad_probe_multiple_drop_eos, NULL, NULL);
gst_object_unref (srcpad);
- ++nb_sources;
-
return send_rtxdata;
}
-typedef struct
+static GstPadProbeReturn
+rtprtxreceive_sinkpad_probe_check_drop (GstPad * pad, GstPadProbeInfo * info,
+ gpointer user_data)
{
- GHashTable *ssrc_to_nb_packets_map;
- GHashTable *ssrc_to_seqnum_offset_map;
- guint seqnum_offset;
-} RTXReceiveMultipleData;
+ GstEvent *event = GST_PAD_PROBE_INFO_EVENT (info);
+ RTXReceiveMultipleData *rtxdata = (RTXReceiveMultipleData *) user_data;
+
+ if (GST_EVENT_TYPE (event) == GST_EVENT_CUSTOM_UPSTREAM &&
+ gst_event_get_structure (event) != NULL &&
+ gst_structure_has_name (gst_event_get_structure (event),
+ "GstRTPRetransmissionRequest"))
+ rtxdata->request_passed = TRUE;
+
+ return GST_PAD_PROBE_OK;
+}
+
+static gboolean
+check_finished (RTXReceiveMultipleData * rtxdata)
+{
+ return (g_atomic_int_get (&rtxdata->received) >= (rtxdata->to_send -
+ g_atomic_int_get (&rtxdata->dropped_requests)));
+}
static GstPadProbeReturn
rtprtxreceive_srcpad_probe_multiple (GstPad * pad, GstPadProbeInfo * info,
@@ -778,6 +799,10 @@ rtprtxreceive_srcpad_probe_multiple (GstPad * pad, GstPadProbeInfo * info,
ssrc = gst_rtp_buffer_get_ssrc (&rtp);
seqnum = gst_rtp_buffer_get_seq (&rtp);
+ g_atomic_int_inc (&rtxdata->received);
+ if (check_finished (rtxdata))
+ g_main_context_wakeup (NULL);
+
if (!g_hash_table_lookup_extended (rtxdata->ssrc_to_seqnum_offset_map,
GUINT_TO_POINTER (ssrc), NULL, &seqnum_prev)) {
/*In our test we take care to never drop the first buffer */
@@ -789,6 +814,7 @@ rtprtxreceive_srcpad_probe_multiple (GstPad * pad, GstPadProbeInfo * info,
return GST_PAD_PROBE_OK;
}
+
/* check if there is a dropped packet
* (in our test every packet arrived in increasing order) */
if (seqnum > GPOINTER_TO_UINT (seqnum_prev) + rtxdata->seqnum_offset) {
@@ -805,7 +831,13 @@ rtprtxreceive_srcpad_probe_multiple (GstPad * pad, GstPadProbeInfo * info,
"payload-type", G_TYPE_UINT,
gst_rtp_buffer_get_payload_type (&rtp),
NULL));
+ rtxdata->request_passed = FALSE;
gst_pad_push_event (peerpad, event);
+ if (!rtxdata->request_passed) {
+ g_atomic_int_inc (&rtxdata->dropped_requests);
+ if (check_finished (rtxdata))
+ g_main_context_wakeup (NULL);
+ }
}
gst_object_unref (peerpad);
@@ -879,6 +911,9 @@ start_test_drop_multiple_and_check_results (GstElement * bin,
GST_INFO ("starting test");
+ g_atomic_int_set (&receive_rtxdata->received, 0);
+ g_atomic_int_set (&receive_rtxdata->dropped_requests, 0);
+
g_hash_table_remove_all (receive_rtxdata->ssrc_to_nb_packets_map);
g_hash_table_remove_all (receive_rtxdata->ssrc_to_seqnum_offset_map);
@@ -893,7 +928,8 @@ start_test_drop_multiple_and_check_results (GstElement * bin,
ck_assert_int_ne (state_res, GST_STATE_CHANGE_FAILURE);
GST_INFO ("running main loop");
- g_main_loop_run (main_loop);
+ while (!check_finished (receive_rtxdata))
+ g_main_context_iteration (NULL, TRUE);
/* check results */
itr_elements = gst_bin_iterate_elements (GST_BIN (bin));
@@ -934,10 +970,8 @@ start_test_drop_multiple_and_check_results (GstElement * bin,
g_hash_table_foreach (receive_rtxdata->ssrc_to_nb_packets_map,
compute_total_packets_received, (gpointer) & sum_all_packets_received);
- /* check that we sent as many packets as received */
- /* when eos is received by sources we cannot ensure that every packets
- * will be received by sinks (maybe queue flush ?)
- */
+ sum_all_packets_received +=
+ g_atomic_int_get (&receive_rtxdata->dropped_requests);
fail_if (sum_all_packets_sent < sum_all_packets_received);
/* some packet are not received, I still have to figure out why
@@ -990,10 +1024,10 @@ GST_START_TEST (test_drop_multiple_sender)
GstElement *bin, *funnel, *rtprtxreceive, *sink;
GstBus *bus;
gboolean res;
- GstPad *srcpad;
+ GstPad *srcpad, *sinkpad;
guint drop_every_n_packets = 0;
GList *send_rtxdata_list = NULL;
- RTXReceiveMultipleData receive_rtxdata;
+ RTXReceiveMultipleData receive_rtxdata = { NULL };
GstStructure *pt_map;
GST_INFO ("preparing test");
@@ -1016,21 +1050,18 @@ GST_START_TEST (test_drop_multiple_sender)
g_object_set (sink, "qos", FALSE, NULL);
gst_bin_add_many (GST_BIN (bin), funnel, rtprtxreceive, sink, NULL);
- nb_sources = 0;
- g_mutex_init (&lock_eos);
-
send_rtxdata_list =
g_list_append (send_rtxdata_list, add_sender (bin, "videotestsrc",
- "rtpvrawpay", 96, 121));
+ "rtpvrawpay", 96, 121, &receive_rtxdata));
send_rtxdata_list =
g_list_append (send_rtxdata_list, add_sender (bin, "videotestsrc",
- "rtpvrawpay", 97, 122));
+ "rtpvrawpay", 97, 122, &receive_rtxdata));
send_rtxdata_list =
g_list_append (send_rtxdata_list, add_sender (bin, "videotestsrc",
- "rtpvrawpay", 98, 123));
+ "rtpvrawpay", 98, 123, &receive_rtxdata));
send_rtxdata_list =
g_list_append (send_rtxdata_list, add_sender (bin, "videotestsrc",
- "rtpvrawpay", 99, 124));
+ "rtpvrawpay", 99, 124, &receive_rtxdata));
pt_map = gst_structure_new ("application/x-rtp-pt-map",
"96", G_TYPE_UINT, 121, "97", G_TYPE_UINT, 122,
@@ -1050,23 +1081,25 @@ GST_START_TEST (test_drop_multiple_sender)
&receive_rtxdata, NULL);
gst_object_unref (srcpad);
- main_loop = g_main_loop_new (NULL, FALSE);
+ sinkpad = gst_element_get_static_pad (rtprtxreceive, "sink");
+ gst_pad_add_probe (sinkpad,
+ GST_PAD_PROBE_TYPE_EVENT_UPSTREAM,
+ (GstPadProbeCallback) rtprtxreceive_sinkpad_probe_check_drop,
+ &receive_rtxdata, NULL);
+ gst_object_unref (sinkpad);
+
g_signal_connect (bus, "message::error",
- (GCallback) message_received_multiple, bin);
+ (GCallback) message_received_multiple, NULL);
g_signal_connect (bus, "message::warning",
- (GCallback) message_received_multiple, bin);
- g_signal_connect (bus, "message::eos", (GCallback) message_received_multiple,
- bin);
+ (GCallback) message_received_multiple, NULL);
for (drop_every_n_packets = 2; drop_every_n_packets < 10;
drop_every_n_packets++) {
- nb_eos = 0;
start_test_drop_multiple_and_check_results (bin, send_rtxdata_list,
&receive_rtxdata, drop_every_n_packets);
}
/* cleanup */
- g_main_loop_unref (main_loop);
g_list_free_full (send_rtxdata_list, free_rtx_send_data);
g_hash_table_destroy (receive_rtxdata.ssrc_to_nb_packets_map);
@@ -1075,8 +1108,6 @@ GST_START_TEST (test_drop_multiple_sender)
gst_bus_remove_signal_watch (bus);
gst_object_unref (bus);
gst_object_unref (bin);
-
- g_mutex_clear (&lock_eos);
}
GST_END_TEST;
@@ -1269,10 +1300,9 @@ test_rtxsender_packet_retention (gboolean test_with_time)
* to actually retransmit something */
if (j >= MAX (i - half_buffers, 1)) {
guint64 end_time = g_get_monotonic_time () + G_TIME_SPAN_SECOND;
- do
- res = g_cond_wait_until (&check_cond, &check_mutex, end_time);
- while (res == TRUE && last_out_buffer == g_list_last (buffers));
- fail_unless_equals_int (res, TRUE);
+
+ while (last_out_buffer == g_list_last (buffers))
+ fail_unless (g_cond_wait_until (&check_cond, &check_mutex, end_time));
}
g_mutex_unlock (&check_mutex);
}
diff --git a/tests/check/elements/rtpsession.c b/tests/check/elements/rtpsession.c
index 8f4049f4..41408902 100644
--- a/tests/check/elements/rtpsession.c
+++ b/tests/check/elements/rtpsession.c
@@ -404,6 +404,161 @@ GST_START_TEST (test_multiple_senders_roundrobin_rbs)
GST_END_TEST;
+static void
+crank_rtcp_thread (TestData * data, GstClockTime * time, GstClockID * id)
+{
+ gint queue_length;
+
+ queue_length = g_async_queue_length (data->rtcp_queue);
+ do {
+ *time = gst_clock_id_get_time (*id);
+ GST_DEBUG ("Advancing time to %" GST_TIME_FORMAT, GST_TIME_ARGS (*time));
+ if (*time > gst_clock_get_time (data->clock))
+ gst_test_clock_set_time (GST_TEST_CLOCK (data->clock), *time);
+ fail_unless_equals_pointer (gst_test_clock_process_next_clock_id
+ (GST_TEST_CLOCK (data->clock)), *id);
+
+ /* wait for the RTCP pad thread to output its data
+ * and start waiting on the next timeout */
+ gst_test_clock_wait_for_next_pending_id (GST_TEST_CLOCK (data->clock), id);
+
+ /* and retry as long as there are no new RTCP packets out,
+ * because the RTCP thread may randomly decide to reschedule
+ * the RTCP timeout for later */
+ } while (g_async_queue_length (data->rtcp_queue) == queue_length);
+}
+
+GST_START_TEST (test_internal_sources_timeout)
+{
+ TestData data;
+ GstClockID id;
+ GstClockTime time;
+ GObject *internal_session;
+ guint internal_ssrc;
+ guint32 ssrc;
+ GstBuffer *buf;
+ GstRTCPBuffer rtcp = GST_RTCP_BUFFER_INIT;
+ GstRTCPPacket rtcp_packet;
+ GstFlowReturn res;
+ gint i, j;
+
+ setup_testharness (&data, TRUE);
+ g_object_get (data.session, "internal-session", &internal_session, NULL);
+ g_object_set (internal_session, "internal-ssrc", 0xDEADBEEF, NULL);
+
+ /* only the RTCP thread waits on the clock */
+ gst_test_clock_wait_for_next_pending_id (GST_TEST_CLOCK (data.clock), &id);
+
+ /* crank the RTCP pad thread until it creates a RR for its internal-ssrc
+ * source, since we have not pushed any RTP packets and it doesn't have
+ * any other source available */
+ crank_rtcp_thread (&data, &time, &id);
+
+ g_object_get (internal_session, "internal-ssrc", &internal_ssrc, NULL);
+ g_assert_cmpint (internal_ssrc, ==, 0xDEADBEEF);
+
+ /* verify that rtpsession has sent RR for an internally-created
+ * RTPSource that is using the internal-ssrc */
+ buf = g_async_queue_pop (data.rtcp_queue);
+ g_assert (buf != NULL);
+ g_assert (gst_rtcp_buffer_validate (buf));
+ gst_rtcp_buffer_map (buf, GST_MAP_READ, &rtcp);
+ g_assert (gst_rtcp_buffer_get_first_packet (&rtcp, &rtcp_packet));
+ g_assert_cmpint (gst_rtcp_packet_get_type (&rtcp_packet), ==,
+ GST_RTCP_TYPE_RR);
+ ssrc = gst_rtcp_packet_rr_get_ssrc (&rtcp_packet);
+ g_assert_cmpint (ssrc, ==, internal_ssrc);
+ gst_rtcp_buffer_unmap (&rtcp);
+ gst_buffer_unref (buf);
+
+ /* ok, now let's push some RTP packets */
+ for (i = 1; i < 4; i++) {
+ gst_test_clock_advance_time (GST_TEST_CLOCK (data.clock),
+ 200 * GST_MSECOND);
+ buf =
+ generate_test_buffer (time + i * 200 * GST_MSECOND, FALSE, i, i * 200,
+ 0x01BADBAD);
+ res = gst_pad_push (data.src, buf);
+ fail_unless (res == GST_FLOW_OK || res == GST_FLOW_FLUSHING);
+ }
+
+ /* internal ssrc must have changed already */
+ g_object_get (internal_session, "internal-ssrc", &internal_ssrc, NULL);
+ g_assert_cmpint (ssrc, !=, internal_ssrc);
+ g_assert_cmpint (internal_ssrc, ==, 0x01BADBAD);
+
+ /* wait for SR */
+ crank_rtcp_thread (&data, &time, &id);
+
+ /* verify SR and RR */
+ j = 0;
+ for (i = 0; i < 2; i++) {
+ buf = g_async_queue_pop (data.rtcp_queue);
+ g_assert (buf != NULL);
+ g_assert (gst_rtcp_buffer_validate (buf));
+ gst_rtcp_buffer_map (buf, GST_MAP_READ, &rtcp);
+ g_assert (gst_rtcp_buffer_get_first_packet (&rtcp, &rtcp_packet));
+ if (gst_rtcp_packet_get_type (&rtcp_packet) == GST_RTCP_TYPE_SR) {
+ gst_rtcp_packet_sr_get_sender_info (&rtcp_packet, &ssrc, NULL, NULL, NULL,
+ NULL);
+ g_assert_cmpint (ssrc, ==, internal_ssrc);
+ g_assert_cmpint (ssrc, ==, 0x01BADBAD);
+ j |= 0x1;
+ } else if (gst_rtcp_packet_get_type (&rtcp_packet) == GST_RTCP_TYPE_RR) {
+ ssrc = gst_rtcp_packet_rr_get_ssrc (&rtcp_packet);
+ g_assert_cmpint (ssrc, !=, internal_ssrc);
+ g_assert_cmpint (ssrc, ==, 0xDEADBEEF);
+ j |= 0x2;
+ }
+ gst_rtcp_buffer_unmap (&rtcp);
+ gst_buffer_unref (buf);
+ }
+ g_assert_cmpint (j, ==, 0x3); /* verify we got both SR and RR */
+
+ /* go 30 seconds in the future and observe both sources timing out:
+ * 0xDEADBEEF -> BYE, 0x01BADBAD -> becomes receiver only */
+ gst_test_clock_advance_time (GST_TEST_CLOCK (data.clock), 30 * GST_SECOND);
+ crank_rtcp_thread (&data, &time, &id);
+
+ /* verify BYE and RR */
+ j = 0;
+ for (i = 0; i < 2; i++) {
+ buf = g_async_queue_pop (data.rtcp_queue);
+ g_assert (buf != NULL);
+ g_assert (gst_rtcp_buffer_validate (buf));
+ gst_rtcp_buffer_map (buf, GST_MAP_READ, &rtcp);
+
+ g_assert (gst_rtcp_buffer_get_first_packet (&rtcp, &rtcp_packet));
+ g_assert_cmpint (gst_rtcp_packet_get_type (&rtcp_packet), ==,
+ GST_RTCP_TYPE_RR);
+ ssrc = gst_rtcp_packet_rr_get_ssrc (&rtcp_packet);
+ if (ssrc == 0x01BADBAD) {
+ j |= 0x1;
+ g_assert_cmpint (ssrc, ==, internal_ssrc);
+ /* 2 => RR, SDES. There is no BYE here */
+ g_assert_cmpint (gst_rtcp_buffer_get_packet_count (&rtcp), ==, 2);
+ } else if (ssrc == 0xDEADBEEF) {
+ j |= 0x2;
+ g_assert_cmpint (ssrc, !=, internal_ssrc);
+ /* 3 => RR, SDES, BYE */
+ g_assert_cmpint (gst_rtcp_buffer_get_packet_count (&rtcp), ==, 3);
+ g_assert (gst_rtcp_packet_move_to_next (&rtcp_packet));
+ g_assert (gst_rtcp_packet_move_to_next (&rtcp_packet));
+ g_assert_cmpint (gst_rtcp_packet_get_type (&rtcp_packet), ==,
+ GST_RTCP_TYPE_BYE);
+ }
+
+ gst_rtcp_buffer_unmap (&rtcp);
+ gst_buffer_unref (buf);
+ }
+ g_assert_cmpint (j, ==, 0x3); /* verify we got both BYE and RR */
+
+ g_object_unref (internal_session);
+ destroy_testharness (&data);
+}
+
+GST_END_TEST;
+
static Suite *
gstrtpsession_suite (void)
{
@@ -413,6 +568,7 @@ gstrtpsession_suite (void)
suite_add_tcase (s, tc_chain);
tcase_add_test (tc_chain, test_multiple_ssrc_rr);
tcase_add_test (tc_chain, test_multiple_senders_roundrobin_rbs);
+ tcase_add_test (tc_chain, test_internal_sources_timeout);
return s;
}
diff --git a/tests/check/elements/shapewipe.c b/tests/check/elements/shapewipe.c
index e68d38bd..ab90084c 100644
--- a/tests/check/elements/shapewipe.c
+++ b/tests/check/elements/shapewipe.c
@@ -95,16 +95,13 @@ GST_START_TEST (test_general)
myvideosrcpad =
gst_pad_new_from_static_template (&videosrctemplate, "videosrc");
gst_element_add_pad (videosrc, myvideosrcpad);
- gst_pad_set_active (myvideosrcpad, TRUE);
mymasksrcpad = gst_pad_new_from_static_template (&masksrctemplate, "masksrc");
gst_element_add_pad (masksrc, mymasksrcpad);
- gst_pad_set_active (mymasksrcpad, TRUE);
mysinkpad = gst_pad_new_from_static_template (&sinktemplate, "sink");
gst_element_add_pad (sink, mysinkpad);
gst_pad_set_chain_function (mysinkpad, on_chain);
- gst_pad_set_active (mysinkpad, TRUE);
p = gst_element_get_static_pad (shapewipe, "video_sink");
fail_unless (gst_pad_link (myvideosrcpad, p) == GST_PAD_LINK_OK);
diff --git a/tests/check/elements/souphttpsrc.c b/tests/check/elements/souphttpsrc.c
index 4a275d5d..4df32208 100644
--- a/tests/check/elements/souphttpsrc.c
+++ b/tests/check/elements/souphttpsrc.c
@@ -27,17 +27,10 @@
#include <glib.h>
#include <glib/gprintf.h>
-#include <libsoup/soup-address.h>
-#include <libsoup/soup-message.h>
-#include <libsoup/soup-misc.h>
-#include <libsoup/soup-server.h>
-#include <libsoup/soup-auth-domain.h>
-#include <libsoup/soup-auth-domain-basic.h>
-#include <libsoup/soup-auth-domain-digest.h>
-#include <libsoup/soup-version.h>
+#include <libsoup/soup.h>
#include <gst/check/gstcheck.h>
-#if !(SOUP_CHECK_VERSION(2, 44, 0))
+#if !defined(SOUP_MINOR_VERSION) || SOUP_MINOR_VERSION < 44
#define SoupStatus SoupKnownStatusCode
#endif
diff --git a/tests/examples/Makefile.in b/tests/examples/Makefile.in
index 0083c25d..f09f4bd0 100644
--- a/tests/examples/Makefile.in
+++ b/tests/examples/Makefile.in
@@ -107,6 +107,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/tests/examples/audiofx/Makefile.in b/tests/examples/audiofx/Makefile.in
index 13e4496f..86da4ffd 100644
--- a/tests/examples/audiofx/Makefile.in
+++ b/tests/examples/audiofx/Makefile.in
@@ -105,6 +105,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/tests/examples/cairo/Makefile.in b/tests/examples/cairo/Makefile.in
index 930c099e..d5c8f9cc 100644
--- a/tests/examples/cairo/Makefile.in
+++ b/tests/examples/cairo/Makefile.in
@@ -104,6 +104,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/tests/examples/equalizer/Makefile.in b/tests/examples/equalizer/Makefile.in
index f5f983d2..d9f0da42 100644
--- a/tests/examples/equalizer/Makefile.in
+++ b/tests/examples/equalizer/Makefile.in
@@ -104,6 +104,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/tests/examples/jack/Makefile.in b/tests/examples/jack/Makefile.in
index ea21769e..27e83ff1 100644
--- a/tests/examples/jack/Makefile.in
+++ b/tests/examples/jack/Makefile.in
@@ -104,6 +104,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/tests/examples/level/Makefile.in b/tests/examples/level/Makefile.in
index 58248d71..c6b6def7 100644
--- a/tests/examples/level/Makefile.in
+++ b/tests/examples/level/Makefile.in
@@ -104,6 +104,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/tests/examples/pulse/Makefile.in b/tests/examples/pulse/Makefile.in
index 9a2e895d..eb04e1f6 100644
--- a/tests/examples/pulse/Makefile.in
+++ b/tests/examples/pulse/Makefile.in
@@ -104,6 +104,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/tests/examples/rtp/Makefile.in b/tests/examples/rtp/Makefile.in
index e631999d..04b5cd20 100644
--- a/tests/examples/rtp/Makefile.in
+++ b/tests/examples/rtp/Makefile.in
@@ -106,6 +106,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/tests/examples/shapewipe/Makefile.in b/tests/examples/shapewipe/Makefile.in
index 5a734000..b0a3c363 100644
--- a/tests/examples/shapewipe/Makefile.in
+++ b/tests/examples/shapewipe/Makefile.in
@@ -105,6 +105,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/tests/examples/spectrum/Makefile.in b/tests/examples/spectrum/Makefile.in
index 670f38f7..2f97d6cc 100644
--- a/tests/examples/spectrum/Makefile.in
+++ b/tests/examples/spectrum/Makefile.in
@@ -106,6 +106,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/tests/examples/v4l2/Makefile.in b/tests/examples/v4l2/Makefile.in
index f7f1b9be..17685213 100644
--- a/tests/examples/v4l2/Makefile.in
+++ b/tests/examples/v4l2/Makefile.in
@@ -104,6 +104,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/tests/files/Makefile.in b/tests/files/Makefile.in
index 7dc2e320..cc741015 100644
--- a/tests/files/Makefile.in
+++ b/tests/files/Makefile.in
@@ -101,6 +101,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/tests/icles/Makefile.in b/tests/icles/Makefile.in
index f878d195..a07c4a27 100644
--- a/tests/icles/Makefile.in
+++ b/tests/icles/Makefile.in
@@ -107,6 +107,7 @@ am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
$(top_srcdir)/common/m4/gst-platform.m4 \
$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
$(top_srcdir)/common/m4/gst-plugindir.m4 \
+ $(top_srcdir)/common/m4/gst-x11.m4 \
$(top_srcdir)/common/m4/gst.m4 \
$(top_srcdir)/common/m4/gtk-doc.m4 \
$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
diff --git a/win32/common/config.h b/win32/common/config.h
index 1728c6a3..e69e143e 100644
--- a/win32/common/config.h
+++ b/win32/common/config.h
@@ -58,7 +58,7 @@
#define GST_PACKAGE_ORIGIN "Unknown package origin"
/* GStreamer package release date/time for plugins as YYYY-MM-DD */
-#define GST_PACKAGE_RELEASE_DATETIME "2014-05-03"
+#define GST_PACKAGE_RELEASE_DATETIME "2014-05-21"
/* Define if static plugins should be built */
#undef GST_PLUGIN_BUILD_STATIC
@@ -372,7 +372,7 @@
#define PACKAGE_NAME "GStreamer Good Plug-ins"
/* Define to the full name and version of this package. */
-#define PACKAGE_STRING "GStreamer Good Plug-ins 1.3.1"
+#define PACKAGE_STRING "GStreamer Good Plug-ins 1.3.2"
/* Define to the one symbol short name of this package. */
#define PACKAGE_TARNAME "gst-plugins-good"
@@ -381,7 +381,7 @@
#undef PACKAGE_URL
/* Define to the version of this package. */
-#define PACKAGE_VERSION "1.3.1"
+#define PACKAGE_VERSION "1.3.2"
/* directory where plugins are located */
#ifdef _DEBUG
@@ -415,7 +415,7 @@
#undef TARGET_CPU
/* Version number of package */
-#define VERSION "1.3.1"
+#define VERSION "1.3.2"
/* old wavpack API */
#undef WAVPACK_OLD_API