diff --git a/ChangeLog b/ChangeLog
index 136ab1035ebadb09109170d5023fe3750cbe8574..f9997d84316a2f98f83eeab64a0ca22a8f9dc302 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 894ee4676dc7cc8e440d43b814915900691684b8..01c90974b3b45b679ee4ab40fb14287fbae09082 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 5fc86c82dc27abcf8b158b6342321f71d2ca32ca..da4707eb7a79862aa3d5eee399a2eb94a73b6427 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 30d7595661fcad9b4328d5068eee535baa76eb98..2e63499e686b960c570e06d313c017516b7973c8 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 ec7cfe1a8289d3c6bb9169eac4c2f6ed81a31331..e99353fe4e613608988a2d18d5b8c08542eeda46 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 a48f40386d226ab926795cb8eecdafc6dd2cac71..806bdf4ea459e4be9bcbff852696cba23f31fcd7 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 ef2bd77bde1e8f45f3c89072ab82a7b417355d1a..0fe0d50515e4a7f01ab4d43d87b4624f2b2c8802 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 a4838c48f48a42f73300e59ec4459fd0f13ac640..e9e8040fbdcb9110f1f27212ee7ed6abf51bbecc 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 b31be2abcf88fcc4423236ba6799c16a371c1b63..17be4da375f3ee734a8007fd457041b497b125cb 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 d59161f66894910b0ef05192f0c44e9ad20de303..48327087c8b233803cf87d1de8015a6f7bef07c6 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 55dbc256bcc2bce26fc56222f476f5d54152b885..690bba8b2061fa87efc726daedd5ff270a995e01 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 dfe885968acd28d2a75a434400e08cad87b69f28..11075f7b7ee45cbd3c2ab57ce7473bd15d44f5aa 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 a0b439850a134f8343b41e7917ae2220673f6e31..cca2848bd47a26b0fff3372f0cd419ebec035719 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 92cdca0c7a5a5b759dacbb5559abe1707a8a395a..e5f9a159470faeb814225447b9bf57fc09f488d8 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 105e9f0ffe7ef1529aeb4132d2cb9aab9761f611..0fe3047b5e14ba328191aa47095d63259358bb42 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 4fbcd378d4d67cccbe9a091fdef55373bd780232..9a5055f2252ecf8a9ea78e3495f18cb925d73395 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 af06844845e5456636afaa577baa4939e114924d..e53d974b6f88d35a202be79fd9aa06a644a28b77 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 0cf723cb9abd705f08ab876ccb34902f5e96dae4..e80dd3bc6f8e18c962115f7a2d217e959a6031e5 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 815621290bd37f45865ba4b8ad410b23e53bcd11..386f4e08e8fbd7a6faade5e3a6b983723d6455f0 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 0bcb675d6946439321a3074bc8af8f4f90a4f7cd..2346d4df73f4746190acb89db2457d12bfa7cd38 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 7f6e5d071b0e98b809e3531d908c21cdcb2e8680..e956f6d66ee814d809d7b4239f7e522ac6c71557 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 1a98a2c5582d55815cfaa9ebb16c7ae1ede1b793..18fe15e4443d737ca13a0d0696a6b51b82704f00 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 f97116f81e03871ca102cc8817f2d11e0339ecf9..1da587053827a8c1dacb4a56316df98390d42b77 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 b72c549302298a5fd41f60defe9ce559c82d8908..e38b332098a20d4d60340de7550642e49def3c06 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 50c96fa9d85ff65c379e30cd3dc2757e7af113e2..3ac346c1ee70278978584c602c6f546fce159d5a 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 27c1ac9734c8594f6739c45b5b01108a5663b9c5..68f1d54e8ba2cb0fc7d702c269fa28a39ef1c72b 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 9341ad9e132fc41673429ba0f889f86e40b03acd..c6769fda747700898bbca6614523c090e486b8a1 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 ed5a4f5b71e1623e65738483b5a06698e9075d09..1c793eda18e926ad0b22a327d827fa5c086e6468 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 8742ebbebe8d7a19c76b53bf0dc5de50172b2e92..28a8a4a14506fdd1644668149af09693e80c43ff 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 25872f4550281727cb4733c207f0c46e3d00d36b..13252854cc0342182ca9ba2c83aedabf9cdfc470 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 4187720bdbe392792ed8efc18c149e9cdd98cf6c..0b6ece21c4ab149d30bcd6daebf5149035e51c0e 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 8250a2ee66c19df00685eab132ef27d634dfa0b4..b99e8786fa932ec0ea3b1ead8ac13bd891dea9a4 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 bb28a2ea83e4fc4872603102ede287a273c7073e..8a5acbfc5a09311309fb6e82e2e4a9bfec134838 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 67005ffaad596829ed20cb7b2120a686ca760736..089cf092d54018f5783e66e4cd531dd491959772 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 72496a630409fe39ff991943beaa689644927ba0..a7e07c0b9291a3be90fbc3e670a48f56498f9298 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 7f8aee8c3f48c2a83e6fa32b9efbe9c0b1e43f02..c9e05349f66a33b1257d8686e2aa03a74da72462 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 2a702aa029e23e236e6aaf961199a600a38bb798..f5f12a81c35bc2896370c1310e6d8163a87c10b9 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 a5ee98465d41d4a8acfbf967578d92f86234fb7c..9a20dfe26dc6f72f72f00e5428009ec5f356ff71 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 7e9db7e80637ae90200abee7c980646c15630a5e..f27bebcf6a81d121446af28a5586f541c3ef4f7a 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 c975f7b85e63164f22d5567d989a9e54bae4d695..2c75fe76cd53207ad8ebc3c1dd7a5ef2dc2ce8a2 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 725ba74d59c76f33fd2f8680230b879a68f7eb7a..6b142623c7931952d80f09fa812ceb7f39e016a9 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 dac89672e667d788a2bdf9e2f49409a46075ca4f..0dcc77a9646b012877f8a6f17f84610f476a1455 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 d90c1b0522cf255d984f5440712b7675b3a7a9c1..eeeadda4e6d50592ec841b12b9c386e27d8e6f71 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 44cbf7f065fa44b317f20919630f749e9c356b0c..b29252b0b0b7e2ec0ca48e6e8af51076a1610d7c 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 f65c5ad1ee20de5b3558369293ed45724483b31e..40cd9bafdffa742f5ee3c209972166a5621baab2 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 f73f04e6636f313b73f1e7f6ed632dc016206bda..9705ee3d7f4c8d43c7991dbf5f83387f3b28e630 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 262c8d9ff8489281dfb87cb518f8fc271bc7d79f..15a9642ba5cd6ed2707b8ae0be937f7657ef0755 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 1eb4482f8b6cff30f201d6350f88445c056e2187..074ecb058eb1eb0862716202e4873497bf72379c 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 d9072adb8324ae3620d2a05a95ebc069e4c844c1..a9b1d96e384474f5bb43888f8b8590213edc5472 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 def87fbe38ed23429bfbbb7b9435ea649cee729f..0c1968476ececfae586e13d0b766672bb42dfda4 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 5f9db0d73505d248d06c374a1031ac8ced2ed973..a100fb82e6f24d6f7a13ce2c197e7e74518aaab0 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 0ff5ab28ecb71512fa1992f0ff20bd8baec73424..ecbf7c8af8f140fa85887c70bf3a2bd231a69862 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 833e2ee793becd91d7b6ceb2e641a2f95f6d698d..a4ae523fe35cadaae1a3872c14071dfbbb99f33c 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 3443a87efc999d54e5f15581326e5f18d38dd0f6..dd575028bb54371a7b42f3bd67128bf04316b9ae 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 0e2a2b6bf947caee856ffa11536c46be2b3a9c32..adcbad2d7f98b32cefb9d59dfcdc99ad48f3dd44 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 4f58e14bef76818c1f7fd072f73efc01b8a280ce..43f8077dbffa4bd39c091284d3c07d1eb7f3d2d9 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 d8222e40b23bcafd2cf2ddba5c359fb91e64fa7c..9fbe16f5ee5c929db1856f2db2720e07d48912ec 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 0488126f3499bcbd0640cfe1791b21281250ff57..8ec448a4889f9cf32c584531065ad9ed51c09d70 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 db60d1fafc6712a7398aee2d7e7d57ce56d49432..d2b546b410f81c67eb1b2bdcda5f8ffc139a586d 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 cb2a76cd5dd9967f114a98dea9dce924fe43561c..f35781cbdc173cf603e05f5fce6718377a4fa65f 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 8f89301a670212f3212df49317541247d089809c..262d842b8e641fb4121b38038ee7894e2c9e471a 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 a1da43d8552db0441ddfa05801ee1400c8a45cbe..2a922c876005a3bd0e76b85421eabfb429aeb702 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 68cf1ce6519a9f91d9ebabc8f6ad79bcab57df0e..3d79f2916fe41e032e9bca669486bad49af96866 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 c753741f71b3ad552a615b3eea4db31d5ac7a4c2..dfc720afaf72bfdb42528320184fdaaf0af9ba4e 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 acd62cb45ab9ebab151dd67c412c4ea8947763a8..fcc71325a0b241259fa022b6a244f43322cbc249 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 e3323d9e41e48845a9ca69131a9773c0d6f35237..78a30806c4814c906d04a29c367577c2c511035d 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 1952679072b8f4ff5c5c188a4f6132f051f1dff9..ff881ee195d7ffbadf4915cdbc386241d3072592 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 e6441a26cd9460f6d911d077dc5e2521fe11443a..e870e957ba08cb8e6aa1dc592bcf8806e705fe3b 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 4641104e235f14a127d9b5e1bed3dfc5ab21254d..a3ca90ac683c9497ad98d77a849f2a480f79aab4 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 11faec2e84f8d1ffa051fa37d1d3357e814640dc..86832770c677dad77b57bd8c54d156cc936a95a9 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 88d260dc6c553d7fd19c298a7805ad355263230b..5de1cc9c810043b2ca893a5823d802443179fc70 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 098951c3e37fe70302dc5f2a5825502139416a9f..a36606e144cb12b2bcce09abd836451897351368 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 a092e7bed3dd26100e0efadd17a9058b2031833d..c7e38aa7fa57274a57232d77c8d2c4d2fffd7a51 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 bc045a387ffca4834ac3f09f5895f67c16ca0e73..c9ec8ae06ac206166d0bb2cc182fe7286bafede0 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 872ff60bcbda403ff0db29625abadb62eecf5154..af68e0ef9b7d892b5f306f776b2e6f9183678d3f 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 dd4ffd97cb43d895314d43f6d4e5175c56bb838c..1e98570db2dd52896ab599df3d10b694c8e6d076 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 c1b2d516482b1021828f33027b58c71204ebb459..7f85fd3052bc0425f99770b48c23218d962b65c3 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 36b5d1dd9951d0b7daea051ff9a747066d09ac6c..93226dcc1637b7c4e2b9a6bfd5c49f61519dd6f2 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 1cb0524b2a986bed687d652b7c7781d420378211..925069d95efe141a775b4bcfdd8353c499f5516c 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 0087ace8b6023a98e609c7d89880b8da0d69f45f..f90f3d2870107479a59435244d8351fad4a99e32 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 bc272f043e772bccfd288510cdbbc15535acc97c..6c68353aef3ca5dbfe3b70b23d8b53429acf550c 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 4c60e18cd35aa63b09109a9f97e4c2c2ec384a4e..6d5b5083a6d89ce0ca22d33bb642a049065f819f 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 ab51066d751ae69b52dc6b449d7f88b41202d55a..7a8a86125785a7deea08c88a4db571b39e3393ad 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 a32dbb81c43a796b78e4696a22bee142dec1f0d3..460e8d5b8c5be15008fd493b7e652dfdc56eb14c 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 7f6c5a0abb7d9618ffdea75cd95853cc76a445ce..4f05ef59c832903374da504e1158befb665361a5 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 02f284a687b8a622f26ead1ebab68c33b51bdbb9..59ea3560bb5daa8d09efb7d491dbdbce7c8822b3 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 fb04308ecc95559f49eb3fbf4d7b7ffa50932971..3441857e54e9c137cbdcdb1851b07ff6e77f3466 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 2da24ab13d675eb01848cc2be0088d4173643196..c7329c01d7f11f64a7ca3533bd66dae9b7199661 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 7a3bf28e2adcee44dcb2b7047855a3fa5974c5b4..34eb617f1de0c4f96c80e36472140bb78e3bf451 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 677bfeabd267c071c84ea20edb59b7bf9617cb8a..d4efc2da963003c9707201c1d7e350c9f01aa4c8 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 962b7074bd8cf96087666a93669ad13c5d136ef7..fd32c11331d036c94b113f272dc446105c9ee39c 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 f03c50a5c494f44940d9e3f28d7e131be020d550..7b3810e82c55440074eb02a92b2b3b3580cf6c5a 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 7fa81fd0d75d7227d8c0f770bccfee575ce455d7..f1f2caa60b98c233e16074c29ba8a97049697bc0 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 59999838908d1b6a5a5f5568cc1436a4b4f10a77..2da90e0b60755d81bb19f324219cecc2d7e7c6e5 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 cb9691a1a68f70280b7844b30bd2005b03db253c..37803d90749f8458fac95c59a95d75d2b4a4a424 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 3f845f46ac01e286de278451dc6199c6d0b00e47..9d844f70b370bc4102a6f832d5bac5367476c64f 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 3e6d61f67fe96d896e83b25720a039b0878dff9e..97f3981ec18383ab3d4ed62ea497d17b6f6396e1 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 30d1c4fd128b49512d5dec9b4ca94f371cf58bd4..929681908622cef58c2b46a949e2d2a1bc95cfe9 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 5a516fb98226cf3796c76712d84c45c019051406..7a34a78c1b37ee78506a16097d8a8380c9b9789a 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 a0c087d3824b3f50893bb240d2923485473211ca..290640f9e67c69b3a6478d3fc54ada8bb5ac8e62 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 013dafe4e14d88b82d2fd7021a0d480aa93de952..ae4a53f08c0aaf0484daa3817e3009742ec6e504 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 ab52b4f458420fb75c0ec579844f78960caa00e3..6121817efdd865deb6f5fa5c14f8fb3c4abdf069 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 f0dd215c9eee382014daca0dd8af473cb25698cf..3fd91453e50554ab942a47f81642eb3fe99192f1 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 27602f2597954773a21ce4ce2f035ba00c44188a..08088de1bff2d7813482cfc0d564e172fc26c8f3 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 6704297765e4a4d877e15ddbe4a54e5b263f3a0a..288e74ce09b87cd8403173323a94db35835c1280 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 0728eff88ba581a2cdb9a19d923243e482c26159..947229cb3581115d91448ab37acae73b0fb51462 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 070ad509a653fc87f1a8010580ce2e8e8dfe3ce4..5e97c08417406987e6d0996a33ecfa786158a9a6 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 f90866f950dbf14b2750efa49adec2f6fe1b7140..66c3cdf7ee61c274a6195b548113dbb0ea606232 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 1df22eb371cc8dae52964c964c4bee062982f2fa..1fe4a1c20d755467a34b0c343ee033310c274c22 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 895f22914a49681f9dbe3b4f7c1955dd432ed122..5dd77d5592d73be0eb6bc4cdb887bc1e35046c7f 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 eb688cbf495334a7c4227d830d27bab6f92b8649..951ff24a23dcbc20cd5534773ee6fba45ffc22ce 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 937eecb853a594a0c282ac58c7e4cfe93152df51..b1e074a6cd5ae6cf8eecb8241ae187af50c2b238 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 1deb50a3259913571b4cb1a24eb14e492a351915..0eaccd0521ae644827385fdcde445df6760e36d4 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 c4412d2c8317fcd0f192ee4d5992dc9245d385f3..f3ac3f28eb509c2af2ad010ae372a4b18daa3816 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 6d36d51c2aab3b1f7c57c44a33c54a28b65f1bf8..fd06562168f8956c519a13aba9bcdfaf47ce937f 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 93a70a464d16a0eb13205300078e93bca18c2c79..93775db24404d74664a416b8287e9ba2eed4f085 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 5e0e28ead9e856a694ddd15cccc14bf5eaa559aa..46525a9953b2b657af9b1c7752d15816af713e0a 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 c4554e52ca1fb0b5fef916369a170f831daabbbd..b3a6fa7ce090994288fa7354cfe4a17f5d44dca2 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 82dbf7fa10a635c52509ee579551ead8c242c9f5..14e937dfefe68e93c1e47590a99d5736190cb7a5 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 0af9cd2d1cc5ce15103a0eadb5623601c9e6a372..ae5da569d0eaeab54bc0e2ead2a71caa5eac2d4a 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 ec10541382cff63f1ccab872dc5bf86ebf78f12a..933a015c6a9cd43e55dfa92fe6f6b8ab5d8f9840 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 499f3ed4126a8abd3f63813174d331ac9ca0a246..25106a15b5f9993cf47dc616ebc620a943abd077 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 ca0d4b39be0bcf029168e0d41029f07e0b27d1b3..6d6858599c0d49a5815dede5677defdfb5c43e0d 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 254ad244fc42c08ec51d64ea64c3cc25f873e5b2..aeb3608e067fadd0fcba9b59de690820ececcc16 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 a9255efde2a413e3b868d3ec23ce3d132dc1ccc1..5c0fad57be99f30995d07c0b83469c95f852c225 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 e628c7b06b7f28f13980b69c1e25da1ffdca20cd..4762cccfb2fe32666941856580dc0e6edee25fdb 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 4d4b69e036607919b519b74866e345873e908efc..0f53304eb03909a9ee75cec5e1d75c425536a836 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 431a76c6a89a20b55f49160ea0bfd43813597974..d2db807978da6aae9f9e76919aeedcebb30e6c09 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 ffaa86dbdf3afb21b2bab50af193b50e205479a9..0cf09999e0320703b92cb10531b4b436f4f2f9d3 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 ea7de39b90eb0db79b0b5bbbc6bf7eb73d13a7a8..6e4f2c79ba8e1323013b4273197cde7894c5d3a9 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 880784c5d023e83edb4b41cad370d48eb3223994..148eaa942930cff1502af71c2ec44dbcceb62aee 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 57025b426b431d5486accc9c549db1129cdd635e..a6aaa5f1327ab50c6ce80909194815d64349345f 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 731eeae79ae6eed3238a345807c2b8068f29ff72..fa2bc27e3a5006c8b7b594ff1746b5768fdf6a5c 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 f782108d6f064186f011fbe97d6908fbbb01a562..d548ee62e355800ed8ad783a1887aa62df6fc734 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 f8bf15c81b6a31afdd586dbb9d4c7812d3dbaa84..e2df20f395b8700d48301fe0250b8d484e827bb0 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 114731805c38bad7932d026161d4771840fecb6f..9a714dc61de683a7a77dce7498d078457849a91c 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 e74cc81fcce199130e6414daa747936536d7b077..6b7f2e1bde58bb1deffcb12c6e526857b62f85a9 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 490f960b650713869bb5d49042618f21363ed3ee..cbaa0e131f26ec2193960de2250c9a04f1df5acc 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 f213c189bc2a17024eeffdbef3e114a9e69d8e31..55ff1fba574f8949a29d56888ccc7d13663044c9 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 a58165e8981d090fbe47b98af7ea75fc0fb41738..916ae6095a2e55ec1a2d55e0bf98f7c3499e3cf8 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 0526574dc737e9cdced4fbe4c5dace09e6396ce2..4dde821fe3b3602e901bf9f005c8b600114d3492 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 7338cb6ace6aae7e87f761813874aca2405e035d..317fa3a375ced6388532dc408248d8aaa6d5d68c 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 59d0e4b57eeaef7f5ecbee3555a63c85ba01b0cb..8c585e4f5a3ccb3e8961f203d3e87930e2d68b24 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 8a22c04f7427932a022256948a880785dec5f4c8..37324dff30fb335771956209c48a63d5c71f91d4 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 b6784d564ffebbbeddb784ff141ce5ac6700ce2a..a5a34f4799f7df36c8b9e4435f29d546f7d0ef72 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 4b240e184914af899eacb6bc669cee1231dae3c9..4452ef5e95894dadc8a08d8b4552660a4bbc6acd 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 e7359a2419ef14b8cf3a6810cf8a5c90d3664aa1..aa3ee5cc61c3f5277f89be517ac7f539586516e8 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 82643c0df50953cc284dce9a677f12d5f55ce28e..d0bc90b2abc3550ce0ca8d9fa536342acddbf66a 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 6b9cf4fd36dd4326c739f224eac45f424b2b7bb9..11a3451f96061e615a2370cabf271c47e6fe6711 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 1635d8de656ab121f9b0465d877905746559bcd2..0d13c0d37f64df5f325e60f1d63a21ac6df64b44 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 96980447e0278d562e52d738600d52b6990ec311..f1da88f242926417018387fa869756018c05b70e 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 3d06b3978f118949c254ed529e64fe0c12f2fc89..e0ec2fdf51268b059400fcba0ed8c35ebf457309 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 3537fc2506c7cfcd8a5dd40bf4284b958d9b1f47..5de5bc0d55423068314bf1bdbbec8e2ad196b1e1 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 b5cb7150b8433ea0375dd808256ea9c4e7629f1f..91f130d20b6f5c03506b164816f908de69f422a4 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 8c8fa6ec413076dc35c78c29f3b882622d549dad..0ecf697502db1b6387a03b6e09c4b29f1405a7cf 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 054d1afdfdfb6efcd5a3537f8535a5ae12bda3f8..833003db8b83f7efe935c26875f47ebd1600ed21 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 146933a3c0a046fd414f6842285e34d11920dc50..ac5b8e84f7ad7afebdd2b8aca3c2720b7971bf41 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 2bba3fb25798d5624974b68ff8ebd729328a4f2a..88c9318cc6e178279e4f550653ae6d5380afa773 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 c19fb1a02a8f7432b774dd5200e399a140e3f41b..3d14c305f0824c204e10c7618a8875d0fa8781e0 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 83b88029dff694b7b092b0f0b35aed53770d6744..b4ee8199417cc97ff9c2d3b53cb3469c64fdcd6b 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 9d9070e23f8336057a27c965ee7d549449b0c130..100ba9b0acdbea606587b040b1cee735cd755198 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 61f7c934d02f7d60076cc7fa8dfb02ed2966c2e0..aa69dabbf879f4791a2356a7bb1dbd4eb2b1d055 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 ea32c4be76d088d0397143803d02350f5eb76e6c..98bad5fd725364022b4ce12961e8490caa57428d 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 cc397cb07182087302c6b5a08dba0fd4a5b8f916..8bf9b9c6102e7c21f5b985a68d75ec04fc7a6bfa 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 c1cb5424e8ea5c7c7b7d33b43cc81d06b3d26d53..1ec661bb2ad1d43a6559d43abdf9e8bb5ded8994 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 4b58dba3b33c137d345e963c1ac882abfb8dbd5a..b268d348a488464b351ab917b004486c9444b13a 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 deab6182315b27517725de967689e5f10e923bf9..f58d5df3867f57b39b9b72c1b629e439428f5751 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 865c59876d30c2b275ea055e5e28574e7c69d2bf..7902d060f5cc848b85c181cc66f095e1ff6f0218 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 5684e60c7420479878e85b7de34ba0466d269178..0271ffcd228921ec99aca69bbebe9533f654b71f 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 ea276f9047e58f30ba2456f4e9d7f84f0b6259a0..1b1531187741e151fed37561d83bd3c7d3c6d292 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 bc58205cd9fed2cb7f80bd37ce1442a03f35fb58..31482e4438d852a53ec8660a2c185abab6fe0f83 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 460ffae992e357c8f3c572c4613e72ae65486f10..f2675771da8901949dc1facf8b898ba1a20974db 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 e00ed7316ad765e3f7e215498ddc9698488e9199..2b25b333ce68ba5feffaa12a3c4d47fea5fd52f8 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 be704f80a0d25e468f55546ff078050663a16199..21be6a38787db60c826ea8e567c15be919fa227d 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 77080afda5c340d553c5f144addc6270fefab7b7..617d10539ac8e20d3b74c554e274cb6d4e2c3f69 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 e84b9661639a7c767c88f5b1fee4040cc1fe7f11..37593d1fb41bbd038cc70a3a1fb74682d4e35d47 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 3bb7b729fa82e34d148c6864e8770b85fad3ebc4..298be4b0ab94641a441147ed5d2c05f29ba7a5eb 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 12d6aa0e882766f80a636140b53aa2cb4f33299f..3d5999a61ec741960fb1f94b6cb574718c162485 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 a7236ac2e3d3df9f32f6f2f3f3e385ec604f337e..c17158054ef99d028448e21261f4be7f61385736 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 cb7a39ec250578aadd35acc5ffe9da7be65c2d79..d36693b474a9c96f500a415a73f6892855518a06 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 c89bf0c61177ddf13f0d8f85af9faeab391e974b..c1f0484379ef9c4668d6ecf917372c7019a25899 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 1db2a5116dc61756a10c7abc48d27ae5aa4994ab..59821f372a1562d086651457454cc5585a000b37 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 eb5c58b03e09ce05432dfaf00b36e9ca614b7c8a..2fc49609a54d9bb4dc559bf3145b95009fec0c5f 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 0695f0434e7e653a27f89f4d684f602d082dd104..a84fd74b34797594b100d756d1069ee3af5e59db 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 2a5b5ac69183839eb284638c00b6fd136bf27bbe..8271893e29c4af5e9eaa0f03fae2c5ad9d5af30a 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 d318664a9f67165b76fcfd019d93e5cb9d4d71cd..9ca2af90c9ff25a1e07dabb6a40b2cad618653a1 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 052094b49efb3a5a895d074a69b4f2d245e55378..4717f6eacafc9f72848216bfa10d2c9f49e5b8cb 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 8e8698242b18d4996a35ef356c41b43d4738dba5..b121c010add79d90b40b3d4caa499572ba2ac6ac 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 be6dbcb1d37c60854b9f6e1904bebb7e18ec9e4d..d77136084636594663f05e8a8ab05d3d327fd02c 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 dfcf836f9fdc6dc1868c38d041e27e9a00c0ab1e..c21ddb0015b747d11858310a3a66e174a1c0d64f 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 d7fcbf6d422c8cd3224a78ecd50ce1f29cb01c90..304fd4efc4bdcd4245dccb7e7f7d2cc41fe42bc7 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 6944697f302ed2b75e8454881a930323e496bfbc..ce40c604bcf899adb842d240f0c5d4c4fa30d1ab 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 c058fda21d78e2e0582afaff609dccb6449f3434..212d18a329e6d58f4720515bec3d61a964d4f256 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 90953b4a64f483de74c8420c03dd11e1a04683aa..79a8902ead90a6a0c7e58b4b828fde3b1c2d5b19 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 aaa1e776d4fe272d94346c7d09dbac030fc1cc43..f21764e00a80a3cfc2ecd937a1ebbbde646f1418 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 6e006ad5266b304d7c5f3dd122ae2b8354935a9d..f4c20b875b1081d57fe40a4fb9672a5a116ead61 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 2abe42fc25dad6556d7eff9bbdb76d67f47d09dd..f82ffba38040537ffc9a43ad18ea673120b23901 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 7f6d5aa7a81f2f32a8687e928978ac6d85009d7c..2847492c42b2b1b03c3f901da0211b49701c9986 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 c8c88fd271fe666289d69899be867d188eb04828..623dcc4d8fe3872c05eb678fa25c2208c096dc3f 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 bc4d5c7d3797030cad34f06658985ee0ff15d0c4..2e99241d02036afbe5478a8e1780cc77e71c4484 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 1d7002f3ebfb7880bb0d515fc565fef8a86ce620..a063ed1c8c3cee7ecb19f7b3626ddd1d356ea70a 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 c138a79dcb40e468882184828c08676486a0219c..66c84a9c8c65c7129381d280de3dba4fc4164bc2 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 9269642524ef3cda303310f787222f2410bc95a6..8a41c815a0d84cdd09bf29bbec687847cddd9dea 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 b33904168aa2e34ad01fcadc321b10f52b7d0c90..08aa05c6c52c6b77b69525b82b4da49fccaa6b14 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 613edad5761f46520c4aaa9458e855f0f3ff0104..53847c0027b7f727d583676afa8912c32f9fe108 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 fc32625311abcdb3d1206d63694f2e423e7695f4..b895b255e1e38409cadffcde8b9b6948fd26847c 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 6cfee3e8af5f58a280049bc12e6b8d98859592c9..1f8931c313653362cf11f9e3e054e79c7dade6a1 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 d1642686b7395508ce29cf594fb7f673924fdfa1..74f0d2abd95ea6cbb9f084276bbbd503899f3d94 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 138f470c53973a036c06ad488e11bcb9ddf62c7d..08868dbc49118c27bd0a998d4081a55a7bff23bd 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 1009bd3abce9b4bba220a1c34c5443ef53d95968..76328fc0edf7b8398221930e7e0fceed53d9d7f3 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 da7072071ef57087e74107a69ce94243867e7220..ae5ea463af67b189e9fa43130b33d1b773997ea6 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 86f0d9b724a65bbca9bec157ba1a3400338306c7..a3ac565f2ac5b9d8a6f33e92c04d795772f30449 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 878e345fd76611eff10bbabdf5677aad88e73c6f..2294fbb254fcbcdf7e1c0757b1ec9a0b70a3ea94 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 9a3d8f3f0cc058dcc9fa462208d0998345fd139d..013bb870eda7536d621649e989156feff42ae527 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 1111c8d824138ab87e76b49e141148c10b2257c0..11f7d05a18666cbe17dcf799190eff171c2b2449 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 00bb060448af50132c973587de5448540ba418ff..8460941951353c6ca572f982e714d62802bd02fd 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 94549d703d7d4059d9d27600ec5dc2e6a3b7f130..5042bd54427d2789e9a017458081e71de630b924 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 743fe2aef8763accc28ca75c8f1c5ca47083cd1c..0620d7879dee02cb119f7f2259ae5919f744d8b4 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 a087c462f4e84886e52c04d94473b96635bd2842..9cc7d6ef03b8d8c85909173f6a2772920a133bc4 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 1459e91c5c3a88c79538ff169c12cc25bfa5dc0b..9e454928d7f674050e4e27344cc2ea1369f1c30d 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 1fdfad54c5a93cfe535e2e4bca55628a45cc97eb..4cd06ab91abd9239561c475bc2c73d948852f2cf 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 bb0f7e43983d2bdab5200ac1c6e9a39721540f29..52f6b017ce7868c5dcf79d23b0982355503fd9ad 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 c6b9cdf4e046889b8547372ec81b5d1619adfb98..cf6c4a9f5bc5458327b219aafcf336643066e8ba 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 1f05cd41cccd2bd0335e1af69cea2bfcb42b1995..19a1ef3662421e60aac767ad498d9bfb632d898d 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 c29427243b6193af5b1abc61658ae9b6b475ca98..7e2aa0af4d259b0196d7f4d88e240c631d76746a 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 87388aec502227d19f7477b363bd72f4cb25fda0..b567ee46a5a337bed73104b2d5c75656e1ae1f35 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 9a56955c6a6f01cadd55e11e516d62da76e077f4..d47c85fb3e911c03566388c9bc0743479037fd6e 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 9af7d8acea106b2ef3da06b7444eced9712b0142..ed4adc9a91d84f5f7ff1d769f21fe2275468b359 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 98c1eab32248b642c3b91a476bd4382c8464bc0d..ff558301e2ef2b164c972790a2240b1312f0099b 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 ae875bf81210dc1e4c9db5caacd4af6d927851b0..ffb0dee14585415bc913f6381e2da9ef635bb02c 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 ec7c3aabf4b43c9b0fdccd44c595e503392fc0e4..6968f5d88b55b3b562bf4bc516a1682f2ed6833b 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 96a4b5b60f08b8175eb50f641a3eaf0f442d4d09..53e199fb007c875fdf754fb5884b76372926b632 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 56fa9bd687c0f10cba3e60d510bd5f3f037559d0..5f19f69c38e02d4ad03ea6039e380471c348e711 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 5c9f98b7c1a232ddf3fae2e7a7541af06ea80521..e0b028d2c6b7828b8cd822d4f4ce332d1496f21e 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 4720f26bce62cd3103820da3185e89485962ccea..d64a451abdcc5e5fbc8ed18f3b814e0d1b29f69c 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 98894afaad1debae98aa7975219eb1116b843295..d74a0ec70460965368985ccf5a2b440ea28edf69 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 6792d5682573f73e24ba3b127f8d98094145b6d4..1f419d1ad36e63224776be626e6e028e4091d730 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 2cc893eca65eaa600d6e5fe47e9ed02ef11494ff..7f59ab7ed1be97c0733cd1d494d4b12f3bca6ab2 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 b8002c758fc738e7ededcd8a9f5888c2748cde41..05c1863770dc6e01207c38e9b1ded58a283aa0fd 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 0b7be52141092bfda2ce8c6ceac9501d271716fe..142aa8c0085e5251db883a196c9329cab7f983bc 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 e8204b0c4f19f5ba8819e783dcfb3a0b361ec742..568ca4f89ad70c36ace239b6513be3e87614f109 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 a9f376120d017133e5e757d8d975b1d218133d6f..8ec8dfe38f95ee938d0832e952036e8711f359af 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 fb266b54e67cc40d288f950947d3ecaf6fd20106..16fdaec33f69cf07a8d497e95028106d0b10b754 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 6b75f643c3d356ecbc306d647367bec447366d37..20e6c7dd771f75671410e2fdf77cf5ca898a39bc 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
Binary files a/po/af.gmo and b/po/af.gmo differ
diff --git a/po/af.po b/po/af.po
index aa419775cdf81136f4d8df1561547adf67b994e6..7dde409af90c42cac0afb759125331c6545af8e3 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
Binary files a/po/az.gmo and b/po/az.gmo differ
diff --git a/po/az.po b/po/az.po
index 21da434ec94cefffdb2ae84a7362151b526212f4..edf7b4fe997005143f521b689cf6735ccb0bd45b 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
Binary files a/po/bg.gmo and b/po/bg.gmo differ
diff --git a/po/bg.po b/po/bg.po
index 181751f56563c7fd61639b34b4a9e7fa232083fd..cb34d69b720468cedbd2920abd59a9310b7972a9 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
Binary files a/po/ca.gmo and b/po/ca.gmo differ
diff --git a/po/ca.po b/po/ca.po
index d67ca46459a5a3855a55e463f742dce325aca96b..bd5467dc682effb1ca774da948a376f14d683eb6 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
Binary files a/po/cs.gmo and b/po/cs.gmo differ
diff --git a/po/cs.po b/po/cs.po
index 36f14896eda6e78a21da10c280d0065331d86747..ec92e447945e126bffd5496e279e3cd2aeff8c25 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
Binary files a/po/da.gmo and b/po/da.gmo differ
diff --git a/po/da.po b/po/da.po
index e47d69ba8bf2ced1fdd47a2b297df16537958402..96fcdc3490d8a27eafdf53be8593e1ce748a1344 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
Binary files a/po/de.gmo and b/po/de.gmo differ
diff --git a/po/de.po b/po/de.po
index 805b082a235fae6ed211eab0d1679f7895979a8b..5bc42349d81dbba5c95d40d4f3c1cb8ec146bbf2 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
Binary files a/po/el.gmo and b/po/el.gmo differ
diff --git a/po/el.po b/po/el.po
index 931373bd322cb3b336050e2a0c1ce2e3b7ecf653..577daba10272d4ff49a04e17f714c0f99960d563 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
Binary files a/po/en_GB.gmo and b/po/en_GB.gmo differ
diff --git a/po/en_GB.po b/po/en_GB.po
index d5d9f591732efb36d01cc29e1d0f6adaa0343aec..f71db27aeb9b06b1cf282c199d2da3458473758b 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
Binary files a/po/eo.gmo and b/po/eo.gmo differ
diff --git a/po/eo.po b/po/eo.po
index b631c3353b4744c4baa232a6475cc069ca1ce427..29f96c7e7006b8599bb01ebaba2e2e56786b4894 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
Binary files a/po/es.gmo and b/po/es.gmo differ
diff --git a/po/es.po b/po/es.po
index c352b2b80648b27193bf4a88c3d454d6587fe280..b3a7305fc477bf5b62eb3eca2355628e3119f740 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
Binary files a/po/eu.gmo and b/po/eu.gmo differ
diff --git a/po/eu.po b/po/eu.po
index d7dc2f57dcfcf1afbc0339af821db98d770ea663..2abc3e544f4fb545a5f1dbffbcb687604fce71a0 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
Binary files a/po/fi.gmo and b/po/fi.gmo differ
diff --git a/po/fi.po b/po/fi.po
index 6bfd4c728f2920c2aa8b44439023dd0104c64b12..bed2a60990cc5d7b18f240cc366ac58d9710d7ef 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
Binary files a/po/fr.gmo and b/po/fr.gmo differ
diff --git a/po/fr.po b/po/fr.po
index ba2c0856d811cb10b2e298fa7dadd6f545a61c6a..3c1f10c4b9585a955f70478b1f21b8b177926779 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
Binary files a/po/gl.gmo and b/po/gl.gmo differ
diff --git a/po/gl.po b/po/gl.po
index 05d27b0f4b6c69b6932169c959ebfeb59ed7053c..1c560746d0b6e5535c45933b9c6450712f5e4c80 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 d66eb8b8d4f2794fbdcc0e7b720fe73d7d404173..0d863d065575d6da6290fc74cd2f90001b26d4f2 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
Binary files a/po/hr.gmo and b/po/hr.gmo differ
diff --git a/po/hr.po b/po/hr.po
index 40611cdf15af77e5a054219601aefbdab1384fcc..bc441e86a16f34f466c0742d8a0550a65ddc3896 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
Binary files a/po/hu.gmo and b/po/hu.gmo differ
diff --git a/po/hu.po b/po/hu.po
index 1bd61557f9174de7f6ba84de6bb10891a7609d1c..7cbc16947627cbe9c7b24879d5603453b94bc7aa 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
Binary files a/po/id.gmo and b/po/id.gmo differ
diff --git a/po/id.po b/po/id.po
index e4dbcabf0ff40142a4d70514928f1d8b2289f8f9..381bd160210eec1f6b40f693b5134fc594cee1cb 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
Binary files a/po/it.gmo and b/po/it.gmo differ
diff --git a/po/it.po b/po/it.po
index 31719c8318810c66853f607f60ccdc7009a3fa51..48e93f60c3c072c0fafc45e564a5cd92dd1f4e20 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
Binary files a/po/ja.gmo and b/po/ja.gmo differ
diff --git a/po/ja.po b/po/ja.po
index a3b044409c4b9c22e8ccbaa504fde541c0e5c20a..5271debc6f2f43484cb1549e9aabcbfa8a4d464c 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
Binary files a/po/lt.gmo and b/po/lt.gmo differ
diff --git a/po/lt.po b/po/lt.po
index ddbfee4185bccc7119513f358d6632b9013533b3..00307524fdde86fd3d831c09f9433b633cfc0da2 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
Binary files a/po/lv.gmo and b/po/lv.gmo differ
diff --git a/po/lv.po b/po/lv.po
index 143eb0ec2add7c9c5cedaceb028676ef2a48628e..54bcea0ceed1ff957138ad3d17acd172b4776fb4 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
Binary files a/po/mt.gmo and b/po/mt.gmo differ
diff --git a/po/mt.po b/po/mt.po
index 6bedda9dbb0b4eea1309f16cad9bad5913cc3dab..bd52aa5e8c34eb2fd62914429eebca686e76cd9b 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
Binary files a/po/nb.gmo and b/po/nb.gmo differ
diff --git a/po/nb.po b/po/nb.po
index b5cde954928a430f1303eea92ab8e9cac3c9ddf9..41fc4cc3942b4a403a69a42650815728292d5538 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
Binary files a/po/nl.gmo and b/po/nl.gmo differ
diff --git a/po/nl.po b/po/nl.po
index e66923a1c6367d5dd565ea3ae8ba67d47d713f1f..c8024d8d135c910ddd8994d6e0cd2ad311a4ea20 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
Binary files a/po/or.gmo and b/po/or.gmo differ
diff --git a/po/or.po b/po/or.po
index 554f68128e6125593a14e2fa4a6756ef2f1f1857..c5b0ea1ef589a3f326b97e8caa4641d88c37d203 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
Binary files a/po/pl.gmo and b/po/pl.gmo differ
diff --git a/po/pl.po b/po/pl.po
index ae70fe2cf6db08926b56c39dedf31a05c47061a9..831975eff45bfa621252e859663b5d080b83a982 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
Binary files a/po/pt_BR.gmo and b/po/pt_BR.gmo differ
diff --git a/po/pt_BR.po b/po/pt_BR.po
index edd0c130c44469b4391a1848173df9926425db04..6f1685300ea24ee2cc3a6b26e9e5c50029a13ff4 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
Binary files a/po/ro.gmo and b/po/ro.gmo differ
diff --git a/po/ro.po b/po/ro.po
index 8627528eac528b63b17e3b72b865dbda44cb2d18..9821052d73d005c27b97d878eda0887cd0538dc3 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
Binary files a/po/ru.gmo and b/po/ru.gmo differ
diff --git a/po/ru.po b/po/ru.po
index e192a1cb8aa341ad495e01b5c483e48f2049a69d..6176f554250a781ceee1556dfaff2e77a4f1fad7 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
Binary files a/po/sk.gmo and b/po/sk.gmo differ
diff --git a/po/sk.po b/po/sk.po
index 21c306b27a95a1705c0938c9f4d6402d4ff2ebef..3f37ae0cb8bc0761a9fbdede28aef078d4ab4116 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
Binary files a/po/sl.gmo and b/po/sl.gmo differ
diff --git a/po/sl.po b/po/sl.po
index b628aa4d2b509c3b1bd522bef9daa8732be4989d..a581fed7b941989b574e6d6525e5468d6a04dca3 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
Binary files a/po/sq.gmo and b/po/sq.gmo differ
diff --git a/po/sq.po b/po/sq.po
index 71792c614899a2642cf3a393b0c19813712b9f95..2061e2be6daa9f0fbd2c60236e9d48bef58fc4fa 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
Binary files a/po/sr.gmo and b/po/sr.gmo differ
diff --git a/po/sr.po b/po/sr.po
index b92f894791cf172d9b139a00ff7f077dadc3f9e7..0658a7cdbdfa44c7921ba61e5f2094d9b1c7b689 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
Binary files a/po/sv.gmo and b/po/sv.gmo differ
diff --git a/po/sv.po b/po/sv.po
index 2e5211280d3a72e9c93470aacfae546a685636d2..4a36f3eedc78d2d3ee4a367219f7b4fcc47178d9 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
Binary files a/po/tr.gmo and b/po/tr.gmo differ
diff --git a/po/tr.po b/po/tr.po
index f38fa9009d490418336f1c11e3776c59c1e1628b..13d74624774ff1ccdc070eb9d43faadb6bac1358 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
Binary files a/po/uk.gmo and b/po/uk.gmo differ
diff --git a/po/uk.po b/po/uk.po
index 0befc669fcbdbd8078d99b394a3771a82912ae94..5f8081199738fe3114818f2093f6e0d841ef5b89 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
Binary files a/po/vi.gmo and b/po/vi.gmo differ
diff --git a/po/vi.po b/po/vi.po
index 236e0cd90580128274d78ea9fb0740c58e6e0441..2172b42a0499b640acdcc6db4d949f5526844e68 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
Binary files a/po/zh_CN.gmo and b/po/zh_CN.gmo differ
diff --git a/po/zh_CN.po b/po/zh_CN.po
index eb27195543650b5059953f16ef58716cffa711db..1127515407fd5dee8dd35c4ac0a6776c3f9fc77c 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
Binary files a/po/zh_HK.gmo and b/po/zh_HK.gmo differ
diff --git a/po/zh_HK.po b/po/zh_HK.po
index 132f0dd8c41607819bf564cabe25112440717fa7..bd7bf836f0cf19b9010ec1b877ea4d578f4e50fe 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
Binary files a/po/zh_TW.gmo and b/po/zh_TW.gmo differ
diff --git a/po/zh_TW.po b/po/zh_TW.po
index 8369c2d15638be45764410b5328a2cc0e57efe83..1e82da2c52eacd7841bc1ac5f4441bbda2286660 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 b8c435cdcf91e374bb9a1492db2d789e072b3159..927c652d61ed3935317b47bb55ab87bb1e8a2fa7 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 6ff8d4bcc9c20a82cf769cd215a66fbaa1266b2c..fdcbd57af41a8540ce1de189c0787c79dfaa22c8 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 823f7dbb9185b40f979bad998110a9a2a6cdb002..9e8ca19c99932e587eba7329bf33f3ae3bbcd68c 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 c48d0b2a05c8dba459d450f14c7f6dbfa7d5b08a..6dc568ec71d0bfda16c1ae023b7cf56c1751542b 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 3ba5028c365256d7e4c60010a7a284c65ca3dc24..25d02ac64b600f6c5a9e21858bd1a80f04c95505 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 70f5440f3b8d326c1261ccb4547233a5d6dc2b06..08201a6abd9cf2cdf7ed0d3336fba80fb69c8bec 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 cbcf4f8388b214446206966835a17219bfbfc00c..cae03423f82b7438957867af296cf1a96e513b7c 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 dfde1f6c25bd91ebf5f2e46562b772ff3955a5c6..061609ee730fd417fd6bda2b9270ba839471d5a4 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 3621e8c8c4b187526973936c0cc97a410da931e0..d1269344b37e45cec9bc983b480356720f7eac5a 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 a5361d7483a93cbeb02c1576af48bf9a1a147c62..d4871f8d7f22d59e9c9cb2a292274384ce663745 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 0000000000000000000000000000000000000000..dc93b2be61a31c07cc7f0447795912d66c9863ac
--- /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 0000000000000000000000000000000000000000..54cf1cbc890a376446301859a92bff6d076ed5fa
--- /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 5e669c905b07cdcd0cbe906ad968cb39a3f3b286..f213769d92737a959bafb8f23463bca08ce69c11 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 7a7f8c733fb369856c1454e812d0102589477bac..3459637d5187ae5aa314cfc5afa75f66b47ae287 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 db2f974f15cfecbaf97ec8714aa68cdba9e00a0d..ef967bc41f7d317d4bf78bc5346ab5c32867a193 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 4313c3468d846114fe44f454a922367f82597dd0..f868d56b10a63e7121118da1ca2ccb1e28ee0559 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 c205b2ef48d56f21bf53c21c1930d0322e48cb5a..dbab52744484469cfa0afb8763e2b22f264d93dc 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 24f6d3f9d6bdcf0926cd0e85d4d334bb6afba711..93f20bb818cc98fc6337585ff3fbe2a9adc581ca 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 e388a3f3c39457b444ee4e2e58f3fcb16409ca46..12a30df2c5111141fc05e4d63aa9198f8cb60ecf 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 0000000000000000000000000000000000000000..a314bd0efe6217ac34197bc43633e4723ce75fa7
--- /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 0000000000000000000000000000000000000000..13d56c3d7cad9145057940a68c42c81cf8928269
--- /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 50a51104f60421174e97514e3fc1b1e6e1472307..1b4a051c731b46ce8f3d546ea6b57642ed0d985a 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 6ff2e736163620a443b28d15393b852ea32ccc65..2ea3e83f0db1c61a4658bf0b6661bc79a113f114 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 0000000000000000000000000000000000000000..899c19119d19fcfefff0136b7070ecbac1ca9c1d
--- /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 0000000000000000000000000000000000000000..9a73bd9139290a43d7a793277221209c3e385fd6
--- /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 186e78010f77415e53657043531c98d5b901fd17..793685380b0c04674f78ba68abfa9f46af4cde5f 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 3c85dae9fcb7b118f6c960f52b7d3a01980abfff..5a4bd8433d71ae158681577cfe2aeaf0b1a3e6d9 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 242295356711dd569158f78f7ed80569a3b593e3..08a9dcff99acb973e04f572bb92f9f55a6fc24a9 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 e36649daf71f9fb4c4b31dd744b2c00d6cd5ee01..e89dcba2f7258e1d7a9e92b65fa6470682b77e91 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 ab59535039d77208ca073a3f6109a015976911f9..0c284d485e19cddf6bdcae5ad5549a78a63283f8 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 b34317a05a09ea4d1333ec5df921380f746d4f36..268076e49390699ace15a3b4ff45b5f82a88f2e9 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 0fe5585a9015a8f29100d9719df3c9e769e9c5c1..1f410bf22fcc4b622013d559133d730d576f949f 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 6c09ef19ebdbde878dd992ce17861ecc80018729..e9528f9a5a0b9ac0ff8d2403e4ccb66989895bf8 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 578c8e9a8b801f22fe4f8b4f7666a0482b10e95f..31999ef62fc4c8cb45a5987248cb943d9f8aa2bc 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 2a81294d6e503a67cbfd24533d9ba03902d1121d..60683b76e8e1ad0b6e8dca6ddd678a11b7881607 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 40e4a9527ef138399f53986a1cc18af69803f5af..9c6206a1fb3ba56eab91b387e5d93cddebe03132 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 8f4049f4203615114f92cb636e3a7037d643dc21..41408902f8e64f0d92c4cc64a370df5beaa71c15 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 e68d38bd4e1763e859b9df5abc6a55680c0f2c28..ab90084c284d36ea52f3d4699cfdb60212e73c15 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 4a275d5d4b2bca7e0ca180681f68cdcd55751666..4df3220888defa873cb8e40e6ea38eb1803deffa 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 0083c25df47caa72329aeb8ddb9f92745e8197cd..f09f4bd0675593add1d4b47a09e51bf53d152fd1 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 13e4496fb300c0a5d206c917eda71b0cc0f115dc..86da4ffd35b39f96764722cc7d1aaf558e2d5008 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 930c099e846479bd3e3f10a86b549fb3afbe8a17..d5c8f9cc5048e70d08130ac88dd7ef75ffa2dd4d 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 f5f983d2469a2b923c35060c1bc87aa58ddcb462..d9f0da42aa0cfee3dfb8588288eeb1e804aecff4 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 ea21769ea746f712c63ecd652c69c646a9c454e5..27e83ff145c07c15a282137abb23bbd43dd032f0 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 58248d71010e828c886ff639a70dbe2b2395db4a..c6b6def7824d8764fc5a73f9c18d9564ced94e92 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 9a2e895dfe985c865be6372e1c4afea31b64ca81..eb04e1f661a064ddae92d43543bb72dcc77a1849 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 e631999d51278e73635f3392b34818befefc63c3..04b5cd2057ded2d23e30fc32431bf701f0c55fff 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 5a73400078d1789c3efa485f97fa2319c6ca0bcb..b0a3c36324c085b99b679bcd1cab8f67c8d71895 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 670f38f71c21ab2d1f3bebc6b2901b640752ef37..2f97d6ccb263a39357a4ac7ca91a3227d7273245 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 f7f1b9be1ad026162b763cb670c9ead4a16ad695..17685213bf85b65b50e9c407b8a23b08e6792c73 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 7dc2e320547bed03cfef04c444266bddb1e6d557..cc741015d3bd48bb73efc8b789395406b1e495d2 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 f878d195c5d28da3ff8c3879c4d848e4642c5299..a07c4a27f5dddb8e71a99e3cbcd7f286a800dc8a 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 1728c6a3e62b486b981a42c3dec85ed3939300d3..e69e143e6e2b404d74fde1f6aff4301ff5f40986 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