|
@@ -142,6 +142,21 @@ static __u32 uvc_try_frame_interval(struct uvc_frame *frame, __u32 interval)
|
|
|
return interval;
|
|
|
}
|
|
|
|
|
|
+static __u32 uvc_v4l2_get_bytesperline(const struct uvc_format *format,
|
|
|
+ const struct uvc_frame *frame)
|
|
|
+{
|
|
|
+ switch (format->fcc) {
|
|
|
+ case V4L2_PIX_FMT_NV12:
|
|
|
+ case V4L2_PIX_FMT_YVU420:
|
|
|
+ case V4L2_PIX_FMT_YUV420:
|
|
|
+ case V4L2_PIX_FMT_M420:
|
|
|
+ return frame->wWidth;
|
|
|
+
|
|
|
+ default:
|
|
|
+ return format->bpp * frame->wWidth / 8;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
static int uvc_v4l2_try_format(struct uvc_streaming *stream,
|
|
|
struct v4l2_format *fmt, struct uvc_streaming_control *probe,
|
|
|
struct uvc_format **uvc_format, struct uvc_frame **uvc_frame)
|
|
@@ -245,7 +260,7 @@ static int uvc_v4l2_try_format(struct uvc_streaming *stream,
|
|
|
fmt->fmt.pix.width = frame->wWidth;
|
|
|
fmt->fmt.pix.height = frame->wHeight;
|
|
|
fmt->fmt.pix.field = V4L2_FIELD_NONE;
|
|
|
- fmt->fmt.pix.bytesperline = format->bpp * frame->wWidth / 8;
|
|
|
+ fmt->fmt.pix.bytesperline = uvc_v4l2_get_bytesperline(format, frame);
|
|
|
fmt->fmt.pix.sizeimage = probe->dwMaxVideoFrameSize;
|
|
|
fmt->fmt.pix.colorspace = format->colorspace;
|
|
|
fmt->fmt.pix.priv = 0;
|
|
@@ -282,7 +297,7 @@ static int uvc_v4l2_get_format(struct uvc_streaming *stream,
|
|
|
fmt->fmt.pix.width = frame->wWidth;
|
|
|
fmt->fmt.pix.height = frame->wHeight;
|
|
|
fmt->fmt.pix.field = V4L2_FIELD_NONE;
|
|
|
- fmt->fmt.pix.bytesperline = format->bpp * frame->wWidth / 8;
|
|
|
+ fmt->fmt.pix.bytesperline = uvc_v4l2_get_bytesperline(format, frame);
|
|
|
fmt->fmt.pix.sizeimage = stream->ctrl.dwMaxVideoFrameSize;
|
|
|
fmt->fmt.pix.colorspace = format->colorspace;
|
|
|
fmt->fmt.pix.priv = 0;
|