Some webcams report wired dwMaxVideoFrameBufferSize size,
some times too big, some times too smole.

I tested two webcams:
046d:0809 Logitech, Inc. Webcam Pro 9000
046d:0991 Logitech, Inc. QuickCam Pro for Notebooks
with fallowing results.

The dwMaxVideoFrameBufferSize is not always the same. Reported
range is about betwene 4 and 10 bpp calculated with this formula:
bpp = (dwMaxVideoFrameBufferSize * 8) / (frame->wWidth * frame->wHeight)

I tested also a real comression on this cameras. Comression
with noremal conditions (video chat) was about 1 bpp.
Worst compression was by captureing moving text on monitore
(lots of light, high fps) is about 3bpp.
So we can calculate predictable buffer size in driver, insted of
getting some random numers from the cam.

Setting bpp to 4 for mjpeg should be safe.

Signed-off-by: Alexey Fisher <bug-tr...@fisher-privat.net>
---
 drivers/media/video/uvc/uvc_driver.c |    5 +++--
 drivers/media/video/uvc/uvc_video.c  |    3 ++-
 2 files changed, 5 insertions(+), 3 deletions(-)

diff --git a/drivers/media/video/uvc/uvc_driver.c 
b/drivers/media/video/uvc/uvc_driver.c
index e41285a..5a74de0 100644
--- a/drivers/media/video/uvc/uvc_driver.c
+++ b/drivers/media/video/uvc/uvc_driver.c
@@ -347,7 +347,7 @@ static int uvc_parse_format(struct uvc_device *dev,
                strlcpy(format->name, "MJPEG", sizeof format->name);
                format->fcc = V4L2_PIX_FMT_MJPEG;
                format->flags = UVC_FMT_FLAG_COMPRESSED;
-               format->bpp = 0;
+               format->bpp = 4;
                ftype = UVC_VS_FRAME_MJPEG;
                break;
 
@@ -460,7 +460,8 @@ static int uvc_parse_format(struct uvc_device *dev,
                 * uncompressed formats this can be fixed by computing the
                 * value from the frame size.
                 */
-               if (!(format->flags & UVC_FMT_FLAG_COMPRESSED))
+               if (!(format->flags & UVC_FMT_FLAG_COMPRESSED) ||
+                               (format->fcc == V4L2_PIX_FMT_MJPEG))
                        frame->dwMaxVideoFrameBufferSize = format->bpp
                                * frame->wWidth * frame->wHeight / 8;
 
diff --git a/drivers/media/video/uvc/uvc_video.c 
b/drivers/media/video/uvc/uvc_video.c
index 9a95a62..64bd1d6 100644
--- a/drivers/media/video/uvc/uvc_video.c
+++ b/drivers/media/video/uvc/uvc_video.c
@@ -114,7 +114,8 @@ static void uvc_fixup_video_ctrl(struct uvc_streaming 
*stream,
 
        if (!(format->flags & UVC_FMT_FLAG_COMPRESSED) ||
             (ctrl->dwMaxVideoFrameSize == 0 &&
-             stream->dev->uvc_version < 0x0110)) {
+             stream->dev->uvc_version < 0x0110) ||
+            (format->fcc == V4L2_PIX_FMT_MJPEG)) {
                pr_debug("%s: rewrite dwMaxVideoFrameSize=%u to %u.",
                         __func__, ctrl->dwMaxVideoFrameSize,
                        frame->dwMaxVideoFrameBufferSize);
-- 
1.7.1

_______________________________________________
Linux-uvc-devel mailing list
Linux-uvc-devel@lists.berlios.de
https://lists.berlios.de/mailman/listinfo/linux-uvc-devel

Reply via email to