mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-18 22:36:33 +00:00
496995a7d5
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 |
||
---|---|---|
.. | ||
.gitignore | ||
gstv4l2-marshal.list | ||
gstv4l2.c | ||
gstv4l2bufferpool.c | ||
gstv4l2bufferpool.h | ||
gstv4l2colorbalance.c | ||
gstv4l2colorbalance.h | ||
gstv4l2object.c | ||
gstv4l2object.h | ||
gstv4l2radio.c | ||
gstv4l2radio.h | ||
gstv4l2sink.c | ||
gstv4l2sink.h | ||
gstv4l2src.c | ||
gstv4l2src.h | ||
gstv4l2tuner.c | ||
gstv4l2tuner.h | ||
gstv4l2videooverlay.c | ||
gstv4l2videooverlay.h | ||
gstv4l2vidorient.c | ||
gstv4l2vidorient.h | ||
Makefile.am | ||
README | ||
tuner-marshal.list | ||
tuner.c | ||
tuner.h | ||
tunerchannel.c | ||
tunerchannel.h | ||
tunernorm.c | ||
tunernorm.h | ||
v4l2_calls.c | ||
v4l2_calls.h |
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/