v4l2src: fix v4l2_munmap() for compressed formats

Make sure we always call munmap() with the same size we called mmap()
with before.

Current v4l2src uses the same structure for VIDIOC_QUERYBUF, VIDIOC_QBUF
and v4l2_munmap calls. The problem is that the video buffer size (length)
may vary for compressed or emulated bufs. VIDIOC_QBUF will change it if
we pass the pointer of a v4l2_buffer. This is why we should avoid using
same variable for mmap and video buffers.

https://bugzilla.gnome.org/show_bug.cgi?id=671126
This commit is contained in:
Oleksij Rempel (Alexey Fisher) 2012-03-01 14:15:29 +01:00 committed by Tim-Philipp Müller
parent 50cd7c9ac6
commit 4cd9255f0a
2 changed files with 6 additions and 2 deletions

View file

@ -106,9 +106,9 @@ gst_v4l2_buffer_finalize (GstV4l2Buffer * buffer)
if (!resuscitated) { if (!resuscitated) {
GST_LOG_OBJECT (pool->v4l2elem, GST_LOG_OBJECT (pool->v4l2elem,
"buffer %p (data %p, len %u) not recovered, unmapping", "buffer %p (data %p, len %u) not recovered, unmapping",
buffer, GST_BUFFER_DATA (buffer), buffer->vbuffer.length); buffer, GST_BUFFER_DATA (buffer), buffer->mmap_length);
gst_mini_object_unref (GST_MINI_OBJECT (pool)); gst_mini_object_unref (GST_MINI_OBJECT (pool));
v4l2_munmap ((void *) GST_BUFFER_DATA (buffer), buffer->vbuffer.length); v4l2_munmap ((void *) GST_BUFFER_DATA (buffer), buffer->mmap_length);
GST_MINI_OBJECT_CLASS (v4l2buffer_parent_class)->finalize (GST_MINI_OBJECT GST_MINI_OBJECT_CLASS (v4l2buffer_parent_class)->finalize (GST_MINI_OBJECT
(buffer)); (buffer));
@ -183,6 +183,7 @@ gst_v4l2_buffer_new (GstV4l2BufferPool * pool, guint index, GstCaps * caps)
GST_LOG_OBJECT (pool->v4l2elem, " length: %u", ret->vbuffer.length); GST_LOG_OBJECT (pool->v4l2elem, " length: %u", ret->vbuffer.length);
GST_LOG_OBJECT (pool->v4l2elem, " input: %u", ret->vbuffer.input); GST_LOG_OBJECT (pool->v4l2elem, " input: %u", ret->vbuffer.input);
ret->mmap_length = ret->vbuffer.length;
data = (guint8 *) v4l2_mmap (0, ret->vbuffer.length, data = (guint8 *) v4l2_mmap (0, ret->vbuffer.length,
PROT_READ | PROT_WRITE, MAP_SHARED, pool->video_fd, PROT_READ | PROT_WRITE, MAP_SHARED, pool->video_fd,
ret->vbuffer.m.offset); ret->vbuffer.m.offset);

View file

@ -70,6 +70,9 @@ struct _GstV4l2Buffer {
GstBuffer buffer; GstBuffer buffer;
struct v4l2_buffer vbuffer; struct v4l2_buffer vbuffer;
/* warning: the size of mmap buffer and
* the actual frame-buffer can be different. */
size_t mmap_length;
/* FIXME: have GstV4l2Src* instead, as this has GstV4l2BufferPool* */ /* FIXME: have GstV4l2Src* instead, as this has GstV4l2BufferPool* */
/* FIXME: do we really want to fix this if GstV4l2Buffer/Pool is shared /* FIXME: do we really want to fix this if GstV4l2Buffer/Pool is shared