diff --git a/drivers/staging/media/hantro/hantro_v4l2.c b/drivers/staging/media/hantro/hantro_v4l2.c index 586d243cc3ccf29270e7a4ab1a635ee6ed743881..05c3edce27a98ef7e4e9e3f2c35a519d76c16575 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