diff options
author | Jaime Velasco Juan <jsagarribay@gmail.com> | 2008-07-22 11:28:36 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@infradead.org> | 2008-07-26 12:18:15 -0400 |
commit | b18559076a31ab0be2d980ce2beff8e32504e080 (patch) | |
tree | 755a4c6265baab9a7873a552e75d18cfe6671324 /drivers/media/video | |
parent | f78d92c9ffcda7451b5943ab491c087f1ec7e08d (diff) |
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')
-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 8aa56fe02546..a8a72768ca91 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) | |||
445 | fb->v4lbuf.bytesused = 0; | 445 | fb->v4lbuf.bytesused = 0; |
446 | fill = fb->buffer; | 446 | fill = fb->buffer; |
447 | } else if (fb->v4lbuf.bytesused == dev->frame_size) { | 447 | } else if (fb->v4lbuf.bytesused == dev->frame_size) { |
448 | list_move_tail(dev->sio_avail.next, | 448 | if (list_is_singular(&dev->sio_avail)) { |
449 | &dev->sio_full); | 449 | /* Always reuse the last buffer */ |
450 | wake_up(&dev->wait_frame); | 450 | fb->v4lbuf.bytesused = 0; |
451 | if (list_empty(&dev->sio_avail)) { | 451 | fill = fb->buffer; |
452 | (void) (printk_ratelimit() && | 452 | } else { |
453 | STK_ERROR("No buffer available\n")); | 453 | list_move_tail(dev->sio_avail.next, |
454 | goto resubmit; | 454 | &dev->sio_full); |
455 | wake_up(&dev->wait_frame); | ||
456 | fb = list_first_entry(&dev->sio_avail, | ||
457 | struct stk_sio_buffer, list); | ||
458 | fb->v4lbuf.bytesused = 0; | ||
459 | fill = fb->buffer; | ||
455 | } | 460 | } |
456 | fb = list_first_entry(&dev->sio_avail, | ||
457 | struct stk_sio_buffer, list); | ||
458 | fb->v4lbuf.bytesused = 0; | ||
459 | fill = fb->buffer; | ||
460 | } | 461 | } |
461 | } else { | 462 | } else { |
462 | framelen -= 4; | 463 | framelen -= 4; |