Index: video2.c
===================================================================
--- video2.c	(revision 482)
+++ video2.c	(working copy)
@@ -8,12 +8,12 @@
  * Supported features and TODO
    - preferred palette is JPEG which seems to be very popular for many 640x480 usb cams
    - other supported palettes (NOT TESTED)
-       V4L2_PIX_FMT_SBGGR8    (sonix)    
        V4L2_PIX_FMT_SN9C10X   (sonix)
        V4L2_PIX_FMT_SBGGR16,
-       V4L2_PIX_FMT_SBGGR8,
+       V4L2_PIX_FMT_SBGGR8,   (sonix)
        V4L2_PIX_FMT_SPCA561,
        V4L2_PIX_FMT_SGBRG8,
+       V4L2_PIX_FMT_SGRBG8,
        V4L2_PIX_FMT_PAC207,
        V4L2_PIX_FMT_PJPG,
        V4L2_PIX_FMT_MJPEG,    (tested)
@@ -868,6 +868,11 @@
     sigaddset(&set, SIGHUP);
     pthread_sigmask(SIG_BLOCK, &set, &old);
 
+    if (debug_level >= CAMERA_VIDEO) {
+        motion_log(LOG_DEBUG, 0, "%s: 1) vid_source->pframe %i", 
+                   __FUNCTION__, vid_source->pframe);
+    }
+
     if (vid_source->pframe >= 0) {
         if (xioctl(vid_source->fd, VIDIOC_QBUF, &vid_source->buf) == -1) {
             motion_log(LOG_ERR, 1, "%s: VIDIOC_QBUF", __FUNCTION__);
@@ -882,6 +887,7 @@
     vid_source->buf.memory = V4L2_MEMORY_MMAP;
 
     if (xioctl(vid_source->fd, VIDIOC_DQBUF, &vid_source->buf) == -1) {
+        int ret;
         /* some drivers return EIO when there is no signal, 
            driver might dequeue an (empty) buffer despite
            returning an error, or even stop capturing.
@@ -891,22 +897,40 @@
 
             if ((u32)vid_source->pframe >= vid_source->req.count) 
                 vid_source->pframe = 0;
-                vid_source->buf.index = vid_source->pframe;
-                motion_log(LOG_ERR, 1, "%s: VIDIOC_DQBUF: EIO (vid_source->pframe %d)", 
-                           __FUNCTION__, vid_source->pframe);
-                return 1;
+
+             vid_source->buf.index = vid_source->pframe;
+             motion_log(LOG_ERR, 1, "%s: VIDIOC_DQBUF: EIO (vid_source->pframe %d)", 
+                        __FUNCTION__, vid_source->pframe);
+             ret = 1;
+        } else if (errno == EAGAIN) {
+            motion_log(LOG_INFO, 1, "%s: VIDIOC_DQBUF: EAGAIN (vid_source->pframe %d)",
+                       __FUNCTION__, vid_source->pframe);
+            ret = 1;
+        } else {
+            motion_log(LOG_ERR, 1, "%s: VIDIOC_DQBUF", __FUNCTION__);
+            ret = -1;
         }
 
-        motion_log(LOG_ERR, 1, "%s: VIDIOC_DQBUF", __FUNCTION__);
         pthread_sigmask(SIG_UNBLOCK, &old, NULL);
-        return -1;
+        return ret;
     }
 
+    if (debug_level >= CAMERA_VIDEO) {
+        motion_log(LOG_DEBUG, 0, "%s: 2) vid_source->pframe %i", 
+                   __FUNCTION__, vid_source->pframe);
+    }
 
     vid_source->pframe = vid_source->buf.index;
     vid_source->buffers[vid_source->buf.index].used = vid_source->buf.bytesused;
     vid_source->buffers[vid_source->buf.index].content_length = vid_source->buf.bytesused;
 
+    if (debug_level >= CAMERA_VIDEO) {
+        motion_log(LOG_DEBUG, 0, "%s: 3) vid_source->pframe %i vid_source->buf.index %i", 
+                   __FUNCTION__, vid_source->pframe, vid_source->buf.index);
+        motion_log(LOG_DEBUG, 0, "%s: vid_source->buf.bytesused %i", 
+                   __FUNCTION__, vid_source->buf.bytesused);
+    }
+
     pthread_sigmask(SIG_UNBLOCK, &old, NULL);    /*undo the signal blocking */
 
     {
