v4l2bufferpool: Handle FD error during poll

This will ensure we fail earlier if something unrecoverable
happens.
This commit is contained in:
Nicolas Dufresne 2014-07-03 15:29:54 -04:00
parent 652ed3bceb
commit 3f15e67923
2 changed files with 9 additions and 5 deletions

View file

@ -969,6 +969,9 @@ again:
}
}
if (gst_poll_fd_has_error (pool->poll, &pool->pollfd))
goto select_error;
done:
return GST_FLOW_OK;
@ -1410,7 +1413,6 @@ gst_v4l2_buffer_pool_new (GstV4l2Object * obj, GstCaps * caps)
GstStructure *config;
gchar *name, *parent_name;
gint fd;
GstPollFD pollfd = GST_POLL_FD_INIT;
fd = v4l2_dup (obj->video_fd);
if (fd < 0)
@ -1426,12 +1428,13 @@ gst_v4l2_buffer_pool_new (GstV4l2Object * obj, GstCaps * caps)
"name", name, NULL);
g_free (name);
pollfd.fd = fd;
gst_poll_add_fd (pool->poll, &pollfd);
gst_poll_fd_init (&pool->pollfd);
pool->pollfd.fd = fd;
gst_poll_add_fd (pool->poll, &pool->pollfd);
if (V4L2_TYPE_IS_OUTPUT (obj->type))
gst_poll_fd_ctl_write (pool->poll, &pollfd, TRUE);
gst_poll_fd_ctl_write (pool->poll, &pool->pollfd, TRUE);
else
gst_poll_fd_ctl_read (pool->poll, &pollfd, TRUE);
gst_poll_fd_ctl_read (pool->poll, &pool->pollfd, TRUE);
pool->video_fd = fd;
pool->obj = obj;

View file

@ -51,6 +51,7 @@ struct _GstV4l2BufferPool
GstV4l2Object *obj; /* the v4l2 object */
gint video_fd; /* a dup(2) of the v4l2object's video_fd */
GstPoll *poll; /* a poll for video_fd */
GstPollFD pollfd;
gboolean can_poll_device;
gboolean empty;