mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-11-29 23:26:44 +07:00
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: Hans Verkuil <hverkuil@xs4all.nl> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
This commit is contained in:
parent
fdf9c9979a
commit
a4a787187b
@ -160,10 +160,8 @@ static int cx18_g_fmt_vid_cap(struct file *file, void *fh,
|
||||
pixfmt->priv = 0;
|
||||
if (id->type == CX18_ENC_STREAM_TYPE_YUV) {
|
||||
pixfmt->pixelformat = V4L2_PIX_FMT_HM12;
|
||||
/* YUV size is (Y=(h*w) + UV=(h*(w/2))) */
|
||||
pixfmt->sizeimage =
|
||||
pixfmt->height * pixfmt->width +
|
||||
pixfmt->height * (pixfmt->width / 2);
|
||||
/* YUV size is (Y=(h*720) + UV=(h*(720/2))) */
|
||||
pixfmt->sizeimage = pixfmt->height * 720 * 3 / 2;
|
||||
pixfmt->bytesperline = 720;
|
||||
} else {
|
||||
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;
|
||||
int w = fmt->fmt.pix.width;
|
||||
int h = fmt->fmt.pix.height;
|
||||
int min_h = 2;
|
||||
|
||||
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 = max(h, 2);
|
||||
h = max(h, min_h);
|
||||
|
||||
cx18_g_fmt_vid_cap(file, fh, fmt);
|
||||
fmt->fmt.pix.width = w;
|
||||
fmt->fmt.pix.height = h;
|
||||
|
@ -345,10 +345,8 @@ static int ivtv_g_fmt_vid_cap(struct file *file, void *fh, struct v4l2_format *f
|
||||
pixfmt->priv = 0;
|
||||
if (id->type == IVTV_ENC_STREAM_TYPE_YUV) {
|
||||
pixfmt->pixelformat = V4L2_PIX_FMT_HM12;
|
||||
/* YUV size is (Y=(h*w) + UV=(h*(w/2))) */
|
||||
pixfmt->sizeimage =
|
||||
pixfmt->height * pixfmt->width +
|
||||
pixfmt->height * (pixfmt->width / 2);
|
||||
/* YUV size is (Y=(h*720) + UV=(h*(720/2))) */
|
||||
pixfmt->sizeimage = pixfmt->height * 720 * 3 / 2;
|
||||
pixfmt->bytesperline = 720;
|
||||
} else {
|
||||
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;
|
||||
int w = fmt->fmt.pix.width;
|
||||
int h = fmt->fmt.pix.height;
|
||||
int min_h = 2;
|
||||
|
||||
w = min(w, 720);
|
||||
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 = max(h, 2);
|
||||
h = max(h, min_h);
|
||||
ivtv_g_fmt_vid_cap(file, fh, fmt);
|
||||
fmt->fmt.pix.width = w;
|
||||
fmt->fmt.pix.height = h;
|
||||
|
Loading…
Reference in New Issue
Block a user