media: hantro: Fix s_fmt for dynamic resolution changes
Commit953aaa1492
("media: rockchip/vpu: Prepare things to support decoders") changed the conditions under S_FMT was allowed for OUTPUT CAPTURE buffers. However, and according to the mem-to-mem stateless decoder specification, in order to support dynamic resolution changes, S_FMT should be allowed even if OUTPUT buffers have been allocated. Relax decoder S_FMT restrictions on OUTPUT buffers, allowing a resolution modification, provided the pixel format stays the same. Tested on RK3288 platforms using ChromiumOS Video Decode/Encode Accelerator Unittests. [hverkuil: fix typo: In other -> In order] Fixes:953aaa1492
("media: rockchip/vpu: Prepare things to support decoders") Signed-off-by: Ezequiel Garcia <ezequiel@collabora.com> Reviewed-by: Boris Brezillon <boris.brezillon@collabora.com> Cc: <stable@vger.kernel.org> # for v5.4 and up Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl> Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
This commit is contained in:

committed by
Mauro Carvalho Chehab

parent
59d8bf5ddf
commit
ae02d49493
@@ -367,19 +367,26 @@ vidioc_s_fmt_out_mplane(struct file *file, void *priv, struct v4l2_format *f)
|
|||||||
{
|
{
|
||||||
struct v4l2_pix_format_mplane *pix_mp = &f->fmt.pix_mp;
|
struct v4l2_pix_format_mplane *pix_mp = &f->fmt.pix_mp;
|
||||||
struct hantro_ctx *ctx = fh_to_ctx(priv);
|
struct hantro_ctx *ctx = fh_to_ctx(priv);
|
||||||
|
struct vb2_queue *vq = v4l2_m2m_get_vq(ctx->fh.m2m_ctx, f->type);
|
||||||
const struct hantro_fmt *formats;
|
const struct hantro_fmt *formats;
|
||||||
unsigned int num_fmts;
|
unsigned int num_fmts;
|
||||||
struct vb2_queue *vq;
|
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
/* Change not allowed if queue is busy. */
|
ret = vidioc_try_fmt_out_mplane(file, priv, f);
|
||||||
vq = v4l2_m2m_get_vq(ctx->fh.m2m_ctx, f->type);
|
if (ret)
|
||||||
if (vb2_is_busy(vq))
|
return ret;
|
||||||
return -EBUSY;
|
|
||||||
|
|
||||||
if (!hantro_is_encoder_ctx(ctx)) {
|
if (!hantro_is_encoder_ctx(ctx)) {
|
||||||
struct vb2_queue *peer_vq;
|
struct vb2_queue *peer_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) &&
|
||||||
|
pix_mp->pixelformat != ctx->src_fmt.pixelformat))
|
||||||
|
return -EBUSY;
|
||||||
/*
|
/*
|
||||||
* Since format change on the OUTPUT queue will reset
|
* Since format change on the OUTPUT queue will reset
|
||||||
* the CAPTURE queue, we can't allow doing so
|
* the CAPTURE queue, we can't allow doing so
|
||||||
@@ -389,12 +396,15 @@ vidioc_s_fmt_out_mplane(struct file *file, void *priv, struct v4l2_format *f)
|
|||||||
V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE);
|
V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE);
|
||||||
if (vb2_is_busy(peer_vq))
|
if (vb2_is_busy(peer_vq))
|
||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
|
} else {
|
||||||
|
/*
|
||||||
|
* The encoder doesn't admit a format change if
|
||||||
|
* there are OUTPUT buffers allocated.
|
||||||
|
*/
|
||||||
|
if (vb2_is_busy(vq))
|
||||||
|
return -EBUSY;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = vidioc_try_fmt_out_mplane(file, priv, f);
|
|
||||||
if (ret)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
formats = hantro_get_formats(ctx, &num_fmts);
|
formats = hantro_get_formats(ctx, &num_fmts);
|
||||||
ctx->vpu_src_fmt = hantro_find_format(formats, num_fmts,
|
ctx->vpu_src_fmt = hantro_find_format(formats, num_fmts,
|
||||||
pix_mp->pixelformat);
|
pix_mp->pixelformat);
|
||||||
|
Reference in New Issue
Block a user