Setting the output format resets the capture queue, so we return -EBUSY while the capture queue has buffers allocated. If capture dimensions and pixel format don't change though, we can allow setting the output format without reallocating the capture queue. Signed-off-by: Philipp Zabel <p.zabel@xxxxxxxxxxxxxx> --- This applies on top of https://patchwork.linuxtv.org/patch/59337/ ("media: hantro: Fix s_fmt for dynamic resolution changes"). --- drivers/staging/media/hantro/hantro_v4l2.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/drivers/staging/media/hantro/hantro_v4l2.c b/drivers/staging/media/hantro/hantro_v4l2.c index 586d243cc3cc..05c3edce27a9 100644 --- a/drivers/staging/media/hantro/hantro_v4l2.c +++ b/drivers/staging/media/hantro/hantro_v4l2.c @@ -368,7 +368,7 @@ 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 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 *raw_vpu_fmt, *formats; unsigned int num_fmts; int ret; @@ -394,8 +394,16 @@ vidioc_s_fmt_out_mplane(struct file *file, void *priv, struct v4l2_format *f) */ peer_vq = v4l2_m2m_get_vq(ctx->fh.m2m_ctx, V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE); - if (vb2_is_busy(peer_vq)) - return -EBUSY; + if (vb2_is_busy(peer_vq)) { + formats = hantro_get_formats(ctx, &num_fmts); + raw_vpu_fmt = hantro_get_default_fmt(formats, num_fmts, + false); + + if (ctx->dst_fmt.width != pix_mp->width || + ctx->dst_fmt.height != pix_mp->height || + ctx->dst_fmt.pixelformat != raw_vpu_fmt->fourcc) + return -EBUSY; + } } else { /* * The encoder doesn't admit a format change if -- 2.20.1