Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a4a78718 authored by Hans Verkuil's avatar Hans Verkuil Committed by Mauro Carvalho Chehab
Browse files

V4L/DVB (10486): ivtv/cx18: fix g_fmt and try_fmt for raw video



The raw video device didn't report the image size correctly.

When setting a new image the image height has to be a multiple of 32 lines.

Signed-off-by: default avatarHans Verkuil <hverkuil@xs4all.nl>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent fdf9c997
Loading
Loading
Loading
Loading
+11 −6
Original line number Original line Diff line number Diff line
@@ -160,10 +160,8 @@ static int cx18_g_fmt_vid_cap(struct file *file, void *fh,
	pixfmt->priv = 0;
	pixfmt->priv = 0;
	if (id->type == CX18_ENC_STREAM_TYPE_YUV) {
	if (id->type == CX18_ENC_STREAM_TYPE_YUV) {
		pixfmt->pixelformat = V4L2_PIX_FMT_HM12;
		pixfmt->pixelformat = V4L2_PIX_FMT_HM12;
		/* YUV size is (Y=(h*w) + UV=(h*(w/2))) */
		/* YUV size is (Y=(h*720) + UV=(h*(720/2))) */
		pixfmt->sizeimage =
		pixfmt->sizeimage = pixfmt->height * 720 * 3 / 2;
			pixfmt->height * pixfmt->width +
			pixfmt->height * (pixfmt->width / 2);
		pixfmt->bytesperline = 720;
		pixfmt->bytesperline = 720;
	} else {
	} else {
		pixfmt->pixelformat = V4L2_PIX_FMT_MPEG;
		pixfmt->pixelformat = V4L2_PIX_FMT_MPEG;
@@ -228,11 +226,18 @@ static int cx18_try_fmt_vid_cap(struct file *file, void *fh,
	struct cx18 *cx = id->cx;
	struct cx18 *cx = id->cx;
	int w = fmt->fmt.pix.width;
	int w = fmt->fmt.pix.width;
	int h = fmt->fmt.pix.height;
	int h = fmt->fmt.pix.height;
	int min_h = 2;


	w = min(w, 720);
	w = min(w, 720);
	w = max(w, 1);
	w = max(w, 2);
	if (id->type == CX18_ENC_STREAM_TYPE_YUV) {
		/* YUV height must be a multiple of 32 */
		h &= ~0x1f;
		min_h = 32;
	}
	h = min(h, cx->is_50hz ? 576 : 480);
	h = min(h, cx->is_50hz ? 576 : 480);
	h = max(h, 2);
	h = max(h, min_h);

	cx18_g_fmt_vid_cap(file, fh, fmt);
	cx18_g_fmt_vid_cap(file, fh, fmt);
	fmt->fmt.pix.width = w;
	fmt->fmt.pix.width = w;
	fmt->fmt.pix.height = h;
	fmt->fmt.pix.height = h;
+9 −5
Original line number Original line Diff line number Diff line
@@ -345,10 +345,8 @@ static int ivtv_g_fmt_vid_cap(struct file *file, void *fh, struct v4l2_format *f
	pixfmt->priv = 0;
	pixfmt->priv = 0;
	if (id->type == IVTV_ENC_STREAM_TYPE_YUV) {
	if (id->type == IVTV_ENC_STREAM_TYPE_YUV) {
		pixfmt->pixelformat = V4L2_PIX_FMT_HM12;
		pixfmt->pixelformat = V4L2_PIX_FMT_HM12;
		/* YUV size is (Y=(h*w) + UV=(h*(w/2))) */
		/* YUV size is (Y=(h*720) + UV=(h*(720/2))) */
		pixfmt->sizeimage =
		pixfmt->sizeimage = pixfmt->height * 720 * 3 / 2;
			pixfmt->height * pixfmt->width +
			pixfmt->height * (pixfmt->width / 2);
		pixfmt->bytesperline = 720;
		pixfmt->bytesperline = 720;
	} else {
	} else {
		pixfmt->pixelformat = V4L2_PIX_FMT_MPEG;
		pixfmt->pixelformat = V4L2_PIX_FMT_MPEG;
@@ -469,11 +467,17 @@ static int ivtv_try_fmt_vid_cap(struct file *file, void *fh, struct v4l2_format
	struct ivtv *itv = id->itv;
	struct ivtv *itv = id->itv;
	int w = fmt->fmt.pix.width;
	int w = fmt->fmt.pix.width;
	int h = fmt->fmt.pix.height;
	int h = fmt->fmt.pix.height;
	int min_h = 2;


	w = min(w, 720);
	w = min(w, 720);
	w = max(w, 2);
	w = max(w, 2);
	if (id->type == IVTV_ENC_STREAM_TYPE_YUV) {
		/* YUV height must be a multiple of 32 */
		h &= ~0x1f;
		min_h = 32;
	}
	h = min(h, itv->is_50hz ? 576 : 480);
	h = min(h, itv->is_50hz ? 576 : 480);
	h = max(h, 2);
	h = max(h, min_h);
	ivtv_g_fmt_vid_cap(file, fh, fmt);
	ivtv_g_fmt_vid_cap(file, fh, fmt);
	fmt->fmt.pix.width = w;
	fmt->fmt.pix.width = w;
	fmt->fmt.pix.height = h;
	fmt->fmt.pix.height = h;