Re: [PATCH 06/11] media: cedrus: set codec ops immediately

Paul Kocialkowski
2022-10-25T15:00:10Z

[-- Attachment #1: Type: text/plain, Size: 6686 bytes --]

Hi Jernej,

On Mon 24 Oct 22, 22:15, Jernej Skrabec wrote:
> We'll need codec ops soon after output format is set in following
> commits. Let's move current codec setup to set output format callback.
> While at it, let's remove one level of indirection by changing
> current_codec to point to codec ops structure directly.

This looks much better, thanks!

Acked-by: Paul Kocialkowski <paul.kocialkowski@bootlin.com>

Cheers,

Paul

> Signed-off-by: Jernej Skrabec <jernej.skrabec@gmail.com>
> ---
> drivers/staging/media/sunxi/cedrus/cedrus.c | 5 ---
> drivers/staging/media/sunxi/cedrus/cedrus.h | 3 +-
> .../staging/media/sunxi/cedrus/cedrus_dec.c | 4 +-
> .../staging/media/sunxi/cedrus/cedrus_hw.c | 6 +--
> .../staging/media/sunxi/cedrus/cedrus_video.c | 44 ++++++++-----------
> 5 files changed, 25 insertions(+), 37 deletions(-)
>
> diff --git a/drivers/staging/media/sunxi/cedrus/cedrus.c b/drivers/staging/media/sunxi/cedrus/cedrus.c
> index 023566b02dc5..8cfe47574c39 100644
> --- a/drivers/staging/media/sunxi/cedrus/cedrus.c
> +++ b/drivers/staging/media/sunxi/cedrus/cedrus.c
> @@ -455,11 +455,6 @@ static int cedrus_probe(struct platform_device *pdev)
> return ret;
> }
>
> - dev->dec_ops[CEDRUS_CODEC_MPEG2] = &cedrus_dec_ops_mpeg2;
> - dev->dec_ops[CEDRUS_CODEC_H264] = &cedrus_dec_ops_h264;
> - dev->dec_ops[CEDRUS_CODEC_H265] = &cedrus_dec_ops_h265;
> - dev->dec_ops[CEDRUS_CODEC_VP8] = &cedrus_dec_ops_vp8;
> -
> mutex_init(&dev->dev_mutex);
>
> INIT_DELAYED_WORK(&dev->watchdog_work, cedrus_watchdog);
> diff --git a/drivers/staging/media/sunxi/cedrus/cedrus.h b/drivers/staging/media/sunxi/cedrus/cedrus.h
> index 7a1619967513..0b082b1fae22 100644
> --- a/drivers/staging/media/sunxi/cedrus/cedrus.h
> +++ b/drivers/staging/media/sunxi/cedrus/cedrus.h
> @@ -126,7 +126,7 @@ struct cedrus_ctx {
>
> struct v4l2_pix_format src_fmt;
> struct v4l2_pix_format dst_fmt;
> - enum cedrus_codec current_codec;
> + struct cedrus_dec_ops *current_codec;
>
> struct v4l2_ctrl_handler hdl;
> struct v4l2_ctrl **ctrls;
> @@ -185,7 +185,6 @@ struct cedrus_dev {
> struct platform_device *pdev;
> struct device *dev;
> struct v4l2_m2m_dev *m2m_dev;
> - struct cedrus_dec_ops *dec_ops[CEDRUS_CODEC_LAST];
>
> /* Device file mutex */
> struct mutex dev_mutex;
> diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_dec.c b/drivers/staging/media/sunxi/cedrus/cedrus_dec.c
> index e7f7602a5ab4..fbbf9e6f0f50 100644
> --- a/drivers/staging/media/sunxi/cedrus/cedrus_dec.c
> +++ b/drivers/staging/media/sunxi/cedrus/cedrus_dec.c
> @@ -94,7 +94,7 @@ void cedrus_device_run(void *priv)
>
> cedrus_dst_format_set(dev, &ctx->dst_fmt);
>
> - error = dev->dec_ops[ctx->current_codec]->setup(ctx, &run);
> + error = ctx->current_codec->setup(ctx, &run);
> if (error)
> v4l2_err(&ctx->dev->v4l2_dev,
> "Failed to setup decoding job: %d\n", error);
> @@ -110,7 +110,7 @@ void cedrus_device_run(void *priv)
> schedule_delayed_work(&dev->watchdog_work,
> msecs_to_jiffies(2000));
>
> - dev->dec_ops[ctx->current_codec]->trigger(ctx);
> + ctx->current_codec->trigger(ctx);
> } else {
> v4l2_m2m_buf_done_and_job_finish(ctx->dev->m2m_dev,
> ctx->fh.m2m_ctx,
> diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_hw.c b/drivers/staging/media/sunxi/cedrus/cedrus_hw.c
> index a6470a89851e..c3387cd1e80f 100644
> --- a/drivers/staging/media/sunxi/cedrus/cedrus_hw.c
> +++ b/drivers/staging/media/sunxi/cedrus/cedrus_hw.c
> @@ -132,12 +132,12 @@ static irqreturn_t cedrus_irq(int irq, void *data)
> return IRQ_NONE;
> }
>
> - status = dev->dec_ops[ctx->current_codec]->irq_status(ctx);
> + status = ctx->current_codec->irq_status(ctx);
> if (status == CEDRUS_IRQ_NONE)
> return IRQ_NONE;
>
> - dev->dec_ops[ctx->current_codec]->irq_disable(ctx);
> - dev->dec_ops[ctx->current_codec]->irq_clear(ctx);
> + ctx->current_codec->irq_disable(ctx);
> + ctx->current_codec->irq_clear(ctx);
>
> if (status == CEDRUS_IRQ_ERROR)
> state = VB2_BUF_STATE_ERROR;
> diff --git a/drivers/staging/media/sunxi/cedrus/cedrus_video.c b/drivers/staging/media/sunxi/cedrus/cedrus_video.c
> index 04b7b87ef0b7..3591bf9d7d9c 100644
> --- a/drivers/staging/media/sunxi/cedrus/cedrus_video.c
> +++ b/drivers/staging/media/sunxi/cedrus/cedrus_video.c
> @@ -335,6 +335,21 @@ static int cedrus_s_fmt_vid_out_p(struct cedrus_ctx *ctx,
> break;
> }
>
> + switch (ctx->src_fmt.pixelformat) {
> + case V4L2_PIX_FMT_MPEG2_SLICE:
> + ctx->current_codec = &cedrus_dec_ops_mpeg2;
> + break;
> + case V4L2_PIX_FMT_H264_SLICE:
> + ctx->current_codec = &cedrus_dec_ops_h264;
> + break;
> + case V4L2_PIX_FMT_HEVC_SLICE:
> + ctx->current_codec = &cedrus_dec_ops_h265;
> + break;
> + case V4L2_PIX_FMT_VP8_FRAME:
> + ctx->current_codec = &cedrus_dec_ops_vp8;
> + break;
> + }
> +
> /* Propagate format information to capture. */
> ctx->dst_fmt.colorspace = pix_fmt->colorspace;
> ctx->dst_fmt.xfer_func = pix_fmt->xfer_func;
> @@ -493,34 +508,13 @@ static int cedrus_start_streaming(struct vb2_queue *vq, unsigned int count)
> struct cedrus_dev *dev = ctx->dev;
> int ret = 0;
>
> - switch (ctx->src_fmt.pixelformat) {
> - case V4L2_PIX_FMT_MPEG2_SLICE:
> - ctx->current_codec = CEDRUS_CODEC_MPEG2;
> - break;
> -
> - case V4L2_PIX_FMT_H264_SLICE:
> - ctx->current_codec = CEDRUS_CODEC_H264;
> - break;
> -
> - case V4L2_PIX_FMT_HEVC_SLICE:
> - ctx->current_codec = CEDRUS_CODEC_H265;
> - break;
> -
> - case V4L2_PIX_FMT_VP8_FRAME:
> - ctx->current_codec = CEDRUS_CODEC_VP8;
> - break;
> -
> - default:
> - return -EINVAL;
> - }
> -
> if (V4L2_TYPE_IS_OUTPUT(vq->type)) {
> ret = pm_runtime_resume_and_get(dev->dev);
> if (ret < 0)
> goto err_cleanup;
>
> - if (dev->dec_ops[ctx->current_codec]->start) {
> - ret = dev->dec_ops[ctx->current_codec]->start(ctx);
> + if (ctx->current_codec->start) {
> + ret = ctx->current_codec->start(ctx);
> if (ret)
> goto err_pm;
> }
> @@ -542,8 +536,8 @@ static void cedrus_stop_streaming(struct vb2_queue *vq)
> struct cedrus_dev *dev = ctx->dev;
>
> if (V4L2_TYPE_IS_OUTPUT(vq->type)) {
> - if (dev->dec_ops[ctx->current_codec]->stop)
> - dev->dec_ops[ctx->current_codec]->stop(ctx);
> + if (ctx->current_codec->stop)
> + ctx->current_codec->stop(ctx);
>
> pm_runtime_put(dev->dev);
> }
> --
> 2.38.1
>

--
Paul Kocialkowski, Bootlin
Embedded Linux and kernel engineering
https://bootlin.com

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]