]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
media: imx-jpeg: notify source chagne event when the first picture parsed
authorMing Qian <ming.qian@nxp.com>
Mon, 9 Oct 2023 06:16:57 +0000 (14:16 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 20 Nov 2023 10:57:21 +0000 (11:57 +0100)
[ Upstream commit b833b178498dafa2156cfb6f4d3ce4581c21f1e5 ]

After gstreamer rework the dynamic resolution change handling, gstreamer
stop doing capture buffer allocation based on guesses and wait for the
source change event when available. It requires driver always notify
source change event in the initialization, even if the size parsed is
equal to the size set on capture queue. otherwise, the pipeline will be
stalled.

Currently driver may not notify source change event if the parsed format
and size are equal to those previously established, but it may stall the
gstreamer pipeline.

The link of gstreamer patch is
https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/4437

Fixes: b4e1fb8643da ("media: imx-jpeg: Support dynamic resolution change")
Signed-off-by: Ming Qian <ming.qian@nxp.com>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/media/platform/nxp/imx-jpeg/mxc-jpeg.c
drivers/media/platform/nxp/imx-jpeg/mxc-jpeg.h

index 9ef0cb20f63be761d611fdc06318d0e74f1a40b2..c376ce1cabac4ff7915ce6b7d011a72d14f3d9a8 100644 (file)
@@ -1348,7 +1348,8 @@ static bool mxc_jpeg_source_change(struct mxc_jpeg_ctx *ctx,
        q_data_cap = mxc_jpeg_get_q_data(ctx, V4L2_BUF_TYPE_VIDEO_CAPTURE);
        if (mxc_jpeg_compare_format(q_data_cap->fmt, jpeg_src_buf->fmt))
                jpeg_src_buf->fmt = q_data_cap->fmt;
-       if (q_data_cap->fmt != jpeg_src_buf->fmt ||
+       if (ctx->need_initial_source_change_evt ||
+           q_data_cap->fmt != jpeg_src_buf->fmt ||
            q_data_cap->w != jpeg_src_buf->w ||
            q_data_cap->h != jpeg_src_buf->h) {
                dev_dbg(dev, "Detected jpeg res=(%dx%d)->(%dx%d), pixfmt=%c%c%c%c\n",
@@ -1392,6 +1393,7 @@ static bool mxc_jpeg_source_change(struct mxc_jpeg_ctx *ctx,
                mxc_jpeg_sizeimage(q_data_cap);
                notify_src_chg(ctx);
                ctx->source_change = 1;
+               ctx->need_initial_source_change_evt = false;
                if (vb2_is_streaming(v4l2_m2m_get_dst_vq(ctx->fh.m2m_ctx)))
                        mxc_jpeg_set_last_buffer(ctx);
        }
@@ -1611,6 +1613,9 @@ static int mxc_jpeg_queue_setup(struct vb2_queue *q,
        for (i = 0; i < *nplanes; i++)
                sizes[i] = mxc_jpeg_get_plane_size(q_data, i);
 
+       if (V4L2_TYPE_IS_OUTPUT(q->type))
+               ctx->need_initial_source_change_evt = true;
+
        return 0;
 }
 
index d80e94cc9d992451cc7cf6d0f5e62c98f45aaa8e..dc4afeeff5b65bb77c1674f9cc19ad3a32100378 100644 (file)
@@ -99,6 +99,7 @@ struct mxc_jpeg_ctx {
        enum mxc_jpeg_enc_state         enc_state;
        int                             slot;
        unsigned int                    source_change;
+       bool                            need_initial_source_change_evt;
        bool                            header_parsed;
        struct v4l2_ctrl_handler        ctrl_handler;
        u8                              jpeg_quality;