media: gspca: support multiple pixel formats in TRY_FMT
authorPhilipp Zabel <philipp.zabel@gmail.com>
Fri, 14 Dec 2018 16:40:26 +0000 (11:40 -0500)
committerMauro Carvalho Chehab <mchehab+samsung@kernel.org>
Wed, 16 Jan 2019 18:57:12 +0000 (13:57 -0500)
If a driver supports multiple pixel formats with the same frame size,
TRY_FMT will currently always return the first pixel format.
Fix this by adding pixelformat support to wxh_to_nearest_mode().

Signed-off-by: Philipp Zabel <philipp.zabel@gmail.com>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
drivers/media/usb/gspca/gspca.c

index 13361cfa6903aa7a83c105b01a44cf3fc3a61faf..ac70b36d67b7bf9001eb64378b7e4721a8c21d77 100644 (file)
@@ -926,10 +926,16 @@ static int wxh_to_mode(struct gspca_dev *gspca_dev,
 }
 
 static int wxh_to_nearest_mode(struct gspca_dev *gspca_dev,
-                       int width, int height)
+                       int width, int height, u32 pixelformat)
 {
        int i;
 
+       for (i = gspca_dev->cam.nmodes; --i > 0; ) {
+               if (width >= gspca_dev->cam.cam_mode[i].width
+                   && height >= gspca_dev->cam.cam_mode[i].height
+                   && pixelformat == gspca_dev->cam.cam_mode[i].pixelformat)
+                       return i;
+       }
        for (i = gspca_dev->cam.nmodes; --i > 0; ) {
                if (width >= gspca_dev->cam.cam_mode[i].width
                    && height >= gspca_dev->cam.cam_mode[i].height)
@@ -1059,7 +1065,7 @@ static int try_fmt_vid_cap(struct gspca_dev *gspca_dev,
                    fmt->fmt.pix.pixelformat, w, h);
 
        /* search the nearest mode for width and height */
-       mode = wxh_to_nearest_mode(gspca_dev, w, h);
+       mode = wxh_to_nearest_mode(gspca_dev, w, h, fmt->fmt.pix.pixelformat);
 
        /* OK if right palette */
        if (gspca_dev->cam.cam_mode[mode].pixelformat