sys/v4l2/v4l2src_calls.c: Add some more debug info. Generate an error when we run out of buffers for some reason. See...

Original commit message from CVS:
* sys/v4l2/v4l2src_calls.c: (gst_v4l2_buffer_finalize),
(gst_v4l2src_grab_frame):
Add some more debug info. Generate an error when we run out of buffers
for some reason. See #480557.
This commit is contained in:
Wim Taymans 2007-10-18 14:55:38 +00:00
parent f96453277a
commit 279fe5fac6
2 changed files with 40 additions and 5 deletions

View file

@ -1,3 +1,10 @@
2007-10-18 Wim Taymans <wim.taymans@gmail.com>
* sys/v4l2/v4l2src_calls.c: (gst_v4l2_buffer_finalize),
(gst_v4l2src_grab_frame):
Add some more debug info. Generate an error when we run out of buffers
for some reason. See #480557.
2007-10-18 Wim Taymans <wim.taymans@gmail.com>
Patch by: Anders Skargren <anders dot skargren at axis dot com>

View file

@ -66,10 +66,13 @@ gst_v4l2_buffer_finalize (GstV4l2Buffer * buffer)
{
GstV4l2BufferPool *pool;
gboolean resuscitated = FALSE;
gint index;
pool = buffer->pool;
GST_LOG ("finalizing buffer %d", buffer->vbuffer.index);
index = buffer->vbuffer.index;
GST_LOG ("finalizing buffer %p %d", buffer, index);
g_mutex_lock (pool->lock);
if (GST_BUFFER_SIZE (buffer) != 0)
@ -78,18 +81,22 @@ gst_v4l2_buffer_finalize (GstV4l2Buffer * buffer)
if (pool->running) {
if (ioctl (pool->video_fd, VIDIOC_QBUF, &buffer->vbuffer) < 0) {
GST_WARNING ("could not requeue buffer %d", buffer->vbuffer.index);
GST_WARNING ("could not requeue buffer %p %d", buffer, index);
} else {
/* FIXME: check that the caps didn't change */
GST_LOG ("reviving buffer %p, %d", buffer, index);
gst_buffer_ref (GST_BUFFER (buffer));
GST_BUFFER_SIZE (buffer) = 0;
pool->buffers[buffer->vbuffer.index] = buffer;
pool->buffers[index] = buffer;
resuscitated = TRUE;
}
} else {
GST_LOG ("the pool is shutting down");
}
g_mutex_unlock (pool->lock);
if (!resuscitated) {
GST_LOG ("buffer %p not recovered, unmapping", buffer);
gst_mini_object_unref (GST_MINI_OBJECT (pool));
munmap (GST_BUFFER_DATA (buffer), buffer->vbuffer.length);
}
@ -857,6 +864,7 @@ gst_v4l2src_grab_frame (GstV4l2Src * v4l2src, GstBuffer ** buf)
gint32 trials = NUM_TRIALS;
GstBuffer *pool_buffer;
gboolean need_copy;
gint index;
memset (&buffer, 0x00, sizeof (buffer));
buffer.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
@ -936,10 +944,21 @@ gst_v4l2src_grab_frame (GstV4l2Src * v4l2src, GstBuffer ** buf)
g_mutex_lock (v4l2src->pool->lock);
pool_buffer = GST_BUFFER (v4l2src->pool->buffers[buffer.index]);
index = buffer.index;
v4l2src->pool->buffers[buffer.index] = NULL;
/* get our GstBuffer with that index from the pool, if the buffer was
* outstanding we have a serious problem. */
pool_buffer = GST_BUFFER (v4l2src->pool->buffers[index]);
if (pool_buffer == NULL)
goto no_buffer;
GST_LOG_OBJECT (v4l2src, "grabbed buffer %p at index %d", pool_buffer, index);
/* we have the buffer now, mark the spot in the pool empty */
v4l2src->pool->buffers[index] = NULL;
v4l2src->pool->num_live_buffers++;
/* if we are handing out the last buffer in the pool, we need to make a
* copy and bring the buffer back in the pool. */
need_copy = v4l2src->pool->num_live_buffers == v4l2src->pool->buffer_count;
g_mutex_unlock (v4l2src->pool->lock);
@ -1017,6 +1036,15 @@ too_many_trials:
NUM_TRIALS, v4l2src->v4l2object->videodev, g_strerror (errno)));
return GST_FLOW_ERROR;
}
no_buffer:
{
GST_ELEMENT_ERROR (v4l2src, RESOURCE, FAILED,
(_("Failed trying to get video frames from device '%s'."),
v4l2src->v4l2object->videodev),
(_("No free buffers found in the pool at index %d."), index));
g_mutex_unlock (v4l2src->pool->lock);
return GST_FLOW_ERROR;
}
/*
qbuf_failed:
{