lkml.org 
[lkml]   [2022]   [Oct]   [25]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH 06/11] media: cedrus: set codec ops immediately
    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
    [unhandled content-type:application/pgp-signature]
    \
     
     \ /
      Last update: 2022-10-25 17:00    [W:4.247 / U:0.224 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site