media: vicodec: add V4L2_CID_MIN_BUFFERS_FOR_* controls
authorHans Verkuil <hverkuil@xs4all.nl>
Fri, 8 Nov 2024 08:44:46 +0000 (09:44 +0100)
committerHans Verkuil <hverkuil@xs4all.nl>
Fri, 8 Nov 2024 12:38:06 +0000 (13:38 +0100)
Stateful codecs must support the V4L2_CID_MIN_BUFFERS_FOR_OUTPUT
and V4L2_CID_MIN_BUFFERS_FOR_CAPTURE controls. The vicodec driver
was missing support for these controls. Add them.

Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl>
Reviewed-by: Sakari Ailus <sakari.ailus@linux.intel.com>
drivers/media/test-drivers/vicodec/vicodec-core.c

index 00c84a0..8880096 100644 (file)
@@ -43,6 +43,8 @@ MODULE_PARM_DESC(debug, " activates debug info");
 #define MIN_WIDTH              640U
 #define MAX_HEIGHT             2160U
 #define MIN_HEIGHT             360U
+/* Recommended number of buffers for the stateful codecs */
+#define VICODEC_REC_BUFS       2
 
 #define dprintk(dev, fmt, arg...) \
        v4l2_dbg(1, debug, &dev->v4l2_dev, "%s: " fmt, __func__, ## arg)
@@ -1705,12 +1707,14 @@ static int queue_init(void *priv, struct vb2_queue *src_vq,
        src_vq->ops = &vicodec_qops;
        src_vq->mem_ops = &vb2_vmalloc_memops;
        src_vq->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_COPY;
-       if (ctx->is_enc)
+       if (ctx->is_enc) {
                src_vq->lock = &ctx->dev->stateful_enc.mutex;
-       else if (ctx->is_stateless)
+               src_vq->min_reqbufs_allocation = VICODEC_REC_BUFS;
+       } else if (ctx->is_stateless) {
                src_vq->lock = &ctx->dev->stateless_dec.mutex;
-       else
+       } else {
                src_vq->lock = &ctx->dev->stateful_dec.mutex;
+       }
        src_vq->supports_requests = ctx->is_stateless;
        src_vq->requires_requests = ctx->is_stateless;
        ret = vb2_queue_init(src_vq);
@@ -1728,6 +1732,8 @@ static int queue_init(void *priv, struct vb2_queue *src_vq,
        dst_vq->mem_ops = &vb2_vmalloc_memops;
        dst_vq->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_COPY;
        dst_vq->lock = src_vq->lock;
+       if (!ctx->is_stateless && !ctx->is_enc)
+               dst_vq->min_reqbufs_allocation = VICODEC_REC_BUFS;
 
        return vb2_queue_init(dst_vq);
 }
@@ -1852,11 +1858,16 @@ static int vicodec_open(struct file *file)
                          1, 31, 1, 20);
        v4l2_ctrl_new_std(hdl, &vicodec_ctrl_ops, V4L2_CID_FWHT_P_FRAME_QP,
                          1, 31, 1, 20);
-       if (ctx->is_enc)
-               v4l2_ctrl_new_std(hdl, &vicodec_ctrl_ops,
-                                 V4L2_CID_MIN_BUFFERS_FOR_OUTPUT, 1, 1, 1, 1);
+
        if (ctx->is_stateless)
                v4l2_ctrl_new_custom(hdl, &vicodec_ctrl_stateless_state, NULL);
+       else
+               v4l2_ctrl_new_std(hdl, &vicodec_ctrl_ops, ctx->is_enc ?
+                                 V4L2_CID_MIN_BUFFERS_FOR_OUTPUT :
+                                 V4L2_CID_MIN_BUFFERS_FOR_CAPTURE,
+                                 VICODEC_REC_BUFS, VICODEC_REC_BUFS, 1,
+                                 VICODEC_REC_BUFS);
+
        if (hdl->error) {
                rc = hdl->error;
                v4l2_ctrl_handler_free(hdl);