Re: [PATCH] media: hantro: relax s_fmt(out) busy error

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Philipp,

On Tue, Oct 8, 2019 at 9:38 PM Philipp Zabel <p.zabel@xxxxxxxxxxxxxx> wrote:
>
> 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)

First of all, thanks for the patch! I'd like to ask you to clarify a few things:
1) What's the use case for S_FMT(OUTPUT) without changing neither
resolution nor pixelformat?
2) Is it correct to compare dst_fmt with pix_fmt? My understanding is
that width/height of the OUTPUT queue is the coded size of the stream
(a stream parameter), while width/height of the CAPTURE queue is the
frame buffer size, which can be different from the stream coded size.
Perhaps we should compare with ctx->src_fmt instead?

Best regards,
Tomasz



[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux