diff options
author | Jaime Velasco Juan <jsagarribay@gmail.com> | 2008-07-22 12:28:36 -0300 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@infradead.org> | 2008-07-26 13:18:15 -0300 |
commit | b18559076a31ab0be2d980ce2beff8e32504e080 (patch) | |
tree | 755a4c6265baab9a7873a552e75d18cfe6671324 /drivers/media/video/stk-webcam.c | |
parent | f78d92c9ffcda7451b5943ab491c087f1ec7e08d (diff) | |
download | op-kernel-dev-b18559076a31ab0be2d980ce2beff8e32504e080.zip op-kernel-dev-b18559076a31ab0be2d980ce2beff8e32504e080.tar.gz |
V4L/DVB (8491): stkwebcam: Always reuse last queued buffer
This change keeps the video stream going on when the application
is slow queuing buffers, instead of spamming dmesg and hanging.
Fixes a problem with aMSN reported by Samed Beyribey <beyribey@gmail.com>
Signed-off-by: Jaime Velasco Juan <jsagarribay@gmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
Diffstat (limited to 'drivers/media/video/stk-webcam.c')
-rw-r--r-- | drivers/media/video/stk-webcam.c | 23 |
1 files changed, 12 insertions, 11 deletions
diff --git a/drivers/media/video/stk-webcam.c b/drivers/media/video/stk-webcam.c index 8aa56fe..a8a7276 100644 --- a/drivers/media/video/stk-webcam.c +++ b/drivers/media/video/stk-webcam.c @@ -445,18 +445,19 @@ static void stk_isoc_handler(struct urb *urb) fb->v4lbuf.bytesused = 0; fill = fb->buffer; } else if (fb->v4lbuf.bytesused == dev->frame_size) { - list_move_tail(dev->sio_avail.next, - &dev->sio_full); - wake_up(&dev->wait_frame); - if (list_empty(&dev->sio_avail)) { - (void) (printk_ratelimit() && - STK_ERROR("No buffer available\n")); - goto resubmit; + if (list_is_singular(&dev->sio_avail)) { + /* Always reuse the last buffer */ + fb->v4lbuf.bytesused = 0; + fill = fb->buffer; + } else { + list_move_tail(dev->sio_avail.next, + &dev->sio_full); + wake_up(&dev->wait_frame); + fb = list_first_entry(&dev->sio_avail, + struct stk_sio_buffer, list); + fb->v4lbuf.bytesused = 0; + fill = fb->buffer; } - fb = list_first_entry(&dev->sio_avail, - struct stk_sio_buffer, list); - fb->v4lbuf.bytesused = 0; - fill = fb->buffer; } } else { framelen -= 4; |