mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2025-01-18 20:16:16 +07:00
media: cedrus: Propagate OUTPUT resolution to CAPTURE
As per spec, the CAPTURE resolution should be automatically set based on the OUTPUT resolution. This patch properly propagate width/height to the capture when the OUTPUT format is set and override the user provided width/height with configured OUTPUT resolution when the CAPTURE fmt is updated. This also prevents userspace from selecting a CAPTURE resolution that is too small, avoiding kernel oops. Signed-off-by: Nicolas Dufresne <nicolas.dufresne@collabora.com> Reviewed-by: Ezequiel Garcia <ezequiel@collabora.com> Acked-by: Paul Kocialkowski <paul.kocialkowski@bootlin.com> Tested-by: Ondrej Jirman <megous@megous.com> Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl> Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
This commit is contained in:
parent
2f8c737ed2
commit
8c608272ec
@ -247,6 +247,8 @@ static int cedrus_try_fmt_vid_cap(struct file *file, void *priv,
|
||||
return -EINVAL;
|
||||
|
||||
pix_fmt->pixelformat = fmt->pixelformat;
|
||||
pix_fmt->width = ctx->src_fmt.width;
|
||||
pix_fmt->height = ctx->src_fmt.height;
|
||||
cedrus_prepare_format(pix_fmt);
|
||||
|
||||
return 0;
|
||||
@ -296,10 +298,30 @@ static int cedrus_s_fmt_vid_out(struct file *file, void *priv,
|
||||
{
|
||||
struct cedrus_ctx *ctx = cedrus_file2ctx(file);
|
||||
struct vb2_queue *vq;
|
||||
struct vb2_queue *peer_vq;
|
||||
int ret;
|
||||
|
||||
ret = cedrus_try_fmt_vid_out(file, priv, f);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
vq = v4l2_m2m_get_vq(ctx->fh.m2m_ctx, f->type);
|
||||
if (vb2_is_busy(vq))
|
||||
/*
|
||||
* In order to support dynamic resolution change,
|
||||
* the decoder admits a resolution change, as long
|
||||
* as the pixelformat remains. Can't be done if streaming.
|
||||
*/
|
||||
if (vb2_is_streaming(vq) || (vb2_is_busy(vq) &&
|
||||
f->fmt.pix.pixelformat != ctx->src_fmt.pixelformat))
|
||||
return -EBUSY;
|
||||
/*
|
||||
* Since format change on the OUTPUT queue will reset
|
||||
* the CAPTURE queue, we can't allow doing so
|
||||
* when the CAPTURE queue has buffers allocated.
|
||||
*/
|
||||
peer_vq = v4l2_m2m_get_vq(ctx->fh.m2m_ctx,
|
||||
V4L2_BUF_TYPE_VIDEO_CAPTURE);
|
||||
if (vb2_is_busy(peer_vq))
|
||||
return -EBUSY;
|
||||
|
||||
ret = cedrus_try_fmt_vid_out(file, priv, f);
|
||||
@ -319,11 +341,14 @@ static int cedrus_s_fmt_vid_out(struct file *file, void *priv,
|
||||
break;
|
||||
}
|
||||
|
||||
/* Propagate colorspace information to capture. */
|
||||
/* Propagate format information to capture. */
|
||||
ctx->dst_fmt.colorspace = f->fmt.pix.colorspace;
|
||||
ctx->dst_fmt.xfer_func = f->fmt.pix.xfer_func;
|
||||
ctx->dst_fmt.ycbcr_enc = f->fmt.pix.ycbcr_enc;
|
||||
ctx->dst_fmt.quantization = f->fmt.pix.quantization;
|
||||
ctx->dst_fmt.width = ctx->src_fmt.width;
|
||||
ctx->dst_fmt.height = ctx->src_fmt.height;
|
||||
cedrus_prepare_format(&ctx->dst_fmt);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user