From 26c075e6a77c34b6e4017133a895b3473e9d1265 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= <sebastian@centricular.com>
Date: Wed, 21 May 2014 12:35:11 +0200
Subject: [PATCH] Imported Upstream version 1.3.2

---
 ChangeLog                                     | 1260 ++++++++++++-
 Makefile.in                                   |    1 +
 NEWS                                          |   18 +-
 RELEASE                                       |  177 +-
 aclocal.m4                                    |    1 +
 common/Makefile.in                            |    1 +
 common/m4/Makefile.in                         |    1 +
 configure                                     |   58 +-
 configure.ac                                  |   32 +-
 docs/Makefile.in                              |    1 +
 docs/plugins/Makefile.in                      |    1 +
 .../gst-plugins-good-plugins.hierarchy        |    2 +
 .../gst-plugins-good-plugins-plugin-1394.html |    2 +-
 ...st-plugins-good-plugins-plugin-aasink.html |    2 +-
 .../gst-plugins-good-plugins-plugin-alaw.html |    2 +-
 ...gst-plugins-good-plugins-plugin-alpha.html |    2 +-
 ...lugins-good-plugins-plugin-alphacolor.html |    2 +-
 ...st-plugins-good-plugins-plugin-apetag.html |    2 +-
 ...t-plugins-good-plugins-plugin-audiofx.html |    2 +-
 ...t-plugins-good-plugins-plugin-auparse.html |    2 +-
 ...lugins-good-plugins-plugin-autodetect.html |    2 +-
 .../gst-plugins-good-plugins-plugin-avi.html  |    2 +-
 ...-plugins-good-plugins-plugin-cacasink.html |    2 +-
 ...gst-plugins-good-plugins-plugin-cairo.html |    2 +-
 ...st-plugins-good-plugins-plugin-cutter.html |    2 +-
 ...gst-plugins-good-plugins-plugin-debug.html |    2 +-
 ...ugins-good-plugins-plugin-deinterlace.html |    2 +-
 .../gst-plugins-good-plugins-plugin-dtmf.html |    2 +-
 .../gst-plugins-good-plugins-plugin-dv.html   |    2 +-
 ...t-plugins-good-plugins-plugin-effectv.html |    2 +-
 ...plugins-good-plugins-plugin-equalizer.html |    2 +-
 .../gst-plugins-good-plugins-plugin-flac.html |    2 +-
 .../gst-plugins-good-plugins-plugin-flv.html  |    2 +-
 ...st-plugins-good-plugins-plugin-flxdec.html |    2 +-
 ...plugins-good-plugins-plugin-gdkpixbuf.html |    2 +-
 .../gst-plugins-good-plugins-plugin-goom.html |    2 +-
 ...t-plugins-good-plugins-plugin-goom2k1.html |    2 +-
 ...-plugins-good-plugins-plugin-icydemux.html |    2 +-
 ...-plugins-good-plugins-plugin-id3demux.html |    2 +-
 ...ugins-good-plugins-plugin-imagefreeze.html |    2 +-
 ...lugins-good-plugins-plugin-interleave.html |    2 +-
 ...st-plugins-good-plugins-plugin-isomp4.html |    2 +-
 .../gst-plugins-good-plugins-plugin-jack.html |    2 +-
 .../gst-plugins-good-plugins-plugin-jpeg.html |    2 +-
 ...gst-plugins-good-plugins-plugin-level.html |    2 +-
 ...-plugins-good-plugins-plugin-matroska.html |    2 +-
 ...gst-plugins-good-plugins-plugin-mulaw.html |    2 +-
 ...plugins-good-plugins-plugin-multifile.html |    2 +-
 ...plugins-good-plugins-plugin-multipart.html |    2 +-
 ...ns-good-plugins-plugin-navigationtest.html |    2 +-
 .../gst-plugins-good-plugins-plugin-oss4.html |    2 +-
 ...-plugins-good-plugins-plugin-ossaudio.html |    2 +-
 .../gst-plugins-good-plugins-plugin-png.html  |    2 +-
 ...lugins-good-plugins-plugin-pulseaudio.html |    2 +-
 ...lugins-good-plugins-plugin-replaygain.html |    2 +-
 .../gst-plugins-good-plugins-plugin-rtp.html  |    2 +-
 ...lugins-good-plugins-plugin-rtpmanager.html |    2 +-
 .../gst-plugins-good-plugins-plugin-rtsp.html |    2 +-
 ...plugins-good-plugins-plugin-shapewipe.html |    2 +-
 ...lugins-good-plugins-plugin-shout2send.html |    2 +-
 ...gst-plugins-good-plugins-plugin-smpte.html |    2 +-
 .../gst-plugins-good-plugins-plugin-soup.html |    2 +-
 ...-plugins-good-plugins-plugin-spectrum.html |    2 +-
 ...gst-plugins-good-plugins-plugin-speex.html |    2 +-
 ...st-plugins-good-plugins-plugin-taglib.html |    2 +-
 .../gst-plugins-good-plugins-plugin-udp.html  |    2 +-
 ...gins-good-plugins-plugin-video4linux2.html |    2 +-
 ...-plugins-good-plugins-plugin-videobox.html |    2 +-
 ...plugins-good-plugins-plugin-videocrop.html |    2 +-
 ...ugins-good-plugins-plugin-videofilter.html |    2 +-
 ...lugins-good-plugins-plugin-videomixer.html |    2 +-
 .../gst-plugins-good-plugins-plugin-vpx.html  |    2 +-
 ...st-plugins-good-plugins-plugin-wavenc.html |    2 +-
 ...t-plugins-good-plugins-plugin-wavpack.html |    2 +-
 ...-plugins-good-plugins-plugin-wavparse.html |    2 +-
 ...plugins-good-plugins-plugin-ximagesrc.html |    2 +-
 ...st-plugins-good-plugins-plugin-y4menc.html |    2 +-
 .../html/gst-plugins-good-plugins-rtpbin.html |    2 +-
 .../gst-plugins-good-plugins-v4l2sink.html    |    2 +-
 .../gst-plugins-good-plugins-v4l2src.html     |    2 +-
 docs/plugins/html/index.html                  |    2 +-
 docs/plugins/inspect/plugin-1394.xml          |    2 +-
 docs/plugins/inspect/plugin-aasink.xml        |    2 +-
 docs/plugins/inspect/plugin-alaw.xml          |    2 +-
 docs/plugins/inspect/plugin-alpha.xml         |    2 +-
 docs/plugins/inspect/plugin-alphacolor.xml    |    2 +-
 docs/plugins/inspect/plugin-apetag.xml        |    2 +-
 docs/plugins/inspect/plugin-audiofx.xml       |    2 +-
 docs/plugins/inspect/plugin-audioparsers.xml  |    2 +-
 docs/plugins/inspect/plugin-auparse.xml       |    2 +-
 docs/plugins/inspect/plugin-autodetect.xml    |    2 +-
 docs/plugins/inspect/plugin-avi.xml           |    2 +-
 docs/plugins/inspect/plugin-cacasink.xml      |    2 +-
 docs/plugins/inspect/plugin-cairo.xml         |    2 +-
 docs/plugins/inspect/plugin-cutter.xml        |    2 +-
 docs/plugins/inspect/plugin-debug.xml         |    2 +-
 docs/plugins/inspect/plugin-deinterlace.xml   |    2 +-
 docs/plugins/inspect/plugin-dtmf.xml          |    2 +-
 docs/plugins/inspect/plugin-dv.xml            |    2 +-
 docs/plugins/inspect/plugin-effectv.xml       |    2 +-
 docs/plugins/inspect/plugin-equalizer.xml     |    2 +-
 docs/plugins/inspect/plugin-flac.xml          |    2 +-
 docs/plugins/inspect/plugin-flv.xml           |    2 +-
 docs/plugins/inspect/plugin-flxdec.xml        |    2 +-
 docs/plugins/inspect/plugin-gdkpixbuf.xml     |    2 +-
 docs/plugins/inspect/plugin-goom.xml          |    2 +-
 docs/plugins/inspect/plugin-goom2k1.xml       |    2 +-
 docs/plugins/inspect/plugin-icydemux.xml      |    2 +-
 docs/plugins/inspect/plugin-id3demux.xml      |    2 +-
 docs/plugins/inspect/plugin-imagefreeze.xml   |    2 +-
 docs/plugins/inspect/plugin-interleave.xml    |    2 +-
 docs/plugins/inspect/plugin-isomp4.xml        |    2 +-
 docs/plugins/inspect/plugin-jack.xml          |    2 +-
 docs/plugins/inspect/plugin-jpeg.xml          |    2 +-
 docs/plugins/inspect/plugin-level.xml         |    2 +-
 docs/plugins/inspect/plugin-matroska.xml      |    2 +-
 docs/plugins/inspect/plugin-mulaw.xml         |    2 +-
 docs/plugins/inspect/plugin-multifile.xml     |    2 +-
 docs/plugins/inspect/plugin-multipart.xml     |    2 +-
 .../plugins/inspect/plugin-navigationtest.xml |    2 +-
 docs/plugins/inspect/plugin-oss4.xml          |    2 +-
 docs/plugins/inspect/plugin-ossaudio.xml      |    2 +-
 docs/plugins/inspect/plugin-png.xml           |    2 +-
 docs/plugins/inspect/plugin-pulseaudio.xml    |    2 +-
 docs/plugins/inspect/plugin-replaygain.xml    |    2 +-
 docs/plugins/inspect/plugin-rtp.xml           |    2 +-
 docs/plugins/inspect/plugin-rtpmanager.xml    |    2 +-
 docs/plugins/inspect/plugin-rtsp.xml          |    2 +-
 docs/plugins/inspect/plugin-shapewipe.xml     |    2 +-
 docs/plugins/inspect/plugin-shout2send.xml    |    2 +-
 docs/plugins/inspect/plugin-smpte.xml         |    2 +-
 docs/plugins/inspect/plugin-soup.xml          |    2 +-
 docs/plugins/inspect/plugin-spectrum.xml      |    2 +-
 docs/plugins/inspect/plugin-speex.xml         |    2 +-
 docs/plugins/inspect/plugin-taglib.xml        |    2 +-
 docs/plugins/inspect/plugin-udp.xml           |    2 +-
 docs/plugins/inspect/plugin-video4linux2.xml  |    6 +-
 docs/plugins/inspect/plugin-videobox.xml      |    2 +-
 docs/plugins/inspect/plugin-videocrop.xml     |    2 +-
 docs/plugins/inspect/plugin-videofilter.xml   |    2 +-
 docs/plugins/inspect/plugin-videomixer.xml    |    2 +-
 docs/plugins/inspect/plugin-vpx.xml           |    2 +-
 docs/plugins/inspect/plugin-wavenc.xml        |    2 +-
 docs/plugins/inspect/plugin-wavpack.xml       |    2 +-
 docs/plugins/inspect/plugin-wavparse.xml      |    2 +-
 docs/plugins/inspect/plugin-ximagesrc.xml     |    2 +-
 docs/plugins/inspect/plugin-y4menc.xml        |    2 +-
 ext/Makefile.in                               |    1 +
 ext/aalib/Makefile.in                         |    1 +
 ext/cairo/Makefile.in                         |    1 +
 ext/dv/Makefile.in                            |    1 +
 ext/flac/Makefile.in                          |    1 +
 ext/flac/gstflacdec.c                         |   45 +-
 ext/gdk_pixbuf/Makefile.in                    |    1 +
 ext/jack/Makefile.in                          |    1 +
 ext/jpeg/Makefile.in                          |    1 +
 ext/libcaca/Makefile.in                       |    1 +
 ext/libpng/Makefile.in                        |    1 +
 ext/pulse/Makefile.in                         |    1 +
 ext/pulse/pulsedevicemonitor.c                |   25 +-
 ext/pulse/pulsedevicemonitor.h                |    1 +
 ext/raw1394/Makefile.in                       |    1 +
 ext/shout2/Makefile.in                        |    1 +
 ext/soup/Makefile.in                          |    1 +
 ext/soup/gstsouphttpsrc.c                     |   50 +-
 ext/speex/Makefile.in                         |    1 +
 ext/taglib/Makefile.in                        |    1 +
 ext/vpx/Makefile.in                           |    1 +
 ext/vpx/gstvp8enc.c                           |    8 +-
 ext/vpx/gstvp9enc.c                           |   26 +-
 ext/wavpack/Makefile.in                       |    1 +
 gst-plugins-good.doap                         |   10 +
 gst-plugins-good.spec                         |    2 +-
 gst/Makefile.in                               |    1 +
 gst/alpha/Makefile.in                         |    1 +
 gst/apetag/Makefile.in                        |    1 +
 gst/audiofx/Makefile.in                       |    1 +
 gst/audiofx/audiopanoramaorc-dist.c           |   36 +-
 gst/audioparsers/Makefile.in                  |    1 +
 gst/audioparsers/gstflacparse.c               |    7 +-
 gst/auparse/Makefile.in                       |    1 +
 gst/autodetect/Makefile.in                    |    1 +
 gst/avi/Makefile.in                           |    1 +
 gst/cutter/Makefile.in                        |    1 +
 gst/debugutils/Makefile.in                    |    1 +
 gst/debugutils/tests.c                        |    3 +-
 gst/deinterlace/Makefile.in                   |    1 +
 gst/deinterlace/tvtime-dist.c                 |    2 +-
 gst/dtmf/Makefile.in                          |    1 +
 gst/effectv/Makefile.in                       |    1 +
 gst/equalizer/Makefile.in                     |    1 +
 gst/flv/Makefile.in                           |    1 +
 gst/flv/gstflvdemux.c                         |   49 +-
 gst/flv/gstflvdemux.h                         |    1 +
 gst/flx/Makefile.in                           |    1 +
 gst/goom/Makefile.in                          |    1 +
 gst/goom/tentacle3d.c                         |    5 +-
 gst/goom2k1/Makefile.in                       |    1 +
 gst/icydemux/Makefile.in                      |    1 +
 gst/id3demux/Makefile.in                      |    1 +
 gst/imagefreeze/Makefile.in                   |    1 +
 gst/interleave/Makefile.in                    |    1 +
 gst/isomp4/Makefile.in                        |    1 +
 gst/isomp4/gstqtmux.c                         |    1 +
 gst/isomp4/qtdemux.c                          |   13 +-
 gst/law/Makefile.in                           |    1 +
 gst/level/Makefile.in                         |    1 +
 gst/matroska/Makefile.in                      |    1 +
 gst/matroska/ebml-write.c                     |    4 +-
 gst/matroska/matroska-mux.c                   |   19 +-
 gst/matroska/matroska-read-common.c           |   22 +-
 gst/monoscope/Makefile.in                     |    1 +
 gst/multifile/Makefile.in                     |    1 +
 gst/multipart/Makefile.in                     |    1 +
 gst/replaygain/Makefile.in                    |    1 +
 gst/rtp/Makefile.in                           |    1 +
 gst/rtp/README                                |   16 +-
 gst/rtpmanager/Makefile.in                    |    1 +
 gst/rtpmanager/gstrtpbin.c                    |    2 +-
 gst/rtpmanager/gstrtpjitterbuffer.c           |   18 +-
 gst/rtpmanager/gstrtpmux.c                    |    7 +-
 gst/rtpmanager/gstrtprtxreceive.c             |  104 +-
 gst/rtpmanager/gstrtprtxreceive.h             |    2 +
 gst/rtpmanager/rtpjitterbuffer.c              |   21 +-
 gst/rtpmanager/rtpsession.c                   |  140 +-
 gst/rtpmanager/rtpsession.h                   |    3 +
 gst/rtpmanager/rtpsource.c                    |  120 +-
 gst/rtpmanager/rtpsource.h                    |   13 +-
 gst/rtsp/Makefile.in                          |    1 +
 gst/rtsp/gstrtspsrc.c                         |    2 +-
 gst/shapewipe/Makefile.in                     |    1 +
 gst/smpte/Makefile.in                         |    1 +
 gst/spectrum/Makefile.in                      |    1 +
 gst/udp/Makefile.in                           |    1 +
 gst/videobox/Makefile.in                      |    1 +
 gst/videocrop/Makefile.in                     |    1 +
 gst/videofilter/Makefile.in                   |    1 +
 gst/videomixer/Makefile.in                    |    1 +
 gst/videomixer/videomixerorc-dist.c           |  206 +--
 gst/wavenc/Makefile.in                        |    1 +
 gst/wavparse/Makefile.in                      |    1 +
 gst/y4m/Makefile.in                           |    1 +
 m4/Makefile.in                                |    1 +
 pkgconfig/Makefile.in                         |    1 +
 po/af.gmo                                     |  Bin 666 -> 666 bytes
 po/af.po                                      |   14 +-
 po/az.gmo                                     |  Bin 723 -> 723 bytes
 po/az.po                                      |   14 +-
 po/bg.gmo                                     |  Bin 11149 -> 11149 bytes
 po/bg.po                                      |   16 +-
 po/ca.gmo                                     |  Bin 9124 -> 9124 bytes
 po/ca.po                                      |   17 +-
 po/cs.gmo                                     |  Bin 11134 -> 11000 bytes
 po/cs.po                                      |   16 +-
 po/da.gmo                                     |  Bin 10193 -> 10088 bytes
 po/da.po                                      |   16 +-
 po/de.gmo                                     |  Bin 11230 -> 11119 bytes
 po/de.po                                      |   16 +-
 po/el.gmo                                     |  Bin 11597 -> 11597 bytes
 po/el.po                                      |   15 +-
 po/en_GB.gmo                                  |  Bin 671 -> 671 bytes
 po/en_GB.po                                   |   14 +-
 po/eo.gmo                                     |  Bin 1328 -> 1328 bytes
 po/eo.po                                      |   14 +-
 po/es.gmo                                     |  Bin 9369 -> 9369 bytes
 po/es.po                                      |   17 +-
 po/eu.gmo                                     |  Bin 7626 -> 7626 bytes
 po/eu.po                                      |   17 +-
 po/fi.gmo                                     |  Bin 8041 -> 8041 bytes
 po/fi.po                                      |   15 +-
 po/fr.gmo                                     |  Bin 9222 -> 9222 bytes
 po/fr.po                                      |   17 +-
 po/gl.gmo                                     |  Bin 11055 -> 10938 bytes
 po/gl.po                                      |   16 +-
 po/gst-plugins-good-1.0.pot                   |  126 +-
 po/hr.gmo                                     |  Bin 8525 -> 8525 bytes
 po/hr.po                                      |   15 +-
 po/hu.gmo                                     |  Bin 11142 -> 11028 bytes
 po/hu.po                                      |   16 +-
 po/id.gmo                                     |  Bin 10210 -> 10106 bytes
 po/id.po                                      |   16 +-
 po/it.gmo                                     |  Bin 8539 -> 8539 bytes
 po/it.po                                      |   16 +-
 po/ja.gmo                                     |  Bin 12193 -> 12052 bytes
 po/ja.po                                      |   16 +-
 po/lt.gmo                                     |  Bin 7460 -> 7460 bytes
 po/lt.po                                      |   15 +-
 po/lv.gmo                                     |  Bin 10633 -> 10527 bytes
 po/lv.po                                      |   16 +-
 po/mt.gmo                                     |  Bin 5942 -> 5942 bytes
 po/mt.po                                      |   16 +-
 po/nb.gmo                                     |  Bin 10145 -> 10047 bytes
 po/nb.po                                      |   16 +-
 po/nl.gmo                                     |  Bin 10595 -> 10492 bytes
 po/nl.po                                      |   16 +-
 po/or.gmo                                     |  Bin 832 -> 832 bytes
 po/or.po                                      |   14 +-
 po/pl.gmo                                     |  Bin 11035 -> 10921 bytes
 po/pl.po                                      |   16 +-
 po/pt_BR.gmo                                  |  Bin 11035 -> 10921 bytes
 po/pt_BR.po                                   |   16 +-
 po/ro.gmo                                     |  Bin 8001 -> 8001 bytes
 po/ro.po                                      |   16 +-
 po/ru.gmo                                     |  Bin 14112 -> 13965 bytes
 po/ru.po                                      |   16 +-
 po/sk.gmo                                     |  Bin 10893 -> 10768 bytes
 po/sk.po                                      |   16 +-
 po/sl.gmo                                     |  Bin 10519 -> 10412 bytes
 po/sl.po                                      |   16 +-
 po/sq.gmo                                     |  Bin 685 -> 685 bytes
 po/sq.po                                      |   14 +-
 po/sr.gmo                                     |  Bin 13866 -> 13708 bytes
 po/sr.po                                      |   16 +-
 po/sv.gmo                                     |  Bin 8861 -> 8861 bytes
 po/sv.po                                      |   15 +-
 po/tr.gmo                                     |  Bin 9917 -> 9816 bytes
 po/tr.po                                      |   16 +-
 po/uk.gmo                                     |  Bin 14097 -> 13920 bytes
 po/uk.po                                      |   16 +-
 po/vi.gmo                                     |  Bin 12220 -> 12111 bytes
 po/vi.po                                      |   16 +-
 po/zh_CN.gmo                                  |  Bin 6295 -> 6295 bytes
 po/zh_CN.po                                   |   15 +-
 po/zh_HK.gmo                                  |  Bin 1571 -> 1571 bytes
 po/zh_HK.po                                   |   14 +-
 po/zh_TW.gmo                                  |  Bin 1570 -> 1570 bytes
 po/zh_TW.po                                   |   14 +-
 sys/Makefile.in                               |    1 +
 sys/directsound/Makefile.in                   |    1 +
 sys/oss/Makefile.in                           |    1 +
 sys/oss4/Makefile.in                          |    1 +
 sys/osxaudio/Makefile.in                      |    1 +
 sys/osxvideo/Makefile.in                      |    1 +
 sys/sunaudio/Makefile.in                      |    1 +
 sys/v4l2/Makefile.am                          |    6 +
 sys/v4l2/Makefile.in                          |   34 +
 sys/v4l2/gstv4l2.c                            |  162 +-
 sys/v4l2/gstv4l2allocator.c                   | 1396 +++++++++++++++
 sys/v4l2/gstv4l2allocator.h                   |  156 ++
 sys/v4l2/gstv4l2bufferpool.c                  | 1591 +++++++++--------
 sys/v4l2/gstv4l2bufferpool.h                  |   54 +-
 sys/v4l2/gstv4l2devicemonitor.c               |   32 +-
 sys/v4l2/gstv4l2object.c                      | 1290 ++++++++-----
 sys/v4l2/gstv4l2object.h                      |   43 +-
 sys/v4l2/gstv4l2sink.c                        |   83 +-
 sys/v4l2/gstv4l2src.c                         |   30 +-
 sys/v4l2/gstv4l2transform.c                   |  773 ++++++++
 sys/v4l2/gstv4l2transform.h                   |   84 +
 sys/v4l2/gstv4l2videodec.c                    |  371 ++--
 sys/v4l2/gstv4l2videodec.h                    |   10 +-
 sys/v4l2/v4l2-utils.c                         |  166 ++
 sys/v4l2/v4l2-utils.h                         |   50 +
 sys/v4l2/v4l2_calls.c                         |    3 +
 sys/v4l2/v4l2_calls.h                         |    4 +-
 sys/waveform/Makefile.in                      |    1 +
 sys/ximage/Makefile.in                        |    1 +
 tests/Makefile.in                             |    1 +
 tests/check/Makefile.in                       |    1 +
 tests/check/elements/rtpaux.c                 |   22 +-
 tests/check/elements/rtpcollision.c           |    8 +-
 tests/check/elements/rtpjitterbuffer.c        |  177 +-
 tests/check/elements/rtpmux.c                 |    4 +-
 tests/check/elements/rtprtx.c                 |  190 +-
 tests/check/elements/rtpsession.c             |  156 ++
 tests/check/elements/shapewipe.c              |    3 -
 tests/check/elements/souphttpsrc.c            |   11 +-
 tests/examples/Makefile.in                    |    1 +
 tests/examples/audiofx/Makefile.in            |    1 +
 tests/examples/cairo/Makefile.in              |    1 +
 tests/examples/equalizer/Makefile.in          |    1 +
 tests/examples/jack/Makefile.in               |    1 +
 tests/examples/level/Makefile.in              |    1 +
 tests/examples/pulse/Makefile.in              |    1 +
 tests/examples/rtp/Makefile.in                |    1 +
 tests/examples/shapewipe/Makefile.in          |    1 +
 tests/examples/spectrum/Makefile.in           |    1 +
 tests/examples/v4l2/Makefile.in               |    1 +
 tests/files/Makefile.in                       |    1 +
 tests/icles/Makefile.in                       |    1 +
 win32/common/config.h                         |    8 +-
 380 files changed, 7957 insertions(+), 2622 deletions(-)
 create mode 100644 sys/v4l2/gstv4l2allocator.c
 create mode 100644 sys/v4l2/gstv4l2allocator.h
 create mode 100644 sys/v4l2/gstv4l2transform.c
 create mode 100644 sys/v4l2/gstv4l2transform.h
 create mode 100644 sys/v4l2/v4l2-utils.c
 create mode 100644 sys/v4l2/v4l2-utils.h

diff --git a/ChangeLog b/ChangeLog
index 136ab1035..f9997d843 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 894ee4676..01c90974b 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 5fc86c82d..da4707eb7 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 30d759566..2e63499e6 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 ec7cfe1a8..e99353fe4 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 a48f40386..806bdf4ea 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 ef2bd77bd..0fe0d5051 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 a4838c48f..e9e8040fb 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 b31be2abc..17be4da37 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 d59161f66..48327087c 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 55dbc256b..690bba8b2 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 dfe885968..11075f7b7 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 a0b439850..cca2848bd 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 92cdca0c7..e5f9a1594 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 105e9f0ff..0fe3047b5 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 4fbcd378d..9a5055f22 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 af0684484..e53d974b6 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 0cf723cb9..e80dd3bc6 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 815621290..386f4e08e 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 0bcb675d6..2346d4df7 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 7f6e5d071..e956f6d66 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 1a98a2c55..18fe15e44 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 f97116f81..1da587053 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 b72c54930..e38b33209 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 50c96fa9d..3ac346c1e 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 27c1ac973..68f1d54e8 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 9341ad9e1..c6769fda7 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 ed5a4f5b7..1c793eda1 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 8742ebbeb..28a8a4a14 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 25872f455..13252854c 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 4187720bd..0b6ece21c 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 8250a2ee6..b99e8786f 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 bb28a2ea8..8a5acbfc5 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 67005ffaa..089cf092d 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 72496a630..a7e07c0b9 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 7f8aee8c3..c9e05349f 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 2a702aa02..f5f12a81c 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 a5ee98465..9a20dfe26 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 7e9db7e80..f27bebcf6 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 c975f7b85..2c75fe76c 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 725ba74d5..6b142623c 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 dac89672e..0dcc77a96 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 d90c1b052..eeeadda4e 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 44cbf7f06..b29252b0b 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 f65c5ad1e..40cd9bafd 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 f73f04e66..9705ee3d7 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 262c8d9ff..15a9642ba 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 1eb4482f8..074ecb058 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 d9072adb8..a9b1d96e3 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 def87fbe3..0c1968476 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 5f9db0d73..a100fb82e 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 0ff5ab28e..ecbf7c8af 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 833e2ee79..a4ae523fe 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 3443a87ef..dd575028b 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 0e2a2b6bf..adcbad2d7 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 4f58e14be..43f8077db 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 d8222e40b..9fbe16f5e 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 0488126f3..8ec448a48 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 db60d1faf..d2b546b41 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 cb2a76cd5..f35781cbd 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 8f89301a6..262d842b8 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 a1da43d85..2a922c876 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 68cf1ce65..3d79f2916 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 c753741f7..dfc720afa 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 acd62cb45..fcc71325a 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 e3323d9e4..78a30806c 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 195267907..ff881ee19 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 e6441a26c..e870e957b 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 4641104e2..a3ca90ac6 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 11faec2e8..86832770c 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 88d260dc6..5de1cc9c8 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 098951c3e..a36606e14 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 a092e7bed..c7e38aa7f 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 bc045a387..c9ec8ae06 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 872ff60bc..af68e0ef9 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 dd4ffd97c..1e98570db 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 c1b2d5164..7f85fd305 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 36b5d1dd9..93226dcc1 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 1cb0524b2..925069d95 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 0087ace8b..f90f3d287 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 bc272f043..6c68353ae 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 4c60e18cd..6d5b5083a 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 ab51066d7..7a8a86125 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 a32dbb81c..460e8d5b8 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 7f6c5a0ab..4f05ef59c 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 02f284a68..59ea3560b 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 fb04308ec..3441857e5 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 2da24ab13..c7329c01d 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 7a3bf28e2..34eb617f1 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 677bfeabd..d4efc2da9 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 962b7074b..fd32c1133 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 f03c50a5c..7b3810e82 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 7fa81fd0d..f1f2caa60 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 599998389..2da90e0b6 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 cb9691a1a..37803d907 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 3f845f46a..9d844f70b 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 3e6d61f67..97f3981ec 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 30d1c4fd1..929681908 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 5a516fb98..7a34a78c1 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 a0c087d38..290640f9e 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 013dafe4e..ae4a53f08 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 ab52b4f45..6121817ef 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 f0dd215c9..3fd91453e 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 27602f259..08088de1b 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 670429776..288e74ce0 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 0728eff88..947229cb3 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 070ad509a..5e97c0841 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 f90866f95..66c3cdf7e 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 1df22eb37..1fe4a1c20 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 895f22914..5dd77d559 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 eb688cbf4..951ff24a2 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 937eecb85..b1e074a6c 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 1deb50a32..0eaccd052 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 c4412d2c8..f3ac3f28e 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 6d36d51c2..fd0656216 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 93a70a464..93775db24 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 5e0e28ead..46525a995 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 c4554e52c..b3a6fa7ce 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 82dbf7fa1..14e937dfe 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 0af9cd2d1..ae5da569d 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 ec1054138..933a015c6 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 499f3ed41..25106a15b 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 ca0d4b39b..6d6858599 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 254ad244f..aeb3608e0 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 a9255efde..5c0fad57b 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 e628c7b06..4762cccfb 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 4d4b69e03..0f53304eb 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 431a76c6a..d2db80797 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 ffaa86dbd..0cf09999e 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 ea7de39b9..6e4f2c79b 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 880784c5d..148eaa942 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 57025b426..a6aaa5f13 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 731eeae79..fa2bc27e3 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 f782108d6..d548ee62e 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 f8bf15c81..e2df20f39 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 114731805..9a714dc61 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 e74cc81fc..6b7f2e1bd 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 490f960b6..cbaa0e131 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 f213c189b..55ff1fba5 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 a58165e89..916ae6095 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 0526574dc..4dde821fe 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 7338cb6ac..317fa3a37 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 59d0e4b57..8c585e4f5 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 8a22c04f7..37324dff3 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 b6784d564..a5a34f479 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 4b240e184..4452ef5e9 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 e7359a241..aa3ee5cc6 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 82643c0df..d0bc90b2a 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 6b9cf4fd3..11a3451f9 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 1635d8de6..0d13c0d37 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 96980447e..f1da88f24 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 3d06b3978..e0ec2fdf5 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 3537fc250..5de5bc0d5 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 b5cb7150b..91f130d20 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 8c8fa6ec4..0ecf69750 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 054d1afdf..833003db8 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 146933a3c..ac5b8e84f 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 2bba3fb25..88c9318cc 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 c19fb1a02..3d14c305f 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 83b88029d..b4ee81994 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 9d9070e23..100ba9b0a 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 61f7c934d..aa69dabbf 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 ea32c4be7..98bad5fd7 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 cc397cb07..8bf9b9c61 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 c1cb5424e..1ec661bb2 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 4b58dba3b..b268d348a 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 deab61823..f58d5df38 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 865c59876..7902d060f 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 5684e60c7..0271ffcd2 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 ea276f904..1b1531187 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 bc58205cd..31482e443 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 460ffae99..f2675771d 100644
--- a/gst-plugins-good.doap
+++ b/gst-plugins-good.doap
@@ -32,6 +32,16 @@ the plug-in code, LGPL or LGPL-compatible for the supporting library).
    </GitRepository>
  </repository> 
 
+ <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>
diff --git a/gst-plugins-good.spec b/gst-plugins-good.spec
index e00ed7316..2b25b333c 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 be704f80a..21be6a387 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 77080afda..617d10539 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 e84b96616..37593d1fb 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 3bb7b729f..298be4b0a 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 12d6aa0e8..3d5999a61 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 a7236ac2e..c17158054 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 cb7a39ec2..d36693b47 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 c89bf0c61..c1f048437 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 1db2a5116..59821f372 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 eb5c58b03..2fc49609a 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 0695f0434..a84fd74b3 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 2a5b5ac69..8271893e2 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 d318664a9..9ca2af90c 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 052094b49..4717f6eac 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 8e8698242..b121c010a 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 be6dbcb1d..d77136084 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 dfcf836f9..c21ddb001 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 d7fcbf6d4..304fd4efc 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 6944697f3..ce40c604b 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 c058fda21..212d18a32 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 90953b4a6..79a8902ea 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 aaa1e776d..f21764e00 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 6e006ad52..f4c20b875 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 2abe42fc2..f82ffba38 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 7f6d5aa7a..2847492c4 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 c8c88fd27..623dcc4d8 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 bc4d5c7d3..2e99241d0 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 1d7002f3e..a063ed1c8 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 c138a79dc..66c84a9c8 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 926964252..8a41c815a 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 b33904168..08aa05c6c 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 613edad57..53847c002 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 fc3262531..b895b255e 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 6cfee3e8a..1f8931c31 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 d1642686b..74f0d2abd 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 138f470c5..08868dbc4 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 1009bd3ab..76328fc0e 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 da7072071..ae5ea463a 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 86f0d9b72..a3ac565f2 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 878e345fd..2294fbb25 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 9a3d8f3f0..013bb870e 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 1111c8d82..11f7d05a1 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 00bb06044..846094195 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 94549d703..5042bd544 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 743fe2aef..0620d7879 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 a087c462f..9cc7d6ef0 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 1459e91c5..9e454928d 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 1fdfad54c..4cd06ab91 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 bb0f7e439..52f6b017c 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 c6b9cdf4e..cf6c4a9f5 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 1f05cd41c..19a1ef366 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 c29427243..7e2aa0af4 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 87388aec5..b567ee46a 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 9a56955c6..d47c85fb3 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 9af7d8ace..ed4adc9a9 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 98c1eab32..ff558301e 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 ae875bf81..ffb0dee14 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 ec7c3aabf..6968f5d88 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 96a4b5b60..53e199fb0 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 56fa9bd68..5f19f69c3 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 5c9f98b7c..e0b028d2c 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 4720f26bc..d64a451ab 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 98894afaa..d74a0ec70 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 6792d5682..1f419d1ad 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 2cc893eca..7f59ab7ed 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 b8002c758..05c186377 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 0b7be5214..142aa8c00 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 e8204b0c4..568ca4f89 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 a9f376120..8ec8dfe38 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 fb266b54e..16fdaec33 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 6b75f643c..20e6c7dd7 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 1cc87eebe10bcc4bedadef435c7f5fef40580969..74c7195ad9fa9e4347b2b5d57e677a09940ddd47 100644
GIT binary patch
delta 20
bcmbQmI*WCK4<oygp@N~2mEq=KMt4R4IF<zC

delta 20
bcmbQmI*WCK4<oyQv4Ww6mBHp<Mt4R4IKBkv

diff --git a/po/af.po b/po/af.po
index aa419775c..7dde409af 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 f434577adab368376be60320a4b44a37497d1287..7233630ad6a0aa90cda9c144543c0e0b34d3dc0e 100644
GIT binary patch
delta 20
bcmcc2dYN^D4<oygp@N~2mEq=K#s)?JL4E~}

delta 20
bcmcc2dYN^D4<oyQv4Ww6mBHp<#s)?JL8b+h

diff --git a/po/az.po b/po/az.po
index 21da434ec..edf7b4fe9 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 3b4eac07bd20edfc92f8bc0e890d68b14b640104..2c7b118759e4f6858e21435b7d2abdcc365c6628 100644
GIT binary patch
delta 20
bcmeAT?+xFOD8z1Ls9<PhWw<#*NL3O5M6?C3

delta 20
bcmeAT?+xFOD8z1HtYBziWw1FzNL3O5MBD|m

diff --git a/po/bg.po b/po/bg.po
index 181751f56..cb34d69b7 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 8a077ce099f287d303e812e82385749de97147ce..42f33e60e8c52044aeca612875f7c57f3813def9 100644
GIT binary patch
delta 20
bcmZ4DzQlb)q7b{0p@N~2mEq<LAsayeMg#@S

delta 20
bcmZ4DzQlb)q7b`*v4Ww6mBHo=AsayeMl1!<

diff --git a/po/ca.po b/po/ca.po
index d67ca4645..bd5467dc6 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 0943c50372cd4f9e810d5e5f810ca6c3b63f256c..3c80eb4f42f8cafabaaca45cf55fd6ccfdaee5f9 100644
GIT binary patch
delta 1542
zcmXZcYiN~a902g=g!8!8ZfY~r=~?Avn^Vs`Uf4XfRymbg1?em?@IzLF!IB^)Iv_}3
zXvASc7aM*Er3(}iR$w2rivx=YQZOooASLrlT7e+_{+#!)o!|3+ch2+vFVDLh8~@u-
z`E}}~vE;Sc?`*$UZ%V1c({<jwPUTa&g%e!QGn~Q>Z}seA#HB1Q^H%W?TeyX>@AI6)
z*LXMIXDM!V$)d@HId+@H9(Hma7jOsX^X=^V32qc$<|yyGIi(SP$}ToGq_l~vxQuTw
zZu~Xx<nQd|6jgOasr?qyT-e6DxQp?@aYjNX+0Ea$l?{z4E#!9I!2^s9Kj$J|W_)j^
zs_y4<4sjRP@&s3~p;-da>OqSlw=*^x=VJbt#W{V9N=l3bpWy)aW%2ing#YF|&S-U0
zmN|(#s9EVHDn9MzOzvkTGCg83m0vMtcb3MS{-WumYt-FzBfDPj!?95-qmp(W;A4D&
ze{u<*)K<+%`?-|wF!uY7k<giG`ajp=ybA@U>9qtpsQ9#!_i%{)e3h}$Nygc@%0AAP
zb<BQ*J=~qeA2TZbnag;MliAsp(v_UO+VtNZY3^;cS(O--?PO%WCyT3DJkIFYN1VY4
z#tkp9z-D)gnJ;B@=0$2+`jBx}zGQUf0#~!Oa(hZ^EQVR+7@y*|+{+$!dzzmyHY|9S
z;_oAjLv@@n^Sbt0r@Hxo_&F};CyY-0!If<GD3mzF4pv^ah}OQ#nBh6b7e~#dmxuXi
zTxV3as8Bm>ql`qxGOu%+c&l9_u~RIwMcD%!&U~GH;ve{6JpT=jZafy77>OL>Bm9N&
z!Nrbz%=}qKhu-2aPcshXEaivu8KWywuBptZa0?ZmD%ACKke<MFj4ko}e`67+@+|W_
zPkX0}yqAss`yA)Pd^2MG9N=L(=;<Qka9w94uw-HF?DR8cy^d;0J84?!AR~b<xMqXJ
zghkAzrL)%hwe*u-@%9jpFgoxLqXP>Z^@ty5fqOZ~4_MDDUDb1S>vO3(Z}PvnC#voF
iW4X;of6AAes^zx#^1a1EvA3^y^io^X^y*;u>i+?|LZ*QL

delta 1644
zcmXZbSxA&o6u|K_Hae}7S(>HQSGKuSPNjuqS(wVGtz@OWj5^vf&1X6e71TiXP(m+G
zD=i>Y5LpHZRuBX=5A_hy0v6SSfdxfH3l&-PKYZVy^SkHH%)R%VbH863|5ZiaBsq@@
zudV#2^FJ6T62VvTyz%ODiHyV-=*0mXiXPsEVF7AfY{!+DOuPvbaTn^k2XHc;!DV<G
z7wT5O8Mv94%W7#@h?%$rXJH%8#4Gmv6RaX0#ND`IIGbS%vvAS~k<D0!3$PP)<L8)x
z-*G;sl2w+bTFziB6JeZ=?WkYuMm^9|%*M~?!?aN%vvEI8!%L_OKENCtMEzYRSry|d
zEX8&#!zY-JX`?xSmU=w{5AH`@s2k^Eza5XEj+#j^>H+s)5uUT-H>d|5GDc(u&cZyb
zL?^Z(#gfBF^3s75@H|HJq&FEP;WO0Uy+hh8f06D;JReeBaih*pKwW4mY9@2=1lD6S
z{=s<|q^uM}&SNfip|1BD^*{q-ss9uPUzjj3ah!Dk50bo;;&R-COYkJ>LQhfehLh74
zU=C{U8*vVH*zsM|Oh4Fhe2P`cTuflTK85;!a)|6?f;FW&)#{mvnqd!W26yfFksZH8
zt=xMYk4|>cjnmOUFKX|1Vm@9+iYf0<@62!13Z+LTiY#SNfhBkZJ@^>?7{@N{xD6Ze
z8|s2JJX8942bSV5)ZQ0OvMSbqtB5aQ9)3iv*fbu6Md-za7&*vbDuZ5Jf-mp{Ces)F
zVHeKFeq5*XhLu?(>ZR*KJ;-C*d=_gUK8t#=A*5S~<yeGAY#(BQKK~<FrGgJiP#=#d
z>Oo%NT1@52^F`T?+WQNr6?%@V(M8&NIjd}asI3biXO=yv37$fVAh(g~OCP%R`Txow
zkqO64>vkrgi#QG0Lo#p$mf;<2$I}{9&m!zcF1%#Swk}sb>H&73-kmUNuMZ(PNe|L3
z=|i`l!4C!{=*+ZwQ;u5tHsnuk@m7g%Q7ho#s%r&mQR8E1U<|!DfGg3HZ9Qh8?C8UI
zucJDeobc086CLI1b!@#6a}~PN>&(_by%97+MqRVt7xEjmtql$SW~0e81JQ5EJ+9mZ
zhG%g>?u~0H?s1D-{6^5fuih6sy**$W;k}`-$uMNJG?@Ya{i8v%mC0r^9K6>V_SN0H
RYBc$F-9Hn%7`>de=09Ml&prSE

diff --git a/po/cs.po b/po/cs.po
index 36f14896e..ec92e4479 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 beef331c7b372403a0c7d12d0dceb6adaa73c9ad..60f05e1ce2edc4b0f420f2b1844c17741e6f49ff 100644
GIT binary patch
delta 1541
zcmXZcZ%mD07{~GJSanK&L^+8{Nm3-|6s0;9qGUspvP|ZUF=PIPwb`*YYh&8%C^M{A
z{w!m*)?za+3b7%KnziADMf2|k%{%k`InUWnpZk8!^IXq$U-xzQYU7s;f%h}QI*rdZ
zzA1cvPcaMNvvB_KdEz#U!KYY@BN&Mp{E5O`)V$D{`*9}oYK+J2sJQzv4bNaX_F$o2
zHNhZ`3u#1~gL#;P>o6M+;{v?oTpz#&=HKujuAXYvh<%ugvC(E*u^0>R9O}i7FcUwa
z4<lJsu9jNLAb|_Ja6Y!8ZtO-SG>D7v1MbA=ShIz=59eVQD&Rd_jNeetC9|q3T!z)y
ziZwWZ%Q1Qy38>Vo7<h3XDo{5r!Pm~*MIE)0LR5mgu@cWZ^B1Uue_<9TP3NWP$1psM
z6w8hyi?=pR#tsZ9(;EzC;6v2jjUwA@-;v$1Nu;{=*SQ|W%?dOfwUSiq!g@S}Uojt>
zDJ#XW4qS?tQSqLm5*kUM{&N|8<U%@HVkm(OWbsyn6<Cd>*p3P`i0X~sSb`~Jt-Wu=
zJZy93cTg)G!vdVd2+Z-AwYZ4oq5f3Ot|ifM*pJH0H7k^9G-{sc%+rutEE~z$Do~~0
zjH=`@ti&L$#5c%xn};magjuL&u0r+H-T(uY>Vosb5N>4t1CL<&Y_l!ci)y+k-cpY~
zROQ-Hfv=-}e~en`PgJEcIeUb%dQ|W1cMPJQ3*2Q;$Y2z;cQL7<<_lmt^V?XA!&r)u
zJf%QYsEX~uI_$+w7*1AY*nnDC5G!%eF)TfFeGL}r{I@Vz!40=iUH=(t(326`(;et#
zej0P|KI#SIs3y$h4019pAGK9ws4ZIS*z9-|S)+BJ?z@SRI{$tD2WAgYT|b2MhYe#n
zj$;pIvC${-C91@AltE2;3Vqm#3j74s<*!lAIELzxD9)x5$U{9>i{;wOCI;%_i>N?v
zP~GgNQ~c;d{bM<Rs>Bt?VWg_&;wY#h8K?xBgYUxEyDXR$@yFE^Om+9Ww)MVs`{ROs
X&sDe2o9^|MczY*2C*p(Wv;F@7NP3>&

delta 1621
zcmXZcdu)tZ7{~Evs#QuaYFn4Oysfp>x^<LAwOR~i#nN@B5v8x&%yjIebxUf9NTd<M
z1VKn7B5{d(Li{D9+4P@=A|bI7{wN}`vLqr(e1GPhWcoShyz`#(oaa2JZ~lBZKlUO!
z`H1nU<vWOPSCUx_pQrGL&(l=1-uMjvz)tLee*W~tGE_g{_2*#@{iT?NVbr`kaR{Eo
zsdxv+YpE|ZG8h=cY<XCLMYtRbaS#567rpTgTtdGK|Hg%BEQYOEjDvfbEyLMZif2#@
zKfz)63CCf7c2%sc&ZW_pfi3tewxE7^1r^XE9Ety79p<H*jlgCsz;mbx+i(<iq24QE
zR{@-f)!2fwu>*g{yi5X6s{f+l$7a+-S8xoz^7?(qqjnNN1-K2X@RZkofeN@=AG6_D
zh!b!gCgUC?S+)<^ydA~?cp77h^frxbe2hA~*T^y3H{^6Ig@<I<GEn0KP!r{&b}|}|
zVm(IjD~`nm(n>PyG?w5c)O`P<0_yBb{)f`|z<`5Uza#?iBb&Esti+`_1&^U7dW5Qt
zWTGv@QK++DkE8Lh*T0L}={v8VlAFk633g|^K9~GA`OJb0kVSjh&uk9<kBYFoe<I>p
zsQ!Gfza06AtwCb99jGHXfXe7~tipDjhM7dcv0DwQ7+0f;Iu@g$;yQ;)S%>!^X&{Ty
zFTzILj*Ia<s`vt|vIxVd4BkUc{0jBl$DJ$1VpPUfAyeByR1KZ?jJ4Cyiyv`3W)DuB
zVKu4<@1TQkaT2ES<0&`;HBk(ev9nl%?{NWE5mh-JLT#)atMI#LrSo$<X1i!i<iS;(
zjBij27vv|dOAYF5PoN)Lu?Rn-7Rcugsu))xH`F$vj%q9Fh<1A(_q>Me)!MM9?tdo@
zRpkfIFQ_U{;y@`2OT(#{j~8$??!sPdUn$;?D%QI=4j-Tb=*C^tyy>W-%tc<c04jhD
zm|0I_FAXhl1k3O-YNAXkL_4336&ObSgSm*x#8b~St^!%La@0b#sLZsW0{JK2mNM73
zBA(Ozvu|ZQJ@uBa_C{-JMaH1Dk)}|+(-3KN)<)gBM%P)>v~Hanbv8#Lq4>v~o2ezG
xj(<{F$&Jgo%~=Ibu&JTJbv6crt`pfDbsKph?1n;aI8?XZjRx=Ejt?!I^8=B$y)*y-

diff --git a/po/da.po b/po/da.po
index e47d69ba8..96fcdc349 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 d95879171be88c881f202cf2f0ec0dc731e6cbd3..5a8f4ebc978d006f452d3f0cd329143b500b4f2d 100644
GIT binary patch
delta 1541
zcmXZcZD^HM902fh!+D)+D_?faa<-LQZno;qt(UE9GPRjTNsUbt193%P9MlL*Kim>3
z=tYPvKct{WK`6m!g#>-lULhrd7U8m>5X|+y;Wz2`?>?7%pWivpbMHC-|NoqG&kz1N
zP(HtK&YQ_=yU#M8nX6JN^Xn=XuP^f{UCpn!iIbeiCYNfqG5VcZzr=d|K3>ZmjB$s#
zoUd{XkFztTx~Ng-#&V<Gz;?Fs0p7w9w(wAP{}c!Gr};G3%};5NAF++KH7RZ7-CWH#
z7!!ZSoB1m{I8Rn>k!p{|A~&Ao3hrfm@dzWJ(_F=$xRW)tDXrvg-o%590YB!goM!xP
zsjSwsi+$Y7jXcFWS#ym5qSU<_Meb${bcDC@+pM2c$H=6U5#Uo?%h$91Sw_JBvYAU3
zn3N^X;RqEg?V;q;elFz!mLt;lG#2tx#@c;P%bb3v)k(8d-E<|pU+v2=&;mv#4Lrzx
zKEq4AosTQ4Vx$ASgNGU8onZttxk&wQ)cDzrMyAD;0GcTIbQkYqAA9&RW1!QFy)naX
zE)#XE{UF=9KkJV(GCjxDoaJ1$7E+qZ8LOcF=1#TORW?-<BjP=oFJ+EpzRlRp<Md8v
zTw<v%u#5F(+se({z;_tq|HgQJh4--Y`bt8><*ad>k?93K%NFZ0#>3plqFGCPpU?3U
zV}d6dDw&^PRA!Q~>GHOG1oj{!(0z<bkFkj#($J|qsj)`mAHKq(Zx#6oqr`vkUKSc1
zDL%?Lj<0cm6Wqo5M%~F_MgZTioAr*!!`za2l=1v8Zi@5YW$Q*J&oeUkoLhLAG4aL~
zm4IGkRNy2Z;Vi4-d2?lRK9sqQikOBn%Zv)VmGvj+B&V~?$N4{}5xer2|8F?Iv`lG+
z8(1gZarW~NtCXdO$LJ`h9~o;p&Dc9FD=T&~66$6AFN`oMca-*R`hx5GHKsIr+0>fS
z{TyQa@C2h0Q(Vh-TYMdd8B6v7m+)_HW3_*&IF`Fcf2i7=OQX$mFXtW`ZOEU@ZJ+oq
cU#c4|72eHv6dQ{j-NlKEg`vfxFRa?}9|<t40ssI2

delta 1629
zcmXZcZAep57{Ku}bIsn&l}^jDyV7*NZdy?*OKPSWk`-t#ep&8j;o59z6k+=y^kPup
zdifw_K?G80U{u%_BP9GJSW=-G1g#*-s30PP{!hDO+wYunch7mA=bXE#+R3``<bwDs
zidQ|KC48pilnUd7nJ-?iElSPBH&}&HOh6Z3v(Syw_Za<ZOrc+gNq7Wh-qV<YUAPek
zaFs0en?@o7h0K<YrRc!Dn2qhY67L%0qgYFS8js@c*(`=bn2Ss2D76PGu>^0SEIfuQ
z@Fx~y8d>E^s@rKSWZ*bvVh73(`%nUUfq6KEUQC~-R1UV`a=e2w;V|aoG|GJrvhrX#
zR$vEK;wY}c^!WrJrQSuug>5Jk^<g2tH~LoUD4BRr0z83bc-`nvq69p{s#F$c<7%wN
zcx*?CrOqMAt4>^mH!v)bKBln%U!v^YM`WATUu1WbnTu3cC8CTkLYc^pl1TwxMIVOn
z4;Ep7vQi9n1D$veWxls40Yw*5|7A43F`!{max4HBlDw+GO<0HP@fylRFHp`#Jkh!_
zA7$?wu>d=b{vb-GpN+oR7OSKaXEN@yQU3{(QcVmHgQ`r69j<zm$ombS8jcvgMLE@<
zk+(`<71=U7uErYNgJ-ZD-=WN(wK#Tt9j>Dv4AYRzdJI3HWNc?&TG5M_@fDszKdYAF
zCp?KOm&O*jiBf?mN`<T(c{zNWQ35-Q66iyeijSZj!&5YvTUi<1hy~bzestk4lu|o1
zr8eMBT#FY`9?R!gi(jz;%bC@SJtzUp;Sq6T4er1ThU3Wfu*&1;R&k*jrBqK)GB9Ow
z6BeT^+>R2^AW8+k<1Tb^<jry&XXAOp%SbU*x8VRv1;&j2SDY))|18pwQ*A>zof$?y
z8`(Bhgypym@8c!x!ZOOT9w(4TTBYU0_B0#i?05}>C<(Qp{6F*}Q>bxF_R)xQ#7dQl
zo9Wl%R_sQ(F^W=&R5rK_58)Q<LD{k|n2P!QOO>Dp_u>hZ$8<C@Y~F6#7fG4<%d|f-
z&+^Dr-#=t2O<d9tZ1wxJK(Iw?2<hGyT|3Zv@Sq;jnu9@q<VVT_i?c*?t#v#5du_ht
r+(te0>~@RR6buCTX_J09pa-;?|92GBaEGRcj<x81zaEGr<Td^SqVmK@

diff --git a/po/de.po b/po/de.po
index 805b082a2..5bc42349d 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 196ce016d1fecb3f131ec4b519c60daefa46b044..6da46442245bf9f110a5e0bf53fc139a1897427b 100644
GIT binary patch
delta 20
bcmX>bbv9~4q7b{0p@N~2mEq<Lp{G&+P$35P

delta 20
bcmX>bbv9~4q7b`*v4Ww6mBHo=p{G&+P)P>+

diff --git a/po/el.po b/po/el.po
index 931373bd3..577daba10 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 57c2c9511c4c1054f87bcff7e7cd423185166d3a..138dcdfe204431e24c542aaaeaa5416ebeffb58c 100644
GIT binary patch
delta 20
bcmbQwI-hle4<oygp@N~2mEq=KMju81IbH<v

delta 20
bcmbQwI-hle4<oyQv4Ww6mBHp<Mju81IfexH

diff --git a/po/en_GB.po b/po/en_GB.po
index d5d9f5917..f71db27ae 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 fcf1e5b3c9452db4857370dbcf85ed59b8bbf53a..ad7a95d9fcba0fd30f128dff6980d77449b0a0d8 100644
GIT binary patch
delta 20
bcmdnMwSjBHMkaP6Lj^-4E5pq@m@1e6M1cku

delta 20
bcmdnMwSjBHMkaOxV+BJCD}&8Dm@1e6M5zWG

diff --git a/po/eo.po b/po/eo.po
index b631c3353..29f96c7e7 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 45d70f5df194b438d832bceca7aba9fa15efbc0e..bea6c0c831cba7ed4f58bb7f79e884ec2a05c7ad 100644
GIT binary patch
delta 20
bcmbQ~In#54sW7{dp@N~2mEmR^;aEWcLAeEm

delta 20
bcmbQ~In#54sW7{Nv4Ww6mBD5k;aEWcLE#08

diff --git a/po/es.po b/po/es.po
index c352b2b80..b3a7305fc 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 ab510fe41894ed37b8af271a06ea772c937bb374..2529dfece4670df153b0619e168f67aae98bb182 100644
GIT binary patch
delta 20
bcmX?Qead=+gaEsdp@N~2mEmT2fz`YKMMVYG

delta 20
bcmX?Qead=+gaEsNv4Ww6mBD6tfz`YKMQsJz

diff --git a/po/eu.po b/po/eu.po
index d7dc2f57d..2abc3e544 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 71fb1f828ae80a771478fdfc65e86490b0fc428c..4956ea7e7a05e57583b6c11226bddfe8af50dda7 100644
GIT binary patch
delta 20
ccmaE9_tI{|d_i_2Lj^-4E5psp1P}890926&K>z>%

delta 20
ccmaE9_tI{|d_i^tV+BJCD}&9;1P}89093gLMgRZ+

diff --git a/po/fi.po b/po/fi.po
index 6bfd4c728..bed2a6099 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 f9e0a3111f0dd793ce3e1963d82fe2fe368d1d43..a8c353b93fce179ef461be0c66da70df137de948 100644
GIT binary patch
delta 20
bcmZqkX!F>RD8z1Ls9<PhWw<#*Xr3SdLU;xA

delta 20
bcmZqkX!F>RD8z1HtYBziWw1FzXr3SdLZAit

diff --git a/po/fr.po b/po/fr.po
index ba2c0856d..3c1f10c4b 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 327ee71605580e3161095e0bade91e9665cd03b1..56d006583a7122b755c69bcb94b19b928b134412 100644
GIT binary patch
delta 1478
zcmXZcOGuPa6u|K_rH)!^zOt-IElVA>oN-3UUSk=)3YBntAVv$Rq!wx|lH@ZAa(WOn
z>7qq0#DpL;tPBfU6h@1puosaH1=GS@iI5Ae{)cY{#^1e{Z|*(k-19l=ovb&$CxrD2
zp9a1g`F>a-V&JuK{_yFuimXN-R^b3f;t!0%+0c9;G+)MK)~!6W25qSOZpTenjV^4*
z4SLidgB%u~VipE*8^*A^uDj5St=NH&P=n2i7O|s&jd%|WapfxWpkmy@+>1`^Mt%N1
zCgK;&)Kupf=!5a3NkrntT&%-m*n`;^z|9yLV{Vv>dCXf;e|Htja0JV74lB?VD^i3#
zr~y1g2L{lorH+rIJXnSrX%}iHcQF&cq6hzl<{s**0k`2+^r0I^F${x9kz^LhO%`xH
zO1v3pDkd;3LWAp)N(NM2>X0f*GwOO9>ISD#GdPC>IEI~A&MrG}5=mBOu>coQ_sgNq
z8i*6qa5tu73u=$_BvSu<4E!wY!fDhE;*!i>@L&n^6R4#d!hC!inlGVdmc?#`Sc(yN
z7C%`;&LgqPkra_yY(ow7F>;&oGKKo<!u!xd0JU4^kXR&Yop~iT%wS%NddHop%{qZ@
z44@{GOf);O9zA#iyYU_RusT)bD1OAf=r-t_4hCoNApSzlFpns-Cz^2&`p|{1P@8ZG
z^-9ugre4%$yp9KO5-;Fi)Ps6?_q11@V-*Im291I=^A3CQ6bob6j<$4>lh}tXIFI|W
zhB8#*O>D$(s2jS8>JavZe1m#$DxIqPG@<_f1(sq2osEW6Flb=m3To5*M7_h`7>)C&
z6<H3MOBz&DnvlkpF670KOQ_G^LT%nbBuN=Tt;iHUz-a!tT*PPS)c4=RMe1F5p*G)T
z)Sh^P+9Xq`O*oCZVQjW}1^IZGc`a(DcTf+SLA{!c9J4ZwsLeTq#rPTZD&y?zLxV~g
zgK9jEn)$fhe>=R&BK~0bAB)#N6ER_F81J{fj`91FhpkRWy2DxG7<aGrCHWWa#s2{}
CMx?p`

delta 1552
zcmXZcSxA&o6u|K_;+9LA3z}(un&p<|np)&;rWqNeP9?;oGi~CiI1pA0Aq6S6Fd9ic
zL_u$9VI(L~q(T|eQ$Zm<)JxQZScou4^*_!GjK6#DeBb@fJ?DH*HjXtp7bAR!g^!tU
zJl_Q$5hp(I;}4&E0U{wdf_3-=192HQpxZn5Wl`s$7>zL)j#;Stmf%)AiTT)zTl7(5
z4ANQnfT_5GJ1~LWbiE3jumihr7Mrm!NF)Pqp$0#Rc^Db&c~A{*V{XG->_@%+6-MF@
zOwpsRG0+Q>I3^KEHD;m(EjWm2xP-|V8|v9`AMRw{fqLJ4tilPb!8JUHRU1Y2;2>%M
zGnj)*n5(Hy3KQ9d$512fLp{k$Ou?U6hGFDW=MAU<J8(OWU;(~HUtB?wByQwv;=4&?
zGlruEnt>5`0G*Uijx!+ZVnMPf=TX-ks2f~CJ;4pUi*K+So7rVI&LM{tH)dlX`PKc3
zQ3I*KM65>x+fjRDFp~V2GI-3wKKzclL1L7r7aDLc^NXmd8^<hM^v*-rMNd|U`ukDL
z!^`N8&+xN}k{~h5%^0$W4^abNjv@b)RsMMwLSjAhIMl99MPiaF%tbRM;Q(r_pQ1MH
zZ!Ew#qR|62U@_jtGMvL+42~m<cpXn+xRZjEFzCcC9K&i%;^}(QGpM~WjQep0^U){4
z(~O0vr8(jC4r)`r!%AGit60ptr_Y%}?HM=Lq0>kdIl|xqYAvU*9e?3@G#eu4a2i`M
zi{n>dKi1+rnlUEXvtcLJGoSJrNT=$98&UTeLcRYlmh1apPD?Y8KGgSm7PWa22vcjg
z1A{ONH6uk{ZAeyS2x)W~MP3wnje7k@)F%Fl99F(zC7Sr>@*JzNPv8Gl23p%o6jEzF
zirR#4QJdrsYLA%GJk7Wfb;DZZka89e;{fVOzo0%SHr-R27SvR`P@8iR3o#;tQWBKZ
zG0=^iSd5SG5H6r*AT86??^kDPa((h!H8s2D{U=Q3@oNF^L*rZRj`lXA!`@@Gc3Uky
zR^zn8X0vu1opyV>t2FvWKz5#yQ?xgG+#P)*D!$X+W?jFq+i-NOUt_RvdU}#uT-J=n
E|F;>qtpET3

diff --git a/po/gl.po b/po/gl.po
index 05d27b0f4..1c560746d 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 d66eb8b8d..0d863d065 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 be5ac88c10a783a710ac7339b5f7977d43199004..680af9fa523d655c0035c59703b55f9585c1353f 100644
GIT binary patch
delta 20
bcmX@>bk=D@q7b{0p@N~2mEq<Lp{INROtl8O

delta 20
bcmX@>bk=D@q7b`*v4Ww6mBHo=p{INROx*^*

diff --git a/po/hr.po b/po/hr.po
index 40611cdf1..bc441e86a 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 eb10c35988f6c34c581fbaeffa4c15b16591aec2..7d546e9a3966fc5ee39a2e7bbc40827de14ae4ea 100644
GIT binary patch
delta 1541
zcmXZcUuczO7y$71n7Yl=R?anDIo-)zp7|$tw*I+J`6rySK^eovR+2(d!HgV~tm1%B
zUP!_?<&D*@>>mYziFnb4&Y&U-G7T##(2Fd+O7TwmJ)Q5c^ZnlUJKy(w&-*;@w>O91
z-dg#+dFDIGXViD0@0A%TRruX32cNI&Qo51fa5K-co&|>nb}{C?*}TkK%=>vWpJK$_
z$wl192l)wm<53q4nw(f9+HG9PA_sUU$Jxn)+4&RPYJQ0?al@RHhIxctY|N+h1n*-H
zCm9d^ic5HbCDvP2S1h&9V4f4t@(xZgE}UW{G|lDwgWH*JOlcX%csma;0v_WEUSizW
zW>pXKZuWD6n|OlvFn^N-qSWgRx;e%OG{sf?F`MVqF;>#cNbotX<y+bOdq%?law+G}
z^-z{MljBsZw3`;6_OOlnS&2+PGHB*WM(=*6HmA$fophC|o33Z)8(bWL<}y~&&I26c
zF8;&2xJ_9VBkkvEzRQSrijmOSdFsE|;7=zym|AKH6ln43UOvQr_Hi#G&@^LjT;Uon
zly&rem@By_n}5z&>96eJRnBIyRmE-e)vf9u7wlM&(&K!Mk=YNK=Q7V{UZ#7~HO^;~
zn~UsZl>RXe@?}Qi)AY=A!>zT1+ZYR2$6oHL7?cb?WR&a|j&P2?jPV(6<7vjqO5UX>
z`7}51OUBA`?fT6XT*ns}t@)Jx(s_s2oH?&TZ01$$U}ePMeuG!}I*%|i?^#?6JkA00
z_qmyWF<!@>j#?rkeBS(MW}#4f{q`{uxxg*#^s0orxt`y0DBk}@TQ>sl-~;@O+xa)+
z^%=C~`#8y%pW-N+)jKxfPI@!b1fz9(8LgSj{FsWGj#Dn_H^%kX|F<HD<;1RBz}WQ#
zMvse(2d?EozQGsccRMdyHAx#i9cQ%WCq|qZ%WCEso34e?qD_pwGR}zq9*2}5ePIw4
zXz*(|#JF*akMcBKl9q@Pfd(Do|HCVc-hRN1Jjr_ItLJ7tl1tU4v#;ews_k`0bEAjP
d)Rmj6<<>)WrS6XI(wgqW7h8)h)q&;Z{{RqDp(g+U

delta 1621
zcmXZcT}YEr7{KvkIknRHZJA%M*@s%0Q<F5cFTYJB3oRYNYHE^hHfBU+yAU$$B5+w3
zqU1$^R7zPHU5R2Kc%=mz6%?UC7exgXt&jiX-m&d>&UxSW>^aYK&aT&7u64Z)^X*l<
z%zR?`cvdLo!q*1Ac+LAO6^IL1j*A$8Ccai-E=s>p?^j|Z{aOscR+M=!VLbL>0Y1Yl
z`Keztj0~hPTMXu73Le8P*om9*u0B4CHS|4r1`n_1$8ZW$F>Z}gN3j$$aS-K)Ut$t|
z#|&J@s#0aC6*R&bIEx#x8|B6klz`@ND}F``#sn#qj2*ZE@1RULjoZ+J@>~k5D#Riz
z!EP+YS<J?mU;>a-SJN<I2g*bvn1=85ekggAl@y``cn<eszutd~67b4Ur8eOf+=-Rw
zi=9Za)D>j$st2QS09_L4QyO9T0;P6KNSW0iq&mvLMY5}mDC5y66D6XoWINtKD?0Eu
z?m!!9B^hb})A1h4d~Z+!S_~)u2{gVipkYXaHvki|cvXUXuoidYO_Yh|Q1*r|(dObd
zl-f7pcI?sn<0vcrr1uR`-b|*WALG_2@^50tpJqUA>|aMYa115F)eMRey79Wn$RjEP
z*J2r_parD_SMeY|Kv}?FBnDNm-W&K4l!aV$(a554A2aYhO6nr1OC1(rE8fE6Xyh!(
z3R}^PeRu$WqGTX1juV7UxDRh*HZCD=70*$SO`3<Ysa?%9G#b5_gHNynzo0~JOYlxS
zjAir}upE;#@3FL@1k#Jm_*K`O=skwdQ36Tes2oCz?kMh;^KW459^pbM%EbMchab^`
zo7nPljJi<vz>MAxAkX#mD^WJ%5OPA*W0aCjpp<4t_XCn#<w0UnYxz?Nl=Gjn+)%0*
zWp^G%+2v-G8e35UxPW~)j&`}u4wO>OARAtJP)ZY=?42iHw-_@SuR<wNC(2$K#waU|
zc^Z;|&nOuv<f?cL<-u22g+`v{7IhqXt1iCef8rrZZQr5P`X3f!HU$pA4)?U7!l%w1
z>G#8@-W}vW=3^e6^3ONMp0u~OST&p7shxB*Sey;oiT1|E28Y&Wx3{>zMLzOR&(uu2
ua??kLqf#O^INPmur&DX09CA7uPT9}fnzgp&`<;`64tvYwsM9@>TKyjf%)>(f

diff --git a/po/hu.po b/po/hu.po
index 1bd61557f..7cbc16947 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 12c8b919c2d51e55523c9bca46de3cafa7da2bd4..d7b9bcc702351bef352b6cc3edee580f5a4e5f90 100644
GIT binary patch
delta 1541
zcmXZbSx8iI6vy#1rH;8wW;JG|&X`tOYBOquW=2-pf)PlCZT66eVT<#UwhToPWCbxK
zw9xWkNKb)gL_J6vB(y+~5rIYZBH2?)5)^%Z%^ha$=l{QR@Bf~2{^x$#`nxtfk{WZ>
z`0V00pWpZtvoOAl<-q5K+bju(a1#z=Jo-6I!+g}d#F<y%Z06ONf_qTw9>PrQz}0vk
zOZ2Ew1|Cjivf4Z>z&zZDi!g)>@rHB$8E$7jhDWg~!E6UU#C%LnG~0<Qu^6wQ9{d~^
z;5Q6nJXz%{)p7<iInjtY*p9mJHY%V2T!No)KPD!dEyfni#!l3Nk8vrEq3%m3t94k4
z)!2?T_zah0;&cK~sn;?HU<+!Y+gONiow<uTDw7gafK9jtFFEtqsDOWBE~d@kp;&=2
z7($9=$B^Xh45s5{3@g%Z2B|oR+PnA2Hro$mcWeTwuKjh+Pvc@OGy|1M26kc{w&Hgz
z!o8H0V%TL|hBr~`y+Q>vJd^roG5E|0AKI*F0DdHSTY;5WjpcYAwa@^nH^#9H=M%N|
zeg_ud8E5_gmFY(;#tDqWJTF1GSj$WO*$(@gX0`>B=R`BBN4DD<oq5Qahmo&c<iHx%
zg$m>;s>#0LTAa#LOK}5g{S&CSpaa#+-Kap{gc)eB|DYmVI@fF;HsE3G#{;;GebNn`
zsQ(9X1?I4-4|k)Q@+7Xpd#I-UitL(A&xrPjAJw$$kytI<#30DvG&W-|Dx)mY@nJOv
zun86DbyTwr;Wqq%o3Jv=Y%^X!RbUu(eY!7Ni5kaKSi<>UT>1a~XP`*4{n3SMv5I*s
zDv&<R!x2=5@r2Kf7C?1(Gpd;mqnfe}DUO{(ifVUJTlK`5zeQa)hDmz=CmE<KV@b=6
z9;9mKMU}D`ui+7F!vx+zRpcycZ~IW){v5UN1gdvjyo(gaJV@+TfC_9Ys<{v1x;h5O
z8E6aou^fM*y1a-^sl*0UCGMae^a53}NmOPz{Hb0j$2bf{KE!TzStK{^m#aRK;eO=W
e)$`6>;fYjuyWGKmFAyvX^o)9Mr9^rc75)R~RiTss

delta 1613
zcmXZbNo<T^9LMp0X*;%7i#Dq0TU(W?8DptxZLO%*5=*R=W~!r>c7|#N34>nf(FBo3
z6KObD55yJ;ml6jDTSCxK2?vJ~LTH8WFY`{?`8>}%Gtc|q-apH`Rzy07#Gf=?mHdz7
zzqgNB1m7m`#_N^GY!JT2a{Pq-(8pVUEJW=~-Tg95W4{hlupV{pAsmgZI2Z5YblvJV
zi)1e3b6O@AV=ivM9Bjr3c*(u~4A-*n#of4i05`)9oP?tWnytq&^y4|yjbGwe{DISO
zI9W|nsue7Ta$zry!xq#Rub~2Zj+3z)1DKg)HW3fv7`%Ww@G<6LFY0%>WL1iba51)E
z89u|Am^qjLRO(eMe0UIb&^64*E_a_w9hFHbD!_d>AJ4k`PE^2sQ_aR>4$i=37>~_J
zvFsR<yq&-dY{Q5mz0G0>zCiWvGty@Ji*&~l_>k&aGU|E;>Y!{?CR6Yf)?fqn;8YAz
zR*GS5=*7#Z^WLEX`ZSdKXR-Lo1qV}x#RBjl$=hO_hwE?-o<<$?95oy9L|ce?sNUD&
z6g=VXAD}Y*;_egDW0mw`BG+russEEWvz=U^EjD|&*-|V+Wq1;4yPb3QSKa+x<j)@Q
z#!u}%DxhDeVawvK3vn*az$2*hZ=s%shp3_c7-6A^2aJgIya4^|Yq1JjF^oMJ#GUj@
z-+zkw{2$K3Do%CqG-^0+V-bEp4e#htW^~iaQL|Es8s5lZ7Rsa@r{O)^f!(N#Hj<8m
zN70AvsNsBxIw(HNY$Z;_ay)<)*nz4*suTPE8dN2kUGLy@J^$S-3ix1Lb}Z7(sDqDV
z30^@3@(pt_gRqrh3F>!ss3|{>8mfz^*4;pgV-Jub+gntte!BZ4ZZc5Me+~=v*pHgd
z`RKtVNcC(bs+1u-gO_kWF5+2KMed_|`wcbqdIlAM7j<qCQY>47<Y3!Sfwkb^8WtB=
zl;TZP3wm%4<})Fh_8mA6TTzvGgSt^)HtMY(m01<$;a=2Cv|}Q^i9SxKh}#%VOZ*kL
zDVpTD6<2w^!&96*a!a_WuEq(48=Wl;!9Zissczc3HQ3<n3Ww{W-_ve*yne@5Q0TpW
nHN7omMD_MP0jEA#U)>aFbapk>IeWH;YHI`A0-@;aoCW^@KYF|_

diff --git a/po/id.po b/po/id.po
index e4dbcabf0..381bd1602 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 5cb829e6e0040d315e2bd7b7a97ac2cdef9a87a7..6236c1210b9f07efab3f5fe5d22d477fdb4dc138 100644
GIT binary patch
delta 20
ccmccZblYjed_i_2Lj^-4E5psp1h?`708;Y@ApigX

delta 20
ccmccZblYjed_i^tV+BJCD}&9;1h?`708<+WCIA2c

diff --git a/po/it.po b/po/it.po
index 31719c831..48e93f60c 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 138c6df778b654df1aa70955e1875132d59aeac0..dcf41d691e4cea1f16bbfaf8c1f102f3678cc02a 100644
GIT binary patch
delta 1477
zcmXZcYe*DP6u|Mb`B-~w=G!cDTQxN+-E}o`jWjGRu@X$v%!)88DbOBbB!du?SoC4l
z3Ida;Am{-lf_)1jGLT52C{ijc*d+QOSd!KMFtf1xn|qwObMCq4+P}ZM-WZPz?h!uK
ze3$bbn<rx6r4WAjT(pZU!cN?dy%>g{a6SgC@w7Fb!x-XrZd!tgsPnGF6<CH|Jci5k
zRefA!5O|7dIEky!!R#9MVine7GY+68o3=n?H5#}F?_mxGEi_-W9+MeYp$E^R-hUsX
z@ExY;Qm44k8zWdI8A&c?Vg(+=c1*_!bYYmooG=sDFs?^^t_zFtE|%aFmZEpDNFKJM
zCh!E^IDsB5bwoJj!D7@*Pol2m4yNFHEX04-xRAPP!VQ>;otTRcF&HP2B1r&Qn@r<U
zln67?1dL>uhX&gv+qj_WQh`)aYEk12s1qDVT|pc6;v;Oq5@yN5A!M-<z-;`5I$s8L
z)<is*gazotI@BI%kD~sYxbPG3;V9|^;n8L<6k<N(BdDdjg==xd8vj9ESsJtDU=fDm
zX?$xFIfuG{$~ck3cmQ?$!g4f@`fFgq3VcUx!Wq;(O^P>r!H1eyBW}iPs9W;^^~IWn
z#=VxUsCz$zH!vtcWEgMaWo%+{z5lntg$4>ZBh@&Jx>8r7$VMzjjd$S={DSG|;Vf;z
zy;y+#xB<s;7sgZXAv}t8nBru6u>;F+6!m!{X{FhG4Y->?H@0BFa-Yjg;5F)s(&@Y!
zY_@!bI#DX+(0CK-i=LydFfP?hpcc0>9z>1*MYi6MA`bfr0v)K$@)PMFnMG|P2m8TX
z5{tSuK7Mp-4j~6Z49hFXc1s^}Qe^=3xo6mj-*66hQob=P&!8{#{JW^PPSlFEcmcI1
zK3o1kGL>1>Qs-xyr=b;3F@Atrxn%wsRAL)y1xD};I_X&5x~r&v|B6~kA7?&0nv3&X
z=pGMXC_4PtL&|L8pA4C?Rrx=L4%(_8_t;-L{GBnk?H;$&?a6mP&W(K&@2|-!{SRu_
Br)B^E

delta 1558
zcmXZcc}P@I6vy#vxU{HQX6`wfnr4}~WM*lInq-8wS+<y&24PN#V-dzcLtud<P1+{W
zhW`{8Dg~k#Q9(uoRs<#e^CGH$vOoe+==)=4aOU&wnR)k}d+xbjJ#@Fm`E{{xm*KUS
zcMR`|ImS4#$Bz$Q*8_|R#2dI3dvPxQ!Ff3C9s3g0I0(Zq97Aw5YTg1|hWjxa&tkM5
z)yG9Dfj77Ur!W~~nN9Ix+=ESc3SVLs=FT@}C0<4)KZIEry1?_GEx4R<17_kS)bB?y
z6n|i%mO8_Qei+X($;gyo8rEVhc3=wr#srKA@=TbIs~9(-?z@G>_!PI`43=SWurcef
z1C_uFT#LUkQ>BhyXiPfpLS^bgt>g(N;xF8c3#q5Z6{v(An1nYl2S?Etr;s9<X=H82
zcabrX7=lW4B`(HNbh3SB9~V^J)FM?h$5C+yYJzj96<ow_e1^?f#Vl)Z3|Xw1#tfWG
zeKlVmDv=_L!)<88MpTb<gi`-PF76Y^M+-GU+!9YORNw~2XHcaZz}5KGI}T(Ptt=Py
zeI;gL8~Wp8{N%%ypcZmDoPNMtsPUW#>aUC72#---lTpo>i7Ht&reP~8!FyPQ?@?Q_
zlq~e%d{o@-wI9_3Q`mzAQB(`RU<dX(nO!$zb4C<6jp}Z{SkH<M;wHxJsQ4?~j>|Yp
zDR=@)up2kx1m<BR^{&93ID`-I0M^*35)NZII)mdq6I7#`@DA?Acc?v1O7M6cmB0cz
zPb;d!efY?$KV?uNhf(of)PvNaTHp>;0$o^&e?4)h$>XpW5@^FF97Z)w8uh22Ob)7<
z%21`QME*=GAKIGR$N@1!UdNE_HlL9bYbH_m&Ehdkplq{v2|wukx2JOS2ppt?G*LfR
z<8xGR#Io@+6_scXs?-kDsp!WR{E4dEA^s_7zClz4=FzdOxF5B3<EZcBDR-GNYvn>s
zHHx}n5>@IV&XzykbYJu<_u1qA==aa3%Kg^=sn6bl3jwc#V(RRU#-p|-dyB2ExxTig
z-gd;%&`{rOJ88E!x(mYw12VE~Yu9hc7?=(lkBIBDT%DH7Wx2Yn^LH)RHOn<@xgJ{Q
UuY4Qn`QF~?-WV0_9!x*{A1vO+`~Uy|

diff --git a/po/ja.po b/po/ja.po
index a3b044409..5271debc6 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 1d2856eead4089b94ba98f0d90aa13301b472660..3b1b17f7a8c748de3fad414b7c69f15226b4ff14 100644
GIT binary patch
delta 20
bcmZ2twZv+JgaEsdp@N~2mEmT20ajiBJ~0I0

delta 20
bcmZ2twZv+JgaEsNv4Ww6mBD6t0ajiBK3N3j

diff --git a/po/lt.po b/po/lt.po
index ddbfee418..00307524f 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 f0df0faa68eb08ecf45120da71e5ee3a3a0c67fd..da0df5716edb0060774e1872f7653e06bf6ebf93 100644
GIT binary patch
delta 1541
zcmXZcOGs2v9LMo9<ulWK)R^UCtbCT`=$NHVT3PlW4U?>_$VHEZN@;~yG~%Wt5@JvS
z1#=NaA_Nj*kA+%L^jH)=D##Wtk_?L!u|@R#<sF#$oOAE>od5a%|JSC29VMPG;XW;f
zPdVRczS9eg@!%U@e)zofH)b)u!o4_*0T|CuAf}?`E^F?_Wy}jP6py3Ut;Sfqfm`tb
zy0p~<gAgvnvf4^a!xY?uNmz@C*k)ZHz(dR@@jUKWWK0=8!c+_nGUhOD!c4q{+V};o
z#&OKR08W*vqvkS*;KFHKgY~EfJ5T`);#wTT3JeN1CK;=66}F-l?89|9iTb-JPE~+e
zScvtw8wYSB1}z}~rFuI9Csv^r>cI8*-kRIUqfX*N1$Y+o@uoF@hYI*NCSYV3o1z<i
zuog*{sY4EL8Zio+(W6N3GYH4$sM?JnWi~&M>X;cMyXLQTJ&=dBP#EeYG1!WwScBhj
z1D+tQB*QdgI<}+Mdy5KaID-7gG5E>_2b!hx0mLJRH`$nng_w)iPzw#BdSe=MFq)`U
z`!Y<!Mr-~Mb<)q6i8JVjDRyJ#Y^-G`|9T*G`FyPkP$z4$Y_aUL?8X@G_hBTCpaZ8+
zr3qy*b$1r-!V9SGe}WDiMK$vrs>BY@iuvX$My2dBs++s88W&QZQ&@vK`6%joAggY}
zI#dQ9qiX*NU8pG4v{|TtEBH}nJgDcoF<$cz44e#RkYt!7-j!^;hk9@fH={4R<YOK>
zumOv)6OZ99%OY+TG4H}G{DV6&o!#Um%)zI)MO)4?(1tGFC8eYiOR>$G|3pO|M~mzJ
ze$;Dq1=U3Tmaj2{`4BpA+|rl2P#u$qWZmSUn)1khJ;t12poK1?y3>R7qq&ZXv>k8b
z2wuf=q($%f6w*&7nu0383{>x&w5&umX&pN74ssULk5tKwW06j3<0;kt0P1yWK-Ibz
z^$+74YC~tT^;)4a(Tuc-d4_Hr#Q?N>Kl<*o8E=B$tnH{b#=qBA-ZSLy4)MC}cl|S*
S4rfM=vuDDd6YecZ$^HitfTb(|

delta 1616
zcmXZcNla5g7{KwVQi=-|T0szyhp6n>vZ=+T8W5DAi5gMhQfxIS(%J|yBv=zKfH&$I
zx9C9*sAw=^;9?>ixEb6da^O%&JZKa}Vom&i_BCmLGxOe?`R1GN_4dB*{edY<)Fs8I
zk#8#B@B*a*IBDdE&wG<nOYsBl#t_D!ou5VMK<QWL{aQ?*Ux#sc5@p`AxC*c1Rvg9>
zS!$k!nSnxPOTjIegNHE-&*M7m*T*ODApJ0&!u^X`4974R)0QZ82&=Ie@1QLF1~YLM
zi!g~@<;qrTXjmC&$2Hi4a^nC>K(8<lzoH9MVwK9qPF#)mP$nG5d<>&Jm&2|quoA1V
z2di-c%P?gb0Z6L%(XeAD%0vTLh|_vMo;=D<Do_GEgHF7u_oq+-UKp>`TFk;yti>oi
zk0eWVA)8mdn2fhDAdx<!VZqlZXZIO7X7v|29cAPq*;Qtg@nn>VGEjC>fS1vYe*A;$
zv6Zxv40Q`_cpqiHPbdL}tmHqP#y18uj9VTFz>aKQRpB<Q!*aZWGSMrP+K3`r2j-)k
z{V^=SUcLVuWv5^CzA-V9NgGBp?oK5C^9H3(Fd#R2k|JjoK-uA_?n~WC-5E^d`Yf(M
z3lD3Ui*iIYC{^ymoj8E<7W_gDtt%r%T@s)nXWf8OWIZUUdx}!kA#BC1oRbG1pk%<x
zY%*Sf+i?&jlRr^vAc5#gupDJxA4<SC_>l|^qudvmp^-tu%sXO78<G^&gd1=g<;IoF
zz6qV^#17PO1oz@3Hex=5VmI!=5SC&oi&WwX-N)#VrRHdC=0Xwgk}T*&$w(g_z_)ro
zj}n*2>rt+Ep}by0D8&@kjVAwQ`f;dXx~>yBE#*Q^L3LoPZ1v**hEjJ?CVGTYrNc;F
zsuxJ4>K$H13+XtE{V4ByF8@x{m#RYv@FYs@T-WVGDb_*M@FTJ(6~<IIjdZR`sy3sX
z{RJ$;5tOt3j@6i%9a*pi<-ThunHWdPME%zL)*Svt>F>Z8JQo}{))?x83DI+ghG48|
z$j~@AX4+y-J>qR^aciyK)7lZg$93AHHMJc*>hWtnueT-mBjJh3R;<}KI&6av6CIYc
hc9(xNc-*BmceHz&-8{tI9=}WTjrF&*1>a`x`Ul0nzw!V8

diff --git a/po/lv.po b/po/lv.po
index 143eb0ec2..54bcea0ce 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 31e1e3f647a5f25f4914a9f41ce3b8d995133332..a9caed31bfe3479d71c4a7890282dd24ecf8ca55 100644
GIT binary patch
delta 20
bcmdm{w@q)u2_AMMLj^-4E5ps_dD6K6Ou7c7

delta 20
bcmdm{w@q)u2_AL>V+BJCD}&AFdD6K6OyUNq

diff --git a/po/mt.po b/po/mt.po
index 6bedda9db..bd52aa5e8 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 314bb07dac45fb8a328c2540dd2e87f92331a130..f01008f86e8d74b7e78570571dd8ac44992ebf5f 100644
GIT binary patch
delta 1541
zcmXZcSxD4T6vy#1HEx;aQe%tSXqu^6IWDC#E?KBWh7~1AK@^deK^YYm4E54ORMen7
zv`ADCK_EygRG<Y)8$?+Vlu<oc7PJh#MD_jUe{kk=@83J;f9^T=Kj)U;tq;6OaCaE5
zCf>=se~vK=;KMLJc=bn^jmH68f`b@|X?#Rs4r*TL%>6itc@4(lI#k^4n2Lw794}*`
zZZ*sxmJ6vwn}&IqjdhrXZ8#H8IoEq}HS-bNfz{*8*5Fml!I)^XMqGdecpP=(`#1wX
zpbsP2RgSh=#vqXkn=u31Q470J3H4zvzQqj~9b+~NTQMCwQ2}q_Y#c#-Zwk9wghg0`
z?O2PwSd7sVNI<1t$RHnEQGvQ}4nB3}F6yYA6rvK`f|Yp0nLkD)`~x#FDW036AKlo7
z6wCG^o412F1&?AtnO<U$fcH?ndx5msz98MP5K>+H<6Mtou>!@Tc9MdfxC(dTXPk@c
zDJ#XWqc{&wqvAb6B{Y~w{iib+;(`}#;%EYC$mVT6R$vX5;UQF@KGfOxiKUoK*6RHl
z%)^7uyc@OC*I0ld499Gb*?AYSJk+16*|Q|G#rP4GS?=V~Op8$Sa%WzPY|a{xShfjO
z`gYVt&Z6Sn!4h<HciL^`sHb2VD$y2Hq8$MSDpen5;}2YpDO1gMV=Fe|2UKtU^lKGv
z#3H<bIul<}|4-yDJ}f~!HQSJo7Q{5Xf?D?ky%-2F&=))@X3bcKN~j05qxV>bV|j)O
zu>!rg3w4@1a3#KR=03hu#e5%X{cWtq@2JWYdq*p?A8B2{t})Od`i9DE7HQUFJ*q@!
zP?dRrdb~ndh3Pzd>g6WXVcd#p)gI(n*a6heJCUwhw_`tQ-4I6V`Tz8PK<QDZ{x|CI
zxoNB)C!$XG3S_wrqY`VT?))U!NmPOtP=Oz#PWemZ&))Gt5iOkEQEbaV#jnCj^|FD1
zDsaMa0QG~T1}cHss6Z{K!*dK-Vz-d0+YpxEUkt;N;H$8uE(>Oc|8lJjrbJwKHT67?
b@W%%Io{JH_d~d$5G{0xq(-arnnpOM{qxhr2

delta 1615
zcmX}seQ3>59LMqR*xk&-9?Ztvu^%>Uwz<QGtvzKTvgIL$NweK)-PxTrLb!j-ABcZ;
z!ymFGk409VlcMC0DPkxqru>0Y9zw{-`_q28b?@t(bI<SG@A-buxpyj0R)zXUM;<X=
zHM~=K4-7F2;Y$x6yk10`jl@1&f^Tsc=J64Og{Xdo+h2xB^w(fKZb7ZP7boIzEWuki
zM?dw8Ml1ultmegH%*3@g4cl=lUU0{IaW(w`+=?rQ^J91)vv9%)vua$7v+*SAho9pV
z{D!k|9J|WWR+rL9WMDg{<3ZHKZd5=|aRz?ETJ(-Gn~r;MGM+^(*n`<PfO;;IT~**h
zT!aU4G4^5sdgBN{sa`=N5BH!J>c(7r<MtECqjpk(3UCLO;R(0jj|zBbf>{Pm!+czZ
zk=TwT%l0Fiw+>9fP7Ep1n>0q_GgR%~A!W8dNOjD^mt@ysQR6A7g(jhPl7mOF9$WD@
z&ctTYN;0eyeRvVI-YZl<ZxhLX8ja5kI2b=>Fn~N{^R@^}aSayXG1Nj&QD-BPXbUkL
zRr}4DgB@=FE^4PA+`cDyFq1xvV!S??{GW<23ot+yEp8n3LI)LL11jPcx4+Zvw<DXh
zL&)0Jg(|@{)Q0*{>-@s`SV|O>-FBjG!+uo2XF@a-@nclV{$eKPjyJ2qYTS<Ju^Q8;
zmukENS79gS<5$$#$YgbWUx~A@4Rw3YAxqmMoP_UD^FqTX45r?PdSE#=;yzSBA5lA+
z$Q>%e5}bp((7|rhseX(rF@?$MZ^3fBj+*}y7hsMvn3=6OU-$n84b|`q7GO5vDY81O
z!~>`dy+CCqiaV!k=EHK_fU0E|>QJ6VmF_ZfOzbvl=TC4fesCR1y<&9#y);zg4A)%L
zDW8ivgr!)FRd^H+Bac}+`Bq@3k-rA(MFsd86+jHT(7K7pkfkEYv~nc-wh`m%Y3!y^
zhKEoYc<35Q;q=E-gbH9YYN0cz!}9={YTuFUo0ls=(+ZK)S}l6;c(}*2G-6#iDe6bW
z`tYde8xb{E?nf8Lrq%_wHPt)K!8WI^)nD7@cQ$QnXz;f>Ex}+@_-oSDXy0rnZ(gDA
j%BAG>@u^Orw%KV61pH30rKQ#1_J4lh-p%mespbCwpm(`p

diff --git a/po/nb.po b/po/nb.po
index b5cde9549..41fc4cc39 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 d16154001d1403e2dd8bf456e092d38d5cfa74ea..741a49b4044a821d0fa2acada97c516af77acbca 100644
GIT binary patch
delta 1542
zcmXZbUuczO7y$71#QrvCZswNd^vqgqr?hrlQ>RC5ifeXJiRDU-La7KWONv;~2_Xur
zK^*3V3SNzB7ZHevK^M&mg^U<wP?3S&NLE;`F8cd>INxDAzxVyV?>z7GKJW9L-~9Le
z<sVvW#*@!B{|o$IxhkbHKd<%WbE-b2Sv<{6Jj(`l`f6l>G4IRfCC)P+;vDW^#C@6z
z`3Bc;l6|q%MT6NcEEMeqE@2Occ?<XQW**9}Pw_$XOMI5=uTE(zkFmh!rj$mwg3I_e
zW8qJEBQLPX2D>W6R#zF!b>VT|#8JkBM;Hm6<gGl%$Jo@IQa5*VF%K{Tp5Se~#Q5EO
zyV}4zImA)k%_;V?=^6<{sRs>uxtkH_2$ym?o9EOqcGAa4@JX)YTiN^zM#8_di|s8I
zWr;Q1OT|hr(&p1X&gU4*k?Fezt^9;>cHhu3r=RI`(hOBM{hM8H^l$`fVeF)X2e^gL
z@h9HSN0e1D(irdHVMe?&jD*h4RsTf>Ke~`-y0)4?Cv840=UNVN6<=cnI?3pbD;(eg
zS;yIL<r418<{vP2`W=^XhIQ;|OX=gBSZ(U>IMQ$JDQ#x%x@v}77#Z%!=1*kvJ@l7G
zeTk7OjFL|>&o3EgewmSYzttoD3yh<Cm67-)i<~YSMAOt>U+sY+cbf0wD?G(r9Cl8z
z^Y<C|&oN5B-n*6OC}Zb`ILOoN<E)NqqIWS89bvppFViEbJYlfHV2We>i;>xW?@T=S
z5eImIE4j#dMWBbck!6nXGu|8b^VR2`VZ?cl>-as_u%olO-gd5z_kY}=<i<4PHJjs|
zx`(T|l&>?cA7||FJR?wxmX9X9kI`h?8BO{Wqtwq+PU#>OIenP<6{ER-VMDzCe;CAB
z|Cilp^lSZ?S{OU;;$c3@H~9~jbH6ggf>Vs6IK$}f8fA-k&5WjOXCyvIKTUfW%{|WH
z2Mi_*Hu6_)V80HD9lyk3zQZ`8%bA7l>Vi9|J<>t0<uTTArn~ZO?WSC+bk+Ttd$`h3
ie>}JC=-2h7*_Be;M18S0-&-8$J$kWiUTdY$v+{rT8l`st

delta 1616
zcmXZbOKi+h6vy#1w8pC~rS)j>_wH0n$D?YfHd0zjL?u*pVYI`dI-`x(LXCulAS4Er
zlnMz86_3<=MWhQBBB+oc;u*0Z9znE;@6Y@v?R@UN|2y}8?m72%EqhxLeU+MU#Q0S6
zpUHn$53?w~NaTypGp|{He2$Co1NKHgUwtru>X*3vC74EkB@V!P)Ve!xB(~sOyoJ;C
zsy{T68JNs!8CZxuT!j;H7f!%7cl;5qpx=cJxV$ef!w$^G5&g_6u?(l-Db$NQaV-A8
zsW_BfWoxVDGzKxS1;^oD)WnOZfF9!{{DMKuNHWX9CLDujQ48L~9PC2<&d07wa6Xpe
zUM#~$n2#AL1fWz`(C}juYN3lb8Q-}5f#gv;DM1Ce4U6%F+kb@$xaUB#@i-A@;1W#0
zT}ZNQ53+eXgu}2Eql)wfjZ}Pss@+GV%+`%m#}au+b}bn-J`A<cXw*(}@hH|}BmTuH
z7$&VG!&)&9&!g6Ri3;e$Ao4$o##aU$956T@fFIesm0}UD#M#)4TIezAY$OnE0CP~a
zUyr$X$nD=o?ew$TPfU+zG7oz(UYkz-?|97W7@#bcJCt(Z98{zSQIQ^V`={N08}esY
z`QoSc0G0ap=wLtIs@mtEHqd}t|1zqCw^18-AEhysM$+*3;VDKx{d%myleiOmQm0zn
zjmp3$)bruot$f^p4qioN;3>|-gc1L*nU$gf-Hr-0hPqYJn>3hfudx8T@c`y?XB1cm
zYT|DU;3(=f3#(8I9mWNC3oFs%m@UOB)Vy=3b>3ky4jCQ4|CPx5qSj1f4i6q;AtrIB
zblu9a9Jiuw!(Dg$8)}CmIr4LHG3qexLmjqe)L}h?O7$fqHtR%^Z9iR8c<9yr_t8+T
z{is?8{y(68$how|sGYCD<Jf}xv4HK*#17O8yHTa+O}eyR5o*0M)Zwf^1>S@#VQrWa
zqVbT%LVS%2Fq@N6f(@ulTthv7gDO!@R@@Nkg{{aju};+duULeczW6Dx_QmceF7i~x
z(t7>!td1pluY0Q7JG_O-nKhBk8)}_!WRp|V7z%C*IcqnsTNi3{Hbx>FV&BuQc=M(?
l{(?YW`-Swh)Xcg_*jXP6h22@2<OGA^`e0os9Ba>7_zwU!y<7kQ

diff --git a/po/nl.po b/po/nl.po
index e66923a1c..c8024d8d1 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 a46d03b03b76ea722b48742106fb0e41b6c8f6da..436d886bb4cebb167ba675cd1506d63cb9113849 100644
GIT binary patch
delta 20
bcmX@Wc7Sbz4<oygp@N~2mEq=K#<z?BKdJ@S

delta 20
bcmX@Wc7Sbz4<oyQv4Ww6mBHp<#<z?BKhg!<

diff --git a/po/or.po b/po/or.po
index 554f68128..c5b0ea1ef 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 92c727f01799a1bf66a6d28eae4053e09b36230d..287116282dd4b2c7425b7a9f72447e92aa25c3e5 100644
GIT binary patch
delta 1542
zcmXZbU1-&17y$71#B_7h<y>v8wzXB3JJagSE%(8(*s8hpVUTX7l|&Ii8I-IKZw~Cn
zN}9w$3+C`jDX+vKVRfYrioT@`8dMh%h<1~cuKM^r?msx^_rCA>?|q;5d7l6D*hgDS
zzpSb_ko@iNY4%yTCZ!U;TH?#!=anff=NBC1c~-IA*D~fA^X_b3<n`vmT*;>x`@YOp
z?&C%tV|N^N!JyVctKDwmI(Be`cW^gv=XADynq%gd_zH)rQyS+<=DDIKrEToxdcMav
zc#gO7cXqMLt@3fz0fTxA&+|6!VLW)45zrZS@>f2?niVOn;V$07gNzMNaV;+~{;$cc
z?q?5&xrdv0n)k5gS^-3=2Mr3`#n|XD@8r2`o|DJ8NjD?F7kD4v&F0@Q0=~@EY^-xA
zi>%;oN>+M<E}tgZ#3_~{(hm(*@hqcuKT(;}pH!W6g|eIe&DNKBI5w(d+@ysExrMLt
zBJbkU(kdBgig)u6W52H%0iCax|C<edv(UzL-C_XkbosP__i~s6+{@VL45K#|*w1EB
zNA1VCj+5E^IOC@CT+b_9%8mw&n6p=d{5v~+)|k@6{Eo_#T5ec$ZRSAcC|msg1nrSt
zXViR(agk5Cne!ZBr_-I8CKye;j}gcT_VACA!3Klo8+9_baDpH3E!L{fOMIV$tne<q
z$YDliW*IlX%wD#N?g5T7N;AU<_y=F{`(KOzI=vFnyrrE65x^v0<0p(17F;Kqa3|y7
zDaL`{Gg4pImeRBA<0G8OyvWDQ``Q<q^c`+A|1z`MsYUY<x^OA&HMsf!BamvXyq$yW
z<_x3u=dyXNSKuM@Ax0DKXEf(DqjX0ZZ^6mTd8%s4S(L=o#CWdfswMBJL3HKgjIMu@
z`YJugQNGFJJj=H^p^!uTkMZ1)bPRGEW8>+}W9&CSMR!XJY-8h^#h&QpgIg^;YS706
zj2eB*NOe_*2e^sREc+Q5nq$=PA4Y8p8X%f?GneyFzWno&(OfF8Uix=#d%30Z<J^wf
dA1jNs<zmB;%C16Np{u_zd!gY-eR(cF_CJ7)q&ffq

delta 1637
zcmXZbeN4?!7{Ku-dO>wXx+3w*dr`Xbl1nj_6peYS=%3WBHCMk}-OyHdE2grsb<xyh
z{$Mjkla1MI-m=wSR#-M{Z1}^xY~E%vzK{F6yZ3(1Ilp_)dCqg5b7_0m4&SSZ!KZ{*
z37=_vMn;MF@I?q;yoSR>BJerp<2xLK4!*{s6Sbdh^$ReDej!HTUetLTaXNNkCf>#+
zy3{WkHU?6dEe<m<5sPsiHsf5pY>f}%4*Daw54VnEG3>)6j1Lzn!u6Pj=TR4ainH(=
zF2-1Pm84tUKqH!gI-HGds6V`h8qg3fz|UBUagiePu>oh|MbruVaUqVN{x6YTWn&KJ
zVjHf<L0pD$;|V}hy@iGY8&D^@hAH^Q>Q5k#x|3|w01x6CJZtq|p$0s9g2)`4hfA>l
zgRvP&mb4(7mv)?j-RRRuZ_${DPf*Y9J#x(Q2RR)H;UU=-8|wHJ)QJ*Mcan^!u^c`4
z8y8_UX(bubjj4DAb-tIV0lkYR|1)TOVZgwsNr3<y$mS&%S7RZr#17PnhEQuGm}s52
z5cTXUF&W#f{$13aez5u>_CO|6F_iIgJNZ8rB(jGAVvwJcMK)r1Y@jHMEGsSRERSG3
zzdMQiRj#9+eLw1ke&8mwvw9v@ATdY}YB4{;H2mnJv6M!_RFUOah*@|7y*Pv|n8!J}
zaS+$yYVOn?Y(mY@C)5n25LG%BV-B|CG8{(UGM=lT&y!ID@Kw;zD(*xL;11T|chpq6
z*^U-tC+foes0&6Ifg{+6W%O&Y0EaE-CWvg-aa@Can2Dh*rsiOV-v7fibjSCt2ceX*
z29kq2u>qIhFlr4%as{-Xha0dFwHOCbi}V?C!{jyUZTMnor^D&WDkO=r4Q+b=YyLL~
z1+_YlqgHtbQfG1w^YI4u;9qRT9u6`Kom8U!t`XOwA2onymT%EX{~NMLSu{UT>{~F#
z#lU_V>#!A9;A7M?8kZPIbr$OLX4G04K+TXIxSnA;>e;$c&$<n@i0@$p+7|c+Lh^%l
z`eQ<W2JP}khTRM*>Fo>4uuUs7z3y_O+N?FoJg(AOm$BPhQQ`6!HKytIe~q~jmYQZb
z(w(WjSM3*~9cRkxUDZ`C!`$sDt@j$*+-p|$HJOID_JHZBKlJdZQR8)2=`5z_LGJ;7
HK~l*-kOImN

diff --git a/po/pl.po b/po/pl.po
index ae70fe2cf..831975eff 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 eba14c5182b1da93ccc06f4a42173e37c14fb338..d2b1905bb9b839db553d6b93aae31403998f16f6 100644
GIT binary patch
delta 1542
zcmXZcZ)lZO7y$5dWqP&c-_`Z+)@H5Tt(E(iHM!1Qwww?aIY-OLj0i3UC1I@(7py3#
zjP24sWFQEV20<V(BKtDU3YQ<kj0&s|Ldet)rS+})J>2(l@B2IF@ZR%2=Q+=L4-OsM
zUb(QO?t|nr;<w80+N_i+oSyCC^KCw*8~Ggvd7g9G;xdm#M!!4jmw2=O02gs5W8N3o
z#CN!XpRhX~bxC7^fhM!9WINlqg?Df-Z|A{me2PQ*m-!<5Z%AneKWCBi>r)!$eeB{G
z<H29^R$gQ$=UP=UmbzY}!N7C8jiZbk4>1Bd$vgQQcd>qcN^7`>t2x1#@C)9>%Z&dm
zx2gx(!vT)+VNUU0)-M!5q<WJ^2lp^0I>fvAL)Op9W2~f`5#aOO$oI1TSw_Hrv6V{~
zdnik+<6cTudW9CB_H#K8uo96T)mXw)jJ^AbwmDs)-AUIeyXoI-e4d+QqQ#7rG;)HE
z^Ciyk9zG?ll93K@Ek9z+_dO$^^9}NUi^lH;nwf5@1<*o^PwUvn0j}p;jEPP%YU3Jv
zxk}Wr_dD3m{aODr#!7!>7q4>;+Y0I-XRd<$M}&VbRdB3ZRx8Fw7~?y$emU!pG6H^^
zo}G>|R{9lV@2_whS9t1HmT9}wBqQL{yq{MY3tCfIQQNC$*>B)OzRC+6=dk_R#~D7r
z-Okd>Ji>>#vauGxGnwOzj7@PJXDR(=_Ogc~?B*Dws4J&6IyL@enXQ)B7B?`e{7Xi}
z7a0LGHP@>CX~s%l=P=JPj$wOCEwDEk0ZeE8I!7e}-pZJ7oEzf&PuCi$UJ1wE4)QU+
zmi5mv_U=DMs=FM4e(q+xqdsP&_)|uao}gIMH<^D>GE?5skd(BVi@1>s<NQCW5!JYh
zQPpL}-tJ?Z+jn__=lBN4yp8%;u%U6^5KAmGYUUWdD$*n)lc(sLuDVEaDoAS-cMrF1
z*VwGFi4&BP^fMz9%lvyYw=jz3{me6r)aI3ZyjuGh_dUs|?!(3EFS7@8soFZ{pWGAG
j#{6V%<oJ*I(t>KKa3tT^(cID5+j0C-;Y>qyrnvTh?&_wG

delta 1612
zcmXZcdrZw?7{Kx8q&jZhbXiIK3e}0y>4vPLJFSsc?wi!XR+OXTI*zRv%|ALLTgv=%
zHe+mZo0+v)Gn7r(*f7Je`Gdv8WPBgzch)(d_j&uB_xHTd`~1%Nn(kWn>nZ*xh1YuC
z(|C{hiMa7)03W=bTSX@03tWaDa6H=in1H#caj_X!VkGe@48?7z>mJ1E*p2yk3$yfA
zzZe8Fk;ZDVn1?o8gGtziiFm=BAI4hZG2DUG6S)}<U<$@f5?PJqn2G05Z~P2r;&;rz
zXm*vNTdiOa&crU9g&n9DUPevm3C_VUSckDeBFT6F6VQvg;C-BnW2oP=v8!S%!7}W?
zava7Sj13_HE%izUc07Q(&}B@+w`Lqh9d#$gs0r@D#n@xUuTc{o7bY?rlQ0`A(I4B8
zV#!ft^U{ei*o$t>^d^HT_!RZ*J|f2~e~{CW0RBmJB^Y%+26dr$)SaZ_DQrL|{>FK@
zow8C4>BV%sh`Qb@)Pz2SQ~wzZzA|B8XoN2TJF<Bx!vb7|i?9oIp(m)l;ZL@?I2ZNo
zw_qxEnsGnsPCuJ*K$NeN=@`g-LlpHNu!uA=p_$sFMV4X#a!hgzb^f#&d(HS7YT|d1
zT;v_<j(?)|Kr(k-fi+lxUextQP!qRI6<LTjHv`>SJ!a!sEW&5F7h^b|PW0ezOypTw
zg1zX%H&}|balQn4Oovb__Xp==9*=;5F4X&+!Yp(TGSKd}u$>G{#YWtSHXKCl_8+Jj
z&oF!mtU>MmZq%LL!POWN?|U4#q9)dlnt+vyH7+ncf~@D3AqM$+0WGYSqMq?#T#47s
zcml1TNt}!Sn+uDGdr^O@-lCTH6Kb=LA~}m6kA#|l6jch5qR0je)#rad18uhBs9kvm
zwY$BjXL|+9@E+dAkVKJo9K-^w;z0Gf6PSly)Sh{d{A9=oY9;?7e`2GY6kVz?#KEA2
zftK(P7UE;nN<{E2twc4JU^{BBJTMKU<+ZehNE^sL%)u_y>mOktM$GX%2v}xW>xm2;
zwXE|5S#Ma@_YGL{f~VCtyP6t|?ai%5z0*<G>M%CBHg9$~jh5!-CeOFXtJd^P!@eLl
iz3)=g!|>>qyH^_=hSRar;oMc{G+f)v%ROsTmj44Wf4)rs

diff --git a/po/pt_BR.po b/po/pt_BR.po
index edd0c130c..6f1685300 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 6f2078a3345ab377facc74f7ee189f1780b34008..62b216a4b0caedd77791c3b4055a54096efc243d 100644
GIT binary patch
delta 20
bcmX?TchGKwgaEsdp@N~2mEmT20VRF_LrVoh

delta 20
bcmX?TchGKwgaEsNv4Ww6mBD6t0VRF_Lvsa3

diff --git a/po/ro.po b/po/ro.po
index 8627528ea..9821052d7 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 fc79f5f130c48ab396789bda49908c21a8fc31d5..def8c09f2a750230bc2d1eba0bad4510333af7d6 100644
GIT binary patch
delta 1542
zcmXZcZD`e17y$5dL*3TW($#G4y)xaFy3ILlc5_*_RLYmkNs<vsZ?IJxMToRmQHD*3
zt0O9BeF!56g7reMPt%n_CR7>}WmGUE2ZpnvDEd9^Uby#np2NN8f6ntf=f2TB(AD?D
zoM{J=*LLp;@5zf&>f`6reRv%!Na+%O#&tZ!Le}~yVm%{n$;Vk<A@1O1yoa%FH><dp
zH}V~}#G}p_%ra4BwQ??E9oKRJdwDHi%g>K;tN1J*=gk+V)X5K6&zZ$3ZQ}|q<;#o*
zkMU~$!e$maRec<Fr9p{_2Y3y4F}`?+v7sYu;A!5+;+ZKeWEZdEAY;Lgc^%I(eplvH
zw{RIdxQn-Ol&vhj)CMBes|}ji#aQSN7xT+}oRP;kNeg3x53!vC`S=UQhR<_8=g#&}
zW;u<$l&tg=9X|E5jQiLZJAK<=4v#Ww_YIXfO;B~x1<G#vH$PwG%dyaG#z`tU$Sv&Q
zuUx_%(kdBg9~=2PW4+^y4V@~H|7wFDP1G=5KDB{bI(%BrRqWtOzQ9=M2%|S9*~SXH
zj@ox}5&QG;dyJEQ$ECc$8LTT!>CcR{O66ZUQr(s6!xfBpn6jBh^YK^t_$Mwmf1Z)@
z2CJ{(2FCmWKF8xc$j$Sn);Y)M`iyjMW;^d>F7khu!8jjg)?FFlVSde>l{UlcwQzL#
z1mENuX}h1}j0~->N$FAU<&*rIo7hu3)vQOkO+3M^yjADk#J+<D@!-?^oogK{y0u-W
zWx0nt`3a-84LU5kc!;lXJnu8^=&Rx~b$O8QGagv6Fr|C>1Y@0(jE%R|rL;Tl|B%5J
z6XgoHo{zDYBfNu+?%oFWaU)OgdDggVQL4jvKjd8T7;oVBdFN?}CUGaDWG_;6(z`5=
z`~Rsy)cR-Yr!<+jXmLvW#Z@fKC<9N3N0!(mUuyI($bYzl)t(X?dYZA`05@@ntvtuo
zT+r<1@DUD1?ROh=vqX!A{k)yOaSvCuOf}0fZWLE6o9cxwno47QmVfd84YcOIoxU!U
sa`R{Wk-0lpS@2P2`|!zv?5te2^sR#CrkbYawx;1Tr9IWT;nuGI01D=}3;+NC

delta 1636
zcmXZbS!|3^6u|K_y4psoTCHk*YHPLH8P$?fTPhV&TdTE&RHqd|hiXM^gK0!cUpkZ!
z+XIo<Q`AmEZ4Z2-m1u&8J|K};LX@cRKjxcc=6BAWnfu*)?z#1Aj#ql#_6^=Iyq54D
z$h)hXhzDPX@WJa<m`E>d#~Jtz!_mn{cg#V}^Q^o8qsdD!0@t9<yA2cZFiyl9I7T1!
zi@?r6I<v)NE~el@9D!aOj%Td#7g$W*h3l}e2M@y*9Ek}%MHb+6%)}F@4}OV5@H>vi
zSavm1w>py`ih&I{6zfobcmZ`mt(c0Ru@vKbizMS#Ou|#B6F$K->_Yut3cJd~X_$|7
zI2~VLHpcg10b1&L1Ww$FI?)A8#||rxq>j3iJk$kl#L0NX%HN_cI4DwN7>>X!EWlv&
zBE^#3$mXR1<M1eYbfwn_`eGaE*}X@OS^glWBO!cAb;XW49)~*7VAP$A!bWsq75>Hy
ztfZ_ILyn>Y&!W!v26aL2qNx8Mf-ejh7|}1V04K6}$;U}pg5&W3>O`%my%Ef6b1)6{
z>{s9@Y_Rfss5|{=<smVFN;)u<aaRoW|7jCh#Q?`5u2_*xxE?kCgj84lSh=0qG*7^>
zn2uWd3Y>;@*0_na<lzH2Cag#OUn=F+?w^43aI@CGkl-24$0Y8`O5BLIumjuhSb|6s
zR@2Jb?a7qw1a8MNOfmwM+J$cNhqwW=2aC+bbEr-G7Z+eMom-5a9RyPdUZFmC0NeS2
zwV02a>9}0Hk1n*)VS2_DsNLL-2Qi5|s@}vySj73Pz|W`;EaB<P@FMCw5h?!{?vWaT
zEey0{5f*chGw}?r$4;DutGI)+@dnPp9^AEExES@QIxN3pe{yYv2@q>JAD!e4$ll}u
z#_9e4KtT1STYBJ(5|RFr49h&+N4^llZS({_C-2M<S&NSx+yorQ>`QSG+VMK-nLoz4
z*pAtlI$C5ZF2~4nf|CS|*o>7pD>LA2EFe!C!`;PAScpMcfeMtM_QGl8tN*iWp2btV
zSdY4p$g#esAv0`?e9@tuw#B~QVa>KBO)X)$_JL*Yn$<3&(p_zoRh5@kmmAA#Dk{pW
zjJ0m}YTvi$%VCa8!#OU;(R4nhYLMfWdB?nJUh(fV{5uGn&CBLR|4#p2!@T78`fK@S
VyLsEc$GmQscl}=TrtfFg{(tJ$;Q#;t

diff --git a/po/ru.po b/po/ru.po
index e192a1cb8..6176f5542 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 809c909dd3467579c911042313979fcb4805ca5f..2f9cedf8504cc30dcf16c41204d555396fd906a9 100644
GIT binary patch
delta 1541
zcmXZcZD`e17y$5d!)@v|Q&*eTu5Bx|U8i=pS-$Kpd)v&i2yRZY7y2>+Gbnr8C@w4`
zFeb(&zZ6W!=#40lj35ZyDueVx)S?87@QY-hQX*v0@8SM0-1|G{+`IFCp7T6slMfy$
zSI#b-_h$0i?cMHu@rslx{JzeI*U5&In)n^JbC&bj>0<#4jCp@HFY#*gVJ_w)jD4Tt
z3ck)ke#riK)OmwN7FO8pTCQa`@8)Xm<0`(Dt)Jjd^9y{McPvb4grBj%=EjtEaU=Wq
z2IIkB^Ln0RFXzju5UFl4Xt6NL8#vDR;S?jFX|CaKe4LHVDc#7u?BZd@hF`FU7Z`uH
zTvm5-1BW@zZ9Ku7*?6S@;;3&oC~_}jqbaWA57|8D93zu{Mu1OnD<`x0X-2?*b0yoB
zcqmJp$9;5I=|xIDO>j96vJ#QLZ?KdzjN1K7Wln!lb<!m|-Sl6!zQB)Tqa}<?@;uBk
zpW&Ze&qp1r!$=2t6W?a+cZw0vY>V^1&fs?o9ZXl%0_ddV(=EJ}!`#Bx7#mG9dgCHD
zvt86t`w_0?L^l7Fk?9%s@e=FV-D;e(SF7_^*0gF_N_Vl3k=Ym{@>jEYHJeW{HvE{%
zn7(B+=PaYi=6E05{b(ciu#HFA$uAkDJ<CX>xpGbIIt=nQ3or9Ye#LS2sLykJkMVup
zU3!*}F|N^%jAm@f*KW-KH<^!e1CKD8be8eJe;G|$5N)hiMhxPMaX!zFSY(&FL=DS~
zuHDbb=oI7V>pN=yGuH8b^8<W<zw%!8NOyo^j9YL#^D<+ft)9L;?*EuUEX*(>o8vAP
zv~(|D;Tj%iKmTAHaht0U-95@E*&a6W1<E1qX9wS*n9~fG@f@Rcb6gzvzsa46Zp<^f
zel_(+TF)U4@e@w+080uUft_S*beVBt3mr=YGQjAaZH&NoQqpOH5!g{iPfT;DY;eXP
zYSyKY(WMWw#6#S{(~J_ech{O{2jiq(qVlH?ILL1p*R-zsOWi%WR9#vBPwt^=zTxxS
g?qfeSlonM>t?xGU7CVZ)n~TTJw|2Kw%Y{w<1BaQT!T<mO

delta 1634
zcmXZcSxA&o6u|L2?pc{jZkhG9+Ekk3#$;(pnqq2Xi?%(CI@vPLXVW-kQA7D6LR1bV
z6a@q2OOa59610E`Nzj88v?@ec&_hLqRF?e@^9_u@d+yBK@0@$?_3W0@TfHN(A?FpZ
zUA$-Wo(NLPi*G~u!|P?ZQq%Aimg5*kpoKqEFdro@HsVT*C$7P0Y(iQ01kS-rScrEq
zM;`TyK@<}itd@cWXvXcBhHbbQuN(8jxQ%!M58~!X9)^Rs6jP@vRf}bqjee8|zrY3f
z1G6xRs+LNr8yLhf;lYL2f%3&3l!Tt)GW>!zOqs6K5<HIcu^VN<AzY3VD8DmPRWX)e
zDRy8P4r3ms%pd{T>S_iSJdUzZ4`$$dBaUGorIKQl1drfaylliHC<zD0D76UFFc&K^
z1ly3!Qte3bsuPp(3VJ2eeg?7l9Hn<3kv6NpNOx2yAF{hD3S~YSWubW}m89bZY(N+O
z!4>FaTiFbC1vBvm%6jim5*mwR|K~FJ%7li|GXn`&km6M-uE82yg<U8MJwrJgA!M76
z%TapYi0RmA#1By_{cOac34xu=#4zR?64?KrCZ!HAL3@=giGHCIrNUm63LYBqQzL$j
zvhXLQohpbx4rvU^VY6Zt)}R%;F%d^`9*(25IN3WZP*EAmwP?j6>_-Rw#-rFspIY!e
z%ICG*DK}n3`Q41vz@e-{Gx1?uiGIw*Hz<cShU{bqb5IVe*Umsb=rlgKgC62BwBT;~
zBfUI>a(W-2R1~2FT2O>LiTB|~9K=l+Pni|ih^w&|<u-gX%;TY~<5kBPl*<<a6KWDA
zGb=~B7VVgY_ff9lH_X9Qu7YfFHHM%crDfeX4R0Yes0XOw2$H*+#3Y={Rf&@OZ)Ly@
zQl%)TvKHl(*CEG3?Z@?a5_|A5cHj{jE{O$m66Fl!q3l=*N+O3*&Q2Rj;^&a!)jgEN
zMlrF0!9ND_fP^K1p6$kL;w~(}Cs>J7Xsq<E2IcUyqwG{4%D>nTScE37LLsihNIc~m
z3f*AZ;foI&H|_LI5AQSWx;+?P5H-7AZ*eqePTj55yX-c%U8`%^v&Zhznswdb`ySsL
zo|&y#tofO@Zzh=IRygfV`d){wd0O2b-L-G<nx@w|Y=_X(>e4;V0l&vqZ{M#q+nNTh
Ky6wJ4=8FF(a>-W!

diff --git a/po/sk.po b/po/sk.po
index 21c306b27..3f37ae0cb 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 efa9a38ebf2e533ea74d7bcb7033021c316136b6..a3ae907f809a6d70df9dba887c9c74d1fccc40ef 100644
GIT binary patch
delta 1542
zcmXZceQ1?s6aet&%Jgnc*XC@^>E>N!ZZp$euc?!(meO)kD?eIfA7l^(87wJcV3+of
zL}VWq7o}iPfrQmUBBKAMMnNW|*%y>S1Ve)$B`S!1r@a^M{XNfn@6LP9dCt36wj8;m
z^5g89{mE;G_k8b*(^9JNi|IbRKFg;xlb>^dXIaZmA9d_u>`U3c%q#5s*~ohtaUWv`
zpW|A-!&2O8(xSnI4$<au3A?$8i@2ND@<4Wdf_K_q;4n8_meLSEWDjT6r*s!raXDXN
z-1r2q<}WO=R#iPw>Kcn?7arm@9AW(M5F?>uT+E;N0PAO^)Wu!Aierp`AM-k1VEo-&
zRc+)7_H%@{aDq3m{&ERKt8cRC<t|2`L%g0}W&4~yMkOUif)8^&pU?JRG7|oS3wdRe
zo3hLr?xtp?r>OWe%DLRfN@RN2Vm6O6&h8sJ=JXq#PP#<hP5)-s>-;zZH8Cn_=NPx~
zah~T=-lwgak@j&J4>IDNWF&O9S^pPUoO7YTG-oP-PAWdF<U00q4fiqv9b?SKMfP#N
ztmEv5xP+tGew<P14_wYmoWbrE#pT3m(SP?&9jz&CW|2|p(~JtA&G!4V{p*Y~K0?h%
z-!W$3Jfrmu?zWyKuHqAP&-5PS=#Ddvc9Ky@Yo%>!v57?&M!1FVa*#1e_v3a(OUHQ+
z&v6CIo~{3%60WpAz^L>zV@UJuDG8O9F%sO&0*4t-Mdf9Scpg9CPX5kl;a1;9rq3`c
z8D~uIB%|V@bBjc`XCCHO`+vBOg9XX)1>Ve)+{QVbQ;9x8vr|cLSlsA~ZyA}li9W#F
zxR|f9#1o9x|II!wGV(D*J2M|;9NCi;Dvf5o#puANEbwQ>P)>6m4e|UpTEtW?U<^kW
zH6bl!wER}S#y#A_R(*`b#yFD`?B*%P?EJ+@q{e@(ID$q-yw#L@8e+`E2-j}6c+p}t
zPcbU1bD&Y_Mn(&V8IRffj1K+E=t!IB%^YO3{6W_8&93VA(+6^?x^Tvyxx1_F`Hylt
fj((jlH&n|lZ|94>h2COc@6pMYPnxP{x;Fd=GlQa9

delta 1628
zcmXZcSx8h-9LMo9<(B1?nxd(7Ei=s)_ewD<Y*QlA_JSC73e%afX_N?T9*QV~2!|4i
zgdpl6X`!MWddP>2qMf1*3fe3R3L-M<`(y6F%;%gldhUNYXL^@)*9KoFL>x4{*7Hv1
zJvhXeAij*`gV(cYV@BX}tj6~kg9UsH!!p#o%APO5B<8Dd6naqm?!d8l1ZU$_EY_ob
zGjOsnjos3)0&{T<PQsm-ji>DOhq#jYAa23BSRRIbI2kjB8?zc0VG$lfJ@^Suz@J!%
zDP%QSsn#$^WT73iuoLx%XHWq>!aV$jE=-FvCI>rkJf1*pcpInSAnN~e$*KzH<3jAj
zMfea)F>NFPsMNI#3a|sU(HWeEZ|!+JbyOx*r~tR&96V~zU!wvZ8gI-*oP;H~1S4=K
zQY^CvN#1l}D)wMdkzQtyfR9nV`+&6B{6)HBBKeZ)8YgN!6}3?&DwC;r2piFle{ec_
zDJ#V=J(!QZsQq4{0(zfF{l_u*&Vq%bMu!6^K$15Lu@YBdId-EqdW1R~5ky;tQ&7F%
zgj2E0p5H`eI$+Nulf#wF$0*htld1n#hcV485QABh!g)XsD&s4tOmErq`}X_=s@ETo
zBAL-VMQ0%!)q=%12Yomb&mu9HPpB6DL$x?7I3}D?o$W3x<co_~iyv_*meZ#VxDQp@
z0o0XE<8GDUHdIAU;|zR?Md-{3AJ%!uR;C#h;BK@q*vmlI<1Xr6e!+UoV^O8tkBam<
zDw6@!DbAvA%GiSn^nmR<tYcnkg<IE&70ml_0mft+vmBQqfd<WS2Bj>##JQNru8MpG
zR^wjG!^c>RI_fHY36^0!>M$L(J&9`BIb=(7!}blT0uJhLVLHa?{#P*IN}3wf>0FCC
z91Tb@%w|-{_uyf?j2&1<9TnIE<fp;>#axW#*Ggxn7!^n*=3otKzW|bp>B1y8gNqDi
z;~kuZu{2VdRiQEsqDt6{s?=vxg)-Sy6<L9a*og|X2P^R&#-KAd)E`;xSQ|=;`sG*`
zii^JFSbx4Ry26>>;A?AXw7kB6)!=u#0&c6mZR19_-)i;wT0%dPE=1=SSp_r8^3R`6
vz80V3vb=7~<MX?%wylA7m%k~{WNmk~_%^ZXZfx~=yiG0Mre;^jl~eN{CnCY4

diff --git a/po/sl.po b/po/sl.po
index b628aa4d2..a581fed7b 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 5fc4d274bbf607d46230cd368bd06f87c1cb280b..6e62dd0817c01d29eeda9a6066d149bf380a7e71 100644
GIT binary patch
delta 20
bcmZ3>x|Vf=4<oygp@N~2mEq=K#wbPrJB|e$

delta 20
bcmZ3>x|Vf=4<oyQv4Ww6mBHp<#wbPrJGKQO

diff --git a/po/sq.po b/po/sq.po
index 71792c614..2061e2be6 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 d431335f649670b3defe87d78baa56fb1b208684..7c05ceb70be3eb5be2da0c49b494b2e9613ac68c 100644
GIT binary patch
delta 1542
zcmXZcZ)lZO7y$5dOPy<N>0C3Ln_H&2mAN~2)iyW#>uORdl$I-Hm9i*T=8{;*Vqf}W
z3UW&bN79EN_9>E(s83EIneIcNMUe)XF=ih^M?@6;9`3zx@9#YCeeZdn^PK10(U;$U
zY3M@bj1QAnkM~0FYuBYT#4|H}czs)v(v3XLZl33CHuxxI6C-Xd#vQy_+{HP3mN9QX
z>$snt9A#@fYSN&>g*vm<a5)?K2=Cw?F6EKp^%LAIzQWyn;D(g8@Jlwayey@sxP~iv
zi1FZ4T+B;s;cTmFilw$2%yVHUZ|5N6#-ogc#&{<$vX^D$DJ|nJ-p0d>3BTf9yu$e1
z0;_tEId*Z75Ay_9vFs)ZM5*sL$Z{8BqNBW<-xcGGI>t&`8433BULGjM6O4qfatY_p
z^-y+j2KP|0(i^n+G|UA&$f3yeGlNQ=WbEDdw9V-c+MP5_)lL5uua~+xCYsAwNi7fa
z3BJZDuHZIhRg83y%^YFOcb1XR`FZNU$lw<j>Y1tv2{h2+(`v3`7u)$ZW1=xeZ(L&=
z7s@*JehZg#xEO!VSm{q($!X4FW3}gK^yX^ykLFl^OG^8=gBF>7rJT}qF)lSr#5G*Q
z6^z9DxR&oQ9(;<!yvhOYy|vIQQ;hqnlskH16F2drsQ)&DDQ;%BvogX@IKj@^LR>D(
z_<oe}ea6${cONqn`j?$tRbRO8bv`6M!>CkcL!oEd*e-sP(X2zq4K^BF;v{ogdMg*{
zsJK4J7dg%y@x2bbk4JcjKXX4{(Rl~>5BKt2XSRp&^nN^3bez57Hb-c8oc|Gn?JiU_
zY9RJAN;t+xx!%S`A|LQ^{>CV6&Y7IUQR=t!HRp4J>v);b8%r%S%U<5YJnc?8%bGa<
zzZ=9v*V{lxGgUE4wwSMS1J`C!`i6gs|8_Q?<CGSUi5_b%#C?n&8K*u=7a3bH&DffD
zS*+$D<(9tSTTdEXFnEF6TT*(SC%J*kv~0u!jDNTv_%xea3#EOJ@y~dfJ6WD9RA3;N
w|8Zt_CgqpR`YW?FUt4lK({t=xNk>J#qx#d5mTY~tr7e4GvU*=#{&cSQe|Q42xc~qF

delta 1655
zcmXZcX-HI26u|Lg=}fDcrn!_ott?Az#w~L#QnEs9!%CxYjndpusSjo*MOl5wp@kMH
zf}n-8WlEwA$`AFS-efCSAA*XAXr+j3`JZM6W`6hF_vXHP&pr3;t~_1U^3vaXpYU15
zcO2h=K_V^K@52wDXI7CB_#7AD8ytdmeuiQyYMkwf^DvNjIr`xS)NwasI3C7Kyo!nX
zsGl@^>4;;rFwDScT!~Y#4Wsakr~e@q5D#D-E*-|huotJ{_~9ZeFc%Z>IO>BR<3#+1
z@fggirs+}_(g>iV2`6DY>Wy8f6Y9h1_z{aSY^2CkY{p1Di8|n2jKKla|3$N^Y|O!V
z*p9jQ5R)-%6cf-?FQH+_X4HYYFb-dN;?d+$SCWl7!HqZ@k9y*ls1qJMT4XX#!6eK>
zZ)`)7B|DJCO9zHvC${KJduaIMBh<Zni)^#}Ms`PhxJY)z7qveGb)X2;mBiwHEW>*I
zg)^|4w2}<zL>rz(9q$F|gx&;@{|Pic(P5z9821G1$l_%lX5n&7!vm-T^`X{=H?vK}
z7}ULAi?P_@iEp8<^t~tc336xBh8FtEg2;a$6<<k*7D;O`+knTA#Y;H<W^Q6bjk7&*
z0j3bIM_s@POvl@(6Od4mtq_L|cpkN8qDZ&imycQ#yEXrdX*|N!dIM*r0Jq^0?8p1K
zX}mkmWtMvVHR|<rp059Ujyj<f!+pH!Q19!;9JEHbGnR+5i5oEuTQ1Yks{MkCa6+WW
zJFLY*ETpou--+wcLIsxVb)17wa4!Z^dAsm5?!jcvY!lwWB1~hys_}qF3+X7<^WR9L
zjtft54bG1iS%#-jQ}_q-u$2wgi9Eo3G&qx*+FJC(*GS#TcN~jDSydKBU@8`)9gpBF
zypJJz{)ez(WM3jt2g*c_sN|y-*=nrC?U?Q*@&i8;CsN`i7-e%8*-q5>1ZvG#cp7yl
zp{QG6!%S?#ndrpnn#vC}wqQs+6^Vzi6#wEvEKP97U8rxmfJEMoSc#h2Ueq^aM3Q>~
zxmZDb1~n7@$&PzI3%m*)ftDX$MUIiyD_*NE_F6N1$CcJJR+SmmH4R2-eR*+1xlz(s
zQBhuR)YjBgIlcy7vf2_1drGS9;<=#a@VVE_8|G!xX_%MHZo|B8cAGa{Tll?T_86{K
i^P1^&?Qm^1yIlv3|3QbVP33!o`+8glO{ZgcQtLl_5b5Xu

diff --git a/po/sr.po b/po/sr.po
index b92f89479..0658a7cdb 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 fc90dbee099b8fe73e0d22c7162fc5399bdeb089..4d4fcb67f8057fbec55a735935b121bfe2609ade 100644
GIT binary patch
delta 20
bcmbR1I@fiBsW7{dp@N~2mEmR^;Y5A_LB|D$

delta 20
bcmbR1I@fiBsW7{Nv4Ww6mBD5k;Y5A_LGJ~O

diff --git a/po/sv.po b/po/sv.po
index 2e5211280..4a36f3eed 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 0888d365055413395efb7b49a4dc6c45f3ef6ce3..bb266c554a937c82597962b4f4974262231c1d38 100644
GIT binary patch
delta 1477
zcmXZbZD`e17y$5R=G<&9H*K2M*0P)1vbS9~m1#J`GTn;w!;B$PkyL_6TG5N+5>Yf7
zNL-Yp4?$wJC@L)M1;6yIKp~8{1t~@Qviwpk3YOIG@!rese&?L~KhOU;&pGGxeU;(T
z`9*V&gwIaj>wLeT6H($sy?;KhHbgAoIJfaA8~F?8bGp`_sr4_h&3J={TG-BvdmB4A
z#6IrjwfU;IG<pnt#V$^9C7VUh@ji}lH=pEZ%w)T+jJTO4KFIgEnpZScU$mAt>W{F<
z=b6uc$i=L%kW0O&kq@?7ri`MWtGJyHbBx`*z!hw4t_EDiTl9A`=e@?we3x5zk@vFi
zs)#ilV<zw^dwGGyEOqNb<>6*#rU#iTd4~o5#6kX7>kq1HCcK9?ah(19h;unbMT%)!
zTg-47qqUmoaxT(c!;<Zats1Hx+o_5%${gRr46u*6g6DXYAM*gWh;lo>q{YTG@8Cbo
zcs=Tzi4=J~H?Whtm}g{cvHEY+C>vPMbIbq>udbejK@R9Y&Me(=-paGJ{=dwXb&0l`
zn>de8^QF3oL-ZH1w0cIC&@RS)DrOv7s{T1JQ5!f$Im9G$;%T<?9P>qg@E$f@b2(=0
z;0^kFnP+B#xh0>ohv)ea8%=(UPjHyuG3RxZmPg#JF~}lcVP2Cjm;oy6=Nu<2U$Bmu
z;G@jnpJi6&ZDyipm~npRI6K_E+@klGhquDq%2{@?R5UBE+bD<lA|K$HnjNyq((Y#_
za-4apf8;i<u(9j8kLx(eP5hO)RfSIb&K(@!VdfTpOY=%GTW!Qz^~ghakn{OM&6k;_
zKTOq(N#@pk%_dfud-)sl(9JOCU!p}ugJs{z0^i^xe1@~^&ijABU1~A#CbOg;Fi-Oj
zyd0R_`ZKiXXm=+qE;ewKyO=LH#k|IUG2;{*gu8e@^ZD1A34KDL;w+ar!11TXMlP@q
zxuW6nvHGF9C{NY@T{lwxdETkIohOepeA8SWZ#&UY?CtC=4)mVvU((i6ern~`{{fv~
BpK$;H

delta 1560
zcmXZbSx8h-9LMovxR#nWiB_7|Qq#&b%_XfYa|yLj2$v%4R%(PgIysgt%!Bk`F!V6A
zNJS4VM9?CJLL?O!k=0v859Lcj5ka(3NI~CUGlS#jo-_BJ`(Ms^Q#-!ZGc_;xwBggl
zH<9n#S;lzqLJ0r(oC`B15{IxFuVFZT#R!}UjDwlfI11x19%C>IweAL7j5~1+9>GO=
z)om^^nRtfF@F%8Y602#x92>9;d+;$fV&QCKmg6Z@@b@qe9drCIs=}p=+b|bTqV69@
z2Y$p<rTT{p-Izj}L}V&(1=?t%7c=k+F2RH-|AHmBl5rR6x${_#V_1cMa0`}48&iN@
zQ~(pW8oyw!N}V#-m{qtP73lyflTl2?Pq-21QcsQRPyxF!4TmrvA7C*4M2ci)klajg
ztT78P1{LUXoQIX@p?#*A3#x8xq>APMYTk`n;5aISK|F&G(S?nyl8uu{vStQzFr4~o
zy|t)7$}kyg(ZUYY9`QP;e<>H2nJB^cs0EVe`}aZ}7BfDKD%}WX;Z$H8$tudM5cPXK
z=HW36#XC3<L`#rAQxfmrEA>b>&5d~KPj$^$VB!gC{1S=9OrswBjY$}t;D6yttYln?
z{A9eCf>%*{=LxDc-!T&x5an*%jO};@YcbNZ(EngFRxoiCbMX=CxcopZ;Gl8&xE}R_
zgQx&6p?)7hRp1>e&~VP2)=9@fY(}-}J!%s>xJfPb6mYSOi%!(BJB>AXAL}rjC}cCL
zv^P+JOrdu7d>UJgyRZbWV-Zf{CQP#YEo;GbjJ;TllSr#QCWN}_!GeG;)aJW|5jYy~
zA*$DtNL9@=sx^Oc4mwCntxHC2zHHR<MM%=74A)}|p2LgSr}JOHS;}DICdS}vR7pRe
zc6BUg?*GE5`?8VbO%sx&IfOg#Eb0Z{P{%ok4WM;eunY%L_diDk^ck0OuZf`U$}9`@
zKoyo^4=S@^-(W~hP=oJP$giMA-;2<(pr(-%VNatH_d4Aj`>ZZ!ueI0JYWKEUd)#ep
ztuCwE>Fn^8#@!9e$+K1$73Yl1#Kpy=wK^@kzkOo3cVgJ;wL80=UDkfP&wa#g_1i9+
N8GGNvuy1zywtqNhw`KqU

diff --git a/po/tr.po b/po/tr.po
index f38fa9009..13d746247 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 53dbcb1550f2fd1d75060dee92638f3e699775b4..8d0b02895c913e83216a421c73d2bc5782840471 100644
GIT binary patch
delta 1542
zcmXZbZD`e17y$5d!@cNo>8vf&xvjL?Z0fe_s>#YSoLh_8Fs-ISWiKB#%M>$9ZWz{w
z(3-c5val~k1Y)oviXdMSHFQFtl}7oYFOou{(uXAaJ=}ZY-rqTg|9$@FJkN86SDzis
z{a!WZz2r0CJJt8{H7VtIti+Gck+PJo<x%$V6wBG*XDpi-^K5b6$s5eOIDsn|aaVI1
z-{L*|oY{EQIfF_I(?pxXW;U{$w{b0R<<8>z0WLK^&ox{yE~RDsicK6}k<z2Qi)|cc
zy!a4r;h$_}xl=X8QRf*<vhWP2b0g!yU5pJK<V^m-Cs;8)rQ12go4JD#@EhL2^NjyZ
zcB%(BmtEY*MLfWER$ONTk?Q*mS~$cAw2QO&Q*oY=$2durvBBp!pIeLbQO1TZaRzH9
zdMP_OhHEKVX#*WTZRTWdV=i|3nL!nQVASqsDs#F()k#+<yXn8;`dAM~poxr=)N%)x
z@J0T`*<2~Dl99G?4nJbVJI>h9sY&u*XK>a+J=67t4K&c<)1ADRU7W`^8G#NmdgC%X
zIMuGB_RHAJ&Bgf_jFX;W8?UgGjnygrm=UX5{^Ml-)}-_)OK&VR;~vUp`mQ)XUY!5N
z7V8%nDX$Z~n+te1xAH?C=6XJPlXCD^#sMy}kImA)n42R1F&O0%*10QtxsD^8UhAsx
z7xwUVt^5f``81!GzDIbHPjO~_N-ywj#*0!z;r1+MG~Y{nnEMzR$yI6L*9;c&1P^l+
z-*>zSaFrX_tMi`aAueRIPWyoCxQ&(W=sWzFgPf&45oad{7*}Q!mh&;5rntG3Z7kg1
zJ&eF5O)0&~UOvR5>}8ER7#mteRZCw|`BT=N({HJpvYwW+hwItF{p{yedPVBfAo1MG
zoDz}p1`{morK_3tv7RURF8^jlCZ#Rz<T3N%+3L!ba|(g>bE)|m#{XM2NW{C3gY0K)
z=zGrRxK=lZ4>BLMTVe1DFLDcq6efD%64!81wvdT$8O>Hcw{W6<s#e;~H+Y2c;=cC$
w>5`sI%FihMC-Zo|w(RT7z{tt6&dPje_3pCPmim^~j+T*g)ope8?d`e$0XIFf-~a#s

delta 1679
zcmXZcdrZw?7{Kx8q$HP=6bb#@i{zYAQHxA2#Tjxho6!YxbZ9c>5|YSV4|19Cj~V8m
z%o)@C!)V6u<g#p-`2*t*HmuRH`97V~cFyO0-gD0Ld*A1I-#$2wmRG&+6MRDWTgGc3
zFJF*I6}}DOjlZ@~k)HSl^YIgQLmO{ln28$a24Xu#6EDUHT!)%>2M)%wI0^6Kczx6#
z2H{L3lPwOjF%g&ID6Gbjcr`HJii?PSxB=&P=VAB|N8_L#B1>>4rs74^2fxB$_zP38
zKf4;OTb;!qiiu4)9P3cO=tf=83mk*raRtWp5=p@AI213TCVYZP=tKQoBD>1PX*dJx
za3;25I>z;80b1$;1~%M|n#hgG_%RSiQb*lMF6sg|V-B7R#P3lT+$B<E1dhTqv|}(<
zBgK+^$mZo3#$p3j=}J8e`ru2{-hD>eEdP-1NC+QNT?t2>k3~&11a&84@g$aD1$N*#
zET^m#LmJSE*HH7lLtW6PDC!^2;0F^1M)dVBz=mvIX5eI8j9FNZn&<`U*$8H}nV5vy
z`&Bp=j|Jifs5|`@h(luhm9%14=1XFze~U$AEfc!K^#1e{ryy;TFGzKzJrH*zo5uan
zh6$*pFT_0DffMmDp2462oGUzs{je|P){P|L99*sSpUc1#FpRshfVdFd=*C7|K1k#W
zMsbw$u^BI5809O)E4UCN43T0i!}ZvL`k<^K{#$ea^$^~|d05rKAeDigqr4M$;d2aP
zTP4_vnjnLdw;5}373xWw4y*Ary73U^aaWIE8#-_eebPLyu?VvgIOtf9OZEOoC;AgR
zQSb2=)WkV7bQ{*99fP@pv#|hmLFbX~$#>*9h?Bd=xsyFe^`#!QQa4f0hz|=eg9E}N
zqz+>>LlXn4FV9eW`xUkK9cW;8?&5JAgFP%F5AZ4R({Umz@wC<dKp!q5j^SYF@7JN`
z+lCH2h`OM^n1j<&L?X3!dl|U!6mG>N`cZ?IQO`p1c>jO8YP1vo#yp&w=HJmlq-*j4
zE3r#DIdKc>0wlxL5|VEzbVYY<w-mX0h2F6&YkU}*9X_zwS?MS-%AFgH;)>E08%vFq
zm1Sk66~=m})8YCV-4tp~HEa_yt&P`XQsavb8RmWSwqf2fo6H;LJ+s-n%X`@1Z8uZR
v-kqk0kw+(L%x0!M-u?RZo8D^g9`m+-Zr<tq;0Ad--WsDbPv_9}DDBLD-dg^(

diff --git a/po/uk.po b/po/uk.po
index 0befc669f..5f8081199 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 43b38374720db95b66004ed7a2a02a743dcedef0..fc8ae9409fff89081a9b65189eef37e7a62ef311 100644
GIT binary patch
delta 1541
zcmXZcZ)lZO7y$6I(CyB-<+i&1Y5&V~v*mW3W|Ng}i)BM1TC-eEq6jq{m{DQTr4<xJ
zQd|@v$-V@sUxHDR6r?Lk%7VZ}6s->tS?fdOurEcwr+Y8E_jk_Oeb4(m&w1|q;jXX8
z^FP)tIGnu3yc@hPUzJjxUoQ0F^?5}~i+P@RafTVT`lw_FW8PDm_wicuAui!g#=aA5
z;w!w3C)pFXx@1sep~-I7v6JoG%2hnT8~H|Q{TxTl=eVB(i&EOo_t?Ses+8{MMy})Q
zj2nN->-jTt%*d)EQr%=wZ{bniz=Mo09%lqJ%{83mL#(P!X*Kt;jYk+8e!!bJ$GC2}
ztOmKBLp;bkd5#-cb+rJZ)cpqC+{f7HIB(`RrFoe;MkYOs0C#gUUoFkQVg&pbS8{2s
zo3f7!cz}wPo~Go}B$x9L^AYJg26g;|adzL*F{eN1bkaOkH~m{$uk_{EsFsmQBad)|
zkMnn~<+!pcMmoeU9%Jlxff3M5z4|vB{A8hp>6&5yt(1Jag|~BvoA?rAqiIHOTxKsD
zL>*_pot>O4&EI8Y`aRcip5<)Ms<uY&%BufT3vVt<=^nn%$TZ`sh_s$DZz#=IF}k^n
zs-3p6o8!#!H9p8`Zez=e|8q(cjEcO#jhtd1=kf*v1|7~JGMwNfPx3H3-7R`#nvuak
zV@i+kDaHmrFn%2?wD@{%;T`dRM&&+YEC1nEHa8d7_i)%ef5Kq1!8||ahL&PUuP{oT
zbM+`6=Dj?_XtJ8Nl%8Y{<IGR-2{!4(XIWr${}LU$llO6gQ;c6hn@z?dx5o_nEqumX
zxkx%MbCB`H3ye&&4m>I~!d*Pd=#jq}N0nJ!d{EUg0&FTd$f(R-`b%&5h~_=d%Bbx{
zgK`VAjI;iQf=qw%d1l*FI?JOx%^f-|9yoPtiaoHGcbh-Mxc&=fIKybhSw>>j9uA6^
zhNutI9_}77$QwMsU%7?-u8N3X<S@@L&c573Au7<zsMvE9V>-(S=r=BAf8o1@!)2+k
qviwTfjzVL_>9Vn@ixqt}g}&_D6}j$~?p$y8)TQj`vcmqg!~X%GSEoq;

delta 1609
zcmXZcZA^_}7{Ku>dLyNz^hQsGUR2I0ELoIlBC(j#o7Stdr4H?6K2&GwgXRl5i<xO_
ztG33p$wZ87`d~ITv1w?_h|Ly8!=(9N>zvj3-S>UYbD!(F?(2D;AGu#{pIqVECA>=c
z595Dsk%%4Ny79*AwTH+uoWMOejh<-cZ3(8L&a<5JJPcr7h`v~lx^FA4!7I2OM{tw=
z)E@>uEF`j9D5ha77GX5D<9fX2Tz`QD%;)d~9$d<g;TXo@YA=z)n1jjKgZjg-FbaQS
z5(be~oTi$~z@LSaxE9Z%esK^rpmE%QU$Fv1y+vZM1tYN^b;BnZk8`Nk#gbJPX5%hA
zi#hlLw_xaU0?<+)U|_};)Qtu)5#KxKe$-Jj$wCeA6sF@<=X?@1;KhC->o6KOV;;I<
zJ5ns^K$4eE490G>YovD=tiYG3XZHy?X8DJlj=1q5)fFGq^<dPEB2Y6)z>8RojrbQg
zVgqHR7}AX<ypFoxJJf)t{i%OAgKsPt=(}<u05g)j?7|&bh}-ZI>PF+Jz2Qo<sThxX
z_D3-RJDu}U)J(rP=Wc-ul{BF{>(znOzn+e-V__8w6G0;R_#HLlOs>|5_o2=Uo%2f6
zuC7C>FCA#c%b0{uQSYdE%)^op5n`4B)XF@-6r8a$NMjJqIb>oDYNi9&h99vDE&Q7H
z$~-1x>uRFMo2b{XqQ&(tIfR?B8MF0s)C&H_2uukV*^R}h>-Js-xePvFI+_fTQ9OaE
zn8a0D@_H=5Zaj#ysLi%Jk~;^jsAoToHY}neoADXyU64!Xmf?A9z!~IjuuB=cl(5i`
zJ8=<dY{hKsKs)k9@#MfY(|puQox^e*N9~p5n1!RtMDA4CiyB~&Q#)#9`j9_)!<(1Z
z)HQaY8-3B84?<ASIsyq&;_)=*<0Bl$VeF#g^ud$I!$EtX5BKA3)a%`O7<i%|YEy=w
zCYFN~Pueh`nn5oE3yxqBM)B<oY(b6qA?gv$qMm&Q4+pJ46KcioqGmLQ+Jx)qFb%8_
zm*Jq}iCeBqu_M6!mrIGm+hf?JbZE>Y%_pqN+H|biXt3Ihs>YfMTa8iKR9joqXdJg%
xk2!t>-10Cb8|IW$)6k8;f}lW~W$IqLVVfH1u^M$2tMT~4)V(wHj?all{{xYt#8m(Q

diff --git a/po/vi.po b/po/vi.po
index 236e0cd90..2172b42a0 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 ae6e9df4002110064a182d67fbd172093f0ede17..c6816cf940a7ef02d7d442e02abebc21e8211270 100644
GIT binary patch
delta 20
bcmbPkINfkVEg!p)p@N~2mEq<VK4C5ZLUjd(

delta 20
bcmbPkINfkVEg!pqv4Ww6mBHo~K4C5ZLY)PR

diff --git a/po/zh_CN.po b/po/zh_CN.po
index eb2719554..112751540 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 61147f40c6b0e3ca5f58ba7dbe6fb1715677a3b8..c7c60a992091ef1b05716d1235baf473441c42e3 100644
GIT binary patch
delta 20
bcmZ3?vzTW?3NyQrp@N~2mEq=W<{eA`J+%d?

delta 20
bcmZ3?vzTW?3NyQbv4Ww6mBHq0<{eA`J>3Pa

diff --git a/po/zh_HK.po b/po/zh_HK.po
index 132f0dd8c..bd7bf836f 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 6cef7b21c91ded6b731da2aac13777c31be6d62a..b1af7483274ce5f069593949c6229ca4f96daec8 100644
GIT binary patch
delta 20
bcmZ3)vxsLy3NyQrp@N~2mEq=W=Iu-XJ&gsX

delta 20
bcmZ3)vxsLy3NyQbv4Ww6mBHq0=Iu-XJ+%d^

diff --git a/po/zh_TW.po b/po/zh_TW.po
index 8369c2d15..1e82da2c5 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 b8c435cdc..927c652d6 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 6ff8d4bcc..fdcbd57af 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 823f7dbb9..9e8ca19c9 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 c48d0b2a0..6dc568ec7 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 3ba5028c3..25d02ac64 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 70f5440f3..08201a6ab 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 cbcf4f838..cae03423f 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 dfde1f6c2..061609ee7 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 3621e8c8c..d1269344b 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 a5361d748..d4871f8d7 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 000000000..dc93b2be6
--- /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 000000000..54cf1cbc8
--- /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 5e669c905..f213769d9 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");
 
-    GST_WARNING ("Failed QUERYBUF: %s", g_strerror (errnosave));
-    gst_buffer_unref (newbuf);
-    errno = errnosave;
+  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;
+
+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 (count < GST_V4L2_MIN_BUFFERS) {
+        num_buffers = count;
+        goto no_buffers;
+      }
 
-      if (v4l2_ioctl (pool->video_fd, VIDIOC_REQBUFS, &breq) < 0)
-        goto reqbufs_failed;
+      /* 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;
+      }
 
-      GST_LOG_OBJECT (pool, " count:  %u", breq.count);
-      GST_LOG_OBJECT (pool, " type:   %d", breq.type);
-      GST_LOG_OBJECT (pool, " memory: %d", breq.memory);
+      break;
+    }
+    case GST_V4L2_IO_USERPTR:
+    {
+      guint count;
 
-      if (breq.count < GST_V4L2_MIN_BUFFERS)
-        goto no_buffers;
+      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);
+
+      count = gst_v4l2_allocator_start (pool->vallocator, num_buffers,
+          V4L2_MEMORY_USERPTR);
 
-      if (num_buffers != breq.count) {
-        GST_WARNING_OBJECT (pool, "using %u buffers instead", breq.count);
-        num_buffers = breq.count;
+      /* 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;
+      }
+
+      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;
       }
 
-      /* FIXME try to call CREATEBUFS with count 0 to check if max shall
-       * remain 0 */
+      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;
-
-  /* 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;
-  }
+  GST_LOG_OBJECT (pool, "dequeueing a buffer");
 
-  /* 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");
+            GstBufferPoolAcquireParams params = { 0 };
 
-              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;
-            }
+            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 7a7f8c733..3459637d5 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 db2f974f1..ef967bc41 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 4313c3468..f868d56b1 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 *
@@ -2228,57 +2315,189 @@ 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. */
 
-    v4l2object->sizeimage = format->fmt.pix.sizeimage;
+      hedge = GST_VIDEO_FORMAT_INFO_SCALE_WIDTH (finfo, i, align->padding_left);
+      vedge = GST_VIDEO_FORMAT_INFO_SCALE_HEIGHT (finfo, i, align->padding_top);
+
+      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 ? */
 
@@ -2750,19 +2987,57 @@ 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);
+
+  gst_structure_free (config);
 
-  return oldcaps && gst_caps_is_equal (caps, oldcaps);
+  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 c205b2ef4..dbab52744 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 24f6d3f9d..93f20bb81 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 e388a3f3c..12a30df2c 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 000000000..a314bd0ef
--- /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 000000000..13d56c3d7
--- /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 50a51104f..1b4a051c7 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 6ff2e7361..2ea3e83f0 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 000000000..899c19119
--- /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 000000000..9a73bd913
--- /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 186e78010..793685380 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 3c85dae9f..5a4bd8433 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 242295356..08a9dcff9 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 e36649daf..e89dcba2f 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 ab5953503..0c284d485 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 b34317a05..268076e49 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 0fe5585a9..1f410bf22 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 6c09ef19e..e9528f9a5 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 578c8e9a8..31999ef62 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 2a81294d6..60683b76e 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 40e4a9527..9c6206a1f 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 8f4049f42..41408902f 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 e68d38bd4..ab90084c2 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 4a275d5d4..4df322088 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 0083c25df..f09f4bd06 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 13e4496fb..86da4ffd3 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 930c099e8..d5c8f9cc5 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 f5f983d24..d9f0da42a 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 ea21769ea..27e83ff14 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 58248d710..c6b6def78 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 9a2e895df..eb04e1f66 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 e631999d5..04b5cd205 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 5a7340007..b0a3c3632 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 670f38f71..2f97d6ccb 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 f7f1b9be1..17685213b 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 7dc2e3205..cc741015d 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 f878d195c..a07c4a27f 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 1728c6a3e..e69e143e6 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
-- 
GitLab