diff mbox series

[1/4] media: vicodec: Disable (TRY_)DECODER_CMD for the stateless case

Message ID 20231109201640.340556-1-paul.kocialkowski@bootlin.com (mailing list archive)
State New
Headers show
Series [1/4] media: vicodec: Disable (TRY_)DECODER_CMD for the stateless case | expand

Commit Message

Paul Kocialkowski Nov. 9, 2023, 8:16 p.m. UTC
The (TRY_)DECODER_CMD ioctls are only useful for stateful decoders and for
stateless decoders that support holding capture buffers (which is not the case
for this driver).

Disable them when registering the stateless decoder.

Signed-off-by: Paul Kocialkowski <paul.kocialkowski@bootlin.com>
---
 .../media/test-drivers/vicodec/vicodec-core.c | 19 +++++++++++++------
 1 file changed, 13 insertions(+), 6 deletions(-)

Comments

Daniel Almeida Nov. 10, 2023, 9:06 p.m. UTC | #1
Hi Paul,

On Thursday, November 09, 2023 17:16 -03, Paul Kocialkowski <paul.kocialkowski@bootlin.com> wrote:

> The (TRY_)DECODER_CMD ioctls are only useful for stateful decoders and for
> stateless decoders that support holding capture buffers (which is not the case
> for this driver).
> 
> Disable them when registering the stateless decoder.
> 
> Signed-off-by: Paul Kocialkowski <paul.kocialkowski@bootlin.com>
> ---
>  .../media/test-drivers/vicodec/vicodec-core.c | 19 +++++++++++++------
>  1 file changed, 13 insertions(+), 6 deletions(-)
> 
> diff --git a/drivers/media/test-drivers/vicodec/vicodec-core.c b/drivers/media/test-drivers/vicodec/vicodec-core.c
> index 6f0e20df74e9..8f7a2b153ee9 100644
> --- a/drivers/media/test-drivers/vicodec/vicodec-core.c
> +++ b/drivers/media/test-drivers/vicodec/vicodec-core.c
> @@ -1240,6 +1240,12 @@ static int vicodec_decoder_cmd(struct file *file, void *fh,
>  	struct vicodec_ctx *ctx = file2ctx(file);
>  	int ret;
>  
> +	/*
> +	 * This ioctl should not be used with a stateless codec that doesn't
> +	 * support holding buffers and the associated flush command.
> +	 */
> +	WARN_ON(ctx->is_stateless);
> +
>  	ret = v4l2_m2m_ioctl_try_decoder_cmd(file, fh, dc);
>  	if (ret < 0)
>  		return ret;
> @@ -2025,7 +2031,7 @@ static const struct v4l2_m2m_ops m2m_ops = {
>  
>  static int register_instance(struct vicodec_dev *dev,
>  			     struct vicodec_dev_instance *dev_instance,
> -			     const char *name, bool is_enc)
> +			     const char *name, bool is_enc, bool is_stateless)
>  {
>  	struct video_device *vfd;
>  	int ret;
> @@ -2045,10 +2051,11 @@ static int register_instance(struct vicodec_dev *dev,
>  	strscpy(vfd->name, name, sizeof(vfd->name));
>  	vfd->device_caps = V4L2_CAP_STREAMING |
>  		(multiplanar ? V4L2_CAP_VIDEO_M2M_MPLANE : V4L2_CAP_VIDEO_M2M);
> -	if (is_enc) {
> +	if (is_enc || is_stateless) {
>  		v4l2_disable_ioctl(vfd, VIDIOC_DECODER_CMD);
>  		v4l2_disable_ioctl(vfd, VIDIOC_TRY_DECODER_CMD);
> -	} else {
> +	}
> +	if (!is_enc) {
>  		v4l2_disable_ioctl(vfd, VIDIOC_ENCODER_CMD);
>  		v4l2_disable_ioctl(vfd, VIDIOC_TRY_ENCODER_CMD);
>  	}
> @@ -2107,17 +2114,17 @@ static int vicodec_probe(struct platform_device *pdev)
>  	platform_set_drvdata(pdev, dev);
>  
>  	ret = register_instance(dev, &dev->stateful_enc, "stateful-encoder",
> -				true);
> +				true, false);
>  	if (ret)
>  		goto unreg_dev;
>  
>  	ret = register_instance(dev, &dev->stateful_dec, "stateful-decoder",
> -				false);
> +				false, false);
>  	if (ret)
>  		goto unreg_sf_enc;
>  
>  	ret = register_instance(dev, &dev->stateless_dec, "stateless-decoder",
> -				false);
> +				false, true);
>  	if (ret)
>  		goto unreg_sf_dec;
>  
> -- 
> 2.42.1
> 
> 
> _______________________________________________
> Linux-rockchip mailing list
> Linux-rockchip@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-rockchip

Reviewed-by: Daniel Almeida <daniel.almeida@collabora.com>
diff mbox series

Patch

diff --git a/drivers/media/test-drivers/vicodec/vicodec-core.c b/drivers/media/test-drivers/vicodec/vicodec-core.c
index 6f0e20df74e9..8f7a2b153ee9 100644
--- a/drivers/media/test-drivers/vicodec/vicodec-core.c
+++ b/drivers/media/test-drivers/vicodec/vicodec-core.c
@@ -1240,6 +1240,12 @@  static int vicodec_decoder_cmd(struct file *file, void *fh,
 	struct vicodec_ctx *ctx = file2ctx(file);
 	int ret;
 
+	/*
+	 * This ioctl should not be used with a stateless codec that doesn't
+	 * support holding buffers and the associated flush command.
+	 */
+	WARN_ON(ctx->is_stateless);
+
 	ret = v4l2_m2m_ioctl_try_decoder_cmd(file, fh, dc);
 	if (ret < 0)
 		return ret;
@@ -2025,7 +2031,7 @@  static const struct v4l2_m2m_ops m2m_ops = {
 
 static int register_instance(struct vicodec_dev *dev,
 			     struct vicodec_dev_instance *dev_instance,
-			     const char *name, bool is_enc)
+			     const char *name, bool is_enc, bool is_stateless)
 {
 	struct video_device *vfd;
 	int ret;
@@ -2045,10 +2051,11 @@  static int register_instance(struct vicodec_dev *dev,
 	strscpy(vfd->name, name, sizeof(vfd->name));
 	vfd->device_caps = V4L2_CAP_STREAMING |
 		(multiplanar ? V4L2_CAP_VIDEO_M2M_MPLANE : V4L2_CAP_VIDEO_M2M);
-	if (is_enc) {
+	if (is_enc || is_stateless) {
 		v4l2_disable_ioctl(vfd, VIDIOC_DECODER_CMD);
 		v4l2_disable_ioctl(vfd, VIDIOC_TRY_DECODER_CMD);
-	} else {
+	}
+	if (!is_enc) {
 		v4l2_disable_ioctl(vfd, VIDIOC_ENCODER_CMD);
 		v4l2_disable_ioctl(vfd, VIDIOC_TRY_ENCODER_CMD);
 	}
@@ -2107,17 +2114,17 @@  static int vicodec_probe(struct platform_device *pdev)
 	platform_set_drvdata(pdev, dev);
 
 	ret = register_instance(dev, &dev->stateful_enc, "stateful-encoder",
-				true);
+				true, false);
 	if (ret)
 		goto unreg_dev;
 
 	ret = register_instance(dev, &dev->stateful_dec, "stateful-decoder",
-				false);
+				false, false);
 	if (ret)
 		goto unreg_sf_enc;
 
 	ret = register_instance(dev, &dev->stateless_dec, "stateless-decoder",
-				false);
+				false, true);
 	if (ret)
 		goto unreg_sf_dec;