summaryrefslogtreecommitdiffstats
path: root/sys/v4l2/v4l2src_calls.c
diff options
context:
space:
mode:
authorThomas Vander Stichele <thomas (at) apestaart (dot) org>2009-03-02 09:43:30 +0100
committerThomas Vander Stichele <thomas (at) apestaart (dot) org>2009-03-02 09:43:30 +0100
commit9f25f96155b246663a1f900624ccda4b9eafcded (patch)
tree029a4a4e8e96dc27e5f3ba38615bcfe9bee64455 /sys/v4l2/v4l2src_calls.c
parent13221762d09f8faacfbd682e68500ff22e6eb8ab (diff)
parent0083b9e40569db889500a3c1abd7ec3ac8876fee (diff)
Merge branch 'master' of ssh://thomasvs@git.freedesktop.org/git/gstreamer/gst-plugins-good
Diffstat (limited to 'sys/v4l2/v4l2src_calls.c')
-rw-r--r--sys/v4l2/v4l2src_calls.c33
1 files changed, 31 insertions, 2 deletions
diff --git a/sys/v4l2/v4l2src_calls.c b/sys/v4l2/v4l2src_calls.c
index c247c497..5abfda31 100644
--- a/sys/v4l2/v4l2src_calls.c
+++ b/sys/v4l2/v4l2src_calls.c
@@ -771,6 +771,7 @@ unknown_type:
}
#endif /* defined VIDIOC_ENUM_FRAMEINTERVALS */
+#ifdef VIDIOC_ENUM_FRAMESIZES
static gint
sort_by_frame_size (GstStructure * s1, GstStructure * s2)
{
@@ -784,6 +785,7 @@ sort_by_frame_size (GstStructure * s1, GstStructure * s2)
/* I think it's safe to assume that this won't overflow for a while */
return ((w2 * h2) - (w1 * h1));
}
+#endif
GstCaps *
gst_v4l2src_probe_caps_for_format (GstV4l2Src * v4l2src, guint32 pixelformat,
@@ -974,7 +976,7 @@ default_frame_sizes:
/******************************************************
* gst_v4l2src_grab_frame ():
* grab a frame for capturing
- * return value: GST_FLOW_OK or GST_FLOW_ERROR
+ * return value: GST_FLOW_OK, GST_FLOW_WRONG_STATE or GST_FLOW_ERROR
******************************************************/
GstFlowReturn
gst_v4l2src_grab_frame (GstV4l2Src * v4l2src, GstBuffer ** buf)
@@ -985,12 +987,28 @@ gst_v4l2src_grab_frame (GstV4l2Src * v4l2src, GstBuffer ** buf)
GstBuffer *pool_buffer;
gboolean need_copy;
gint index;
+ gint ret;
memset (&buffer, 0x00, sizeof (buffer));
buffer.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
buffer.memory = V4L2_MEMORY_MMAP;
- while (v4l2_ioctl (v4l2src->v4l2object->video_fd, VIDIOC_DQBUF, &buffer) < 0) {
+ for (;;) {
+ ret = gst_poll_wait (v4l2src->v4l2object->poll, GST_CLOCK_TIME_NONE);
+ if (G_UNLIKELY (ret < 0)) {
+ if (errno == EBUSY)
+ goto stopped;
+#ifdef G_OS_WIN32
+ if (WSAGetLastError () != WSAEINTR)
+ goto select_error;
+#else
+ if (errno != EAGAIN && errno != EINTR)
+ goto select_error;
+#endif
+ }
+
+ if (v4l2_ioctl (v4l2src->v4l2object->video_fd, VIDIOC_DQBUF, &buffer) >= 0)
+ break;
GST_WARNING_OBJECT (v4l2src,
"problem grabbing frame %d (ix=%d), trials=%d, pool-ct=%d, buf.flags=%d",
@@ -1133,6 +1151,17 @@ gst_v4l2src_grab_frame (GstV4l2Src * v4l2src, GstBuffer ** buf)
return GST_FLOW_OK;
/* ERRORS */
+select_error:
+ {
+ GST_ELEMENT_ERROR (v4l2src, RESOURCE, READ, (NULL),
+ ("select error %d: %s (%d)", ret, g_strerror (errno), errno));
+ return GST_FLOW_ERROR;
+ }
+stopped:
+ {
+ GST_DEBUG ("stop called");
+ return GST_FLOW_WRONG_STATE;
+ }
einval:
{
GST_ELEMENT_ERROR (v4l2src, RESOURCE, FAILED,