gstreamer/sys/v4l2
Michael Olbrich 496995a7d5 v4l2: rework sink buffer refcounting
This is a followup patch for #700781, which is not quite correct.
The buffer handling is quite complicated here.
The original code intended to the the following:

- gst_v4l2_buffer_pool_process() calls QBUF and adds the buffer to the
  local list.
- The sink calls gst_buffer_unref() which returns the buffer to the pool
  but not the 'free list'.
- Some time later DQBUF returns the buffer and
  gst_v4l2_buffer_pool_release_buffer() puts in on the 'free list'.

If the buffer must be copied then (parent_class)->acquire_buffer() is
called directly to keep the buffer in the pool.

This has two problems:
1. If gst_v4l2_buffer_pool_release_buffer() is called before the buffer is
   returned to the pool, then the buffer is put on the 'free list' twice.
   This can happen if a reference to the buffer is kept outside the sink,
   of if DQBUF returns the buffer, that was just queued with QBUF.
2. If buffers are copied, then all buffers are in the pool at all times. As
   a result gst_v4l2_buffer_pool_stop() and gst_v4l2_buffer_pool_dqbuf()
   can access pool->buffers at the same time, which can lead to memory
   corruption.

The patch for #700781 fixes those problems, but with the side effect that
there are always buffers outside the pool (because they are queued) and
the pool is never stopped.
This patch fixes this by releasing the reference to the buffer after
handling it (to avoid problem 2.) so it can be returned to the pool.
gst_v4l2_buffer_pool_release_buffer() is only called if the buffer is
already in the pool (to avoid problem 1.).

Fixes https://bugzilla.gnome.org/show_bug.cgi?id=701375
2013-06-03 11:55:48 +02:00
..
.gitignore v4l2src: Adding a pre-set-format signal 2012-04-19 09:45:49 +02:00
gstv4l2-marshal.list v4l2src: Adding a pre-set-format signal 2012-04-19 09:45:49 +02:00
gstv4l2.c Fix FSF address 2012-11-04 00:07:18 +00:00
gstv4l2bufferpool.c v4l2: rework sink buffer refcounting 2013-06-03 11:55:48 +02:00
gstv4l2bufferpool.h v4l2: try to allocate new buffers with VIDIOC_CREATE_BUFS if needed 2013-05-03 11:18:04 +02:00
gstv4l2colorbalance.c Fix FSF address 2012-11-04 00:07:18 +00:00
gstv4l2colorbalance.h Fix FSF address 2012-11-04 00:07:18 +00:00
gstv4l2object.c v4l2: add a property for arbitrary v4l2 controls 2013-05-29 20:18:11 +02:00
gstv4l2object.h v4l2: add a property for arbitrary v4l2 controls 2013-05-29 20:18:11 +02:00
gstv4l2radio.c Fix FSF address 2012-11-04 00:07:18 +00:00
gstv4l2radio.h Fix FSF address 2012-11-04 00:07:18 +00:00
gstv4l2sink.c v4l2: Don't stop streaming when set_caps is called with unchanged caps 2013-05-20 11:13:18 +02:00
gstv4l2sink.h Fix FSF address 2012-11-04 00:07:18 +00:00
gstv4l2src.c v4l2: Don't stop streaming when set_caps is called with unchanged caps 2013-05-20 11:13:18 +02:00
gstv4l2src.h Fix FSF address 2012-11-04 00:07:18 +00:00
gstv4l2tuner.c Fix FSF address 2012-11-04 00:07:18 +00:00
gstv4l2tuner.h Fix FSF address 2012-11-04 00:07:18 +00:00
gstv4l2videooverlay.c Fix FSF address 2012-11-04 00:07:18 +00:00
gstv4l2videooverlay.h Fix FSF address 2012-11-04 00:07:18 +00:00
gstv4l2vidorient.c Fix FSF address 2012-11-04 00:07:18 +00:00
gstv4l2vidorient.h Fix FSF address 2012-11-04 00:07:18 +00:00
Makefile.am gst: Add better support for static plugins 2013-04-15 15:54:11 +02:00
README Fix level for multi-channel case. 2007-02-22 14:35:28 +00:00
tuner-marshal.list Update everything for the removal of the interface library and mixer/tuner interfaces 2012-04-13 13:15:11 +02:00
tuner.c Fix FSF address 2012-11-04 00:07:18 +00:00
tuner.h Fix FSF address 2012-11-04 00:07:18 +00:00
tunerchannel.c Fix FSF address 2012-11-04 00:07:18 +00:00
tunerchannel.h Fix FSF address 2012-11-04 00:07:18 +00:00
tunernorm.c Fix FSF address 2012-11-04 00:07:18 +00:00
tunernorm.h Fix FSF address 2012-11-04 00:07:18 +00:00
v4l2_calls.c v4l2: Only conditionally use V4L2_CTRL_TYPE_INTEGER_MENU, it's not available in older versions 2013-05-29 20:35:41 +02:00
v4l2_calls.h v4l2: add a property for arbitrary v4l2 controls 2013-05-29 20:18:11 +02:00

v4l2 plugins
============

The idea is a bit the same as the idea for the v4l1 plugins. We want
one generic v4l2element, and a few child objects (probably only two:
v4l2src and v4l2sink):

                /-------- v4l2src
v4l2element ---=
                \-------- v4l2sink

Both v4l2src and v4l2sink have a uncompressed and a compressed
recording-/playback-mode. Since this is all part of v4l2, the 'client'
of these elements, i.e. an application using v4l2src/v4l2sink, will
hardly notice this. All capsnego stuff is done inside, and the plugin
knows which formats are compressed and which are not.

Please note that the v4l1 and the v4l2 plugins are *not* compatible
concerning properties. Naming has been kept the same where possible,
but in some cases, properties had to be removed or added to make
full use of v4l2.

V4L2 API: http://linux.bytesex.org/v4l2/.
          http://v4l2spec.bytesex.org/
          /usr/include/linux/videodev2.h or

Kernel patches available from
          http://dl.bytesex.org/patches/.

Articles:
          http://lwn.net/Articles/203924/