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

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

 



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@xxxxxxxxxxx>

Cheers,

Paul

> Signed-off-by: Jernej Skrabec <jernej.skrabec@xxxxxxxxx>
> ---
>  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: signature.asc
Description: PGP signature


[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