From: Hans Verkuil <hverkuil-cisco@xs4all.nl>
To: linux-media@vger.kernel.org
Cc: Yunfei Dong <yunfei.dong@mediatek.com>,
Dikshita Agarwal <dikshita@codeaurora.org>,
Hans Verkuil <hverkuil-cisco@xs4all.nl>
Subject: [PATCHv2 12/12] vicodec: add support for read-only requests
Date: Tue, 18 Aug 2020 16:37:19 +0200 [thread overview]
Message-ID: <20200818143719.102128-13-hverkuil-cisco@xs4all.nl> (raw)
In-Reply-To: <20200818143719.102128-1-hverkuil-cisco@xs4all.nl>
Add support for read-only requests for the stateless decoder capture
queue in order to test this feature.
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
---
.../media/test-drivers/vicodec/vicodec-core.c | 70 +++++++++----------
1 file changed, 34 insertions(+), 36 deletions(-)
diff --git a/drivers/media/test-drivers/vicodec/vicodec-core.c b/drivers/media/test-drivers/vicodec/vicodec-core.c
index 71928e30dae8..c377d5fdfd07 100644
--- a/drivers/media/test-drivers/vicodec/vicodec-core.c
+++ b/drivers/media/test-drivers/vicodec/vicodec-core.c
@@ -267,6 +267,11 @@ static int device_process(struct vicodec_ctx *ctx,
if (ctx->is_stateless) {
struct media_request *src_req = src_vb->vb2_buf.req_obj.req;
+ /*
+ * Apply request controls if any.
+ * The dst_vb queue has read-only requests, so no need to
+ * setup any controls for that buffer.
+ */
ret = v4l2_ctrl_request_setup(src_req, &ctx->hdl);
if (ret)
return ret;
@@ -408,11 +413,12 @@ static void device_run(void *priv)
struct vb2_v4l2_buffer *src_buf, *dst_buf;
struct vicodec_q_data *q_src, *q_dst;
u32 state;
- struct media_request *src_req;
+ struct media_request *src_req, *dst_req;
src_buf = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx);
dst_buf = v4l2_m2m_dst_buf_remove(ctx->fh.m2m_ctx);
src_req = src_buf->vb2_buf.req_obj.req;
+ dst_req = dst_buf->vb2_buf.req_obj.req;
q_src = get_q_data(ctx, V4L2_BUF_TYPE_VIDEO_OUTPUT);
q_dst = get_q_data(ctx, V4L2_BUF_TYPE_VIDEO_CAPTURE);
@@ -452,6 +458,8 @@ static void device_run(void *priv)
spin_unlock(ctx->lock);
if (ctx->is_stateless && src_req)
v4l2_ctrl_request_complete(src_req, &ctx->hdl);
+ if (ctx->is_stateless && dst_req)
+ v4l2_ctrl_request_complete(dst_req, &ctx->hdl);
if (ctx->is_enc)
v4l2_m2m_job_finish(dev->stateful_enc.m2m_dev, ctx->fh.m2m_ctx);
@@ -1733,6 +1741,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;
+ dst_vq->supports_requests = ctx->is_stateless;
+ dst_vq->supports_ro_requests = ctx->is_stateless;
return vb2_queue_init(dst_vq);
}
@@ -1910,6 +1920,7 @@ static int vicodec_open(struct file *file)
} else if (ctx->is_stateless) {
ctx->fh.m2m_ctx = v4l2_m2m_ctx_init(dev->stateless_dec.m2m_dev,
ctx, &queue_init);
+ ctx->fh.m2m_ctx->req_ctrl_handler = hdl;
ctx->lock = &dev->stateless_dec.lock;
} else {
ctx->fh.m2m_ctx = v4l2_m2m_ctx_init(dev->stateful_dec.m2m_dev,
@@ -1952,34 +1963,19 @@ static int vicodec_release(struct file *file)
static int vicodec_request_validate(struct media_request *req)
{
- struct media_request_object *obj;
+ struct vb2_buffer *vb = vb2_request_buffer_first(req);
struct v4l2_ctrl_handler *parent_hdl, *hdl;
- struct vicodec_ctx *ctx = NULL;
+ struct vicodec_ctx *ctx;
struct v4l2_ctrl *ctrl;
- unsigned int count;
-
- list_for_each_entry(obj, &req->objects, list) {
- struct vb2_buffer *vb;
-
- if (vb2_request_object_is_buffer(obj)) {
- vb = container_of(obj, struct vb2_buffer, req_obj);
- ctx = vb2_get_drv_priv(vb->vb2_queue);
-
- break;
- }
- }
- if (!ctx) {
- pr_err("No buffer was provided with the request\n");
+ if (!vb) {
+ dev_info(req->mdev->dev,
+ "No buffer was provided with the request\n");
return -ENOENT;
}
+ ctx = vb2_get_drv_priv(vb->vb2_queue);
- count = vb2_request_buffer_cnt(req);
- if (!count) {
- v4l2_info(&ctx->dev->v4l2_dev,
- "No buffer was provided with the request\n");
- return -ENOENT;
- } else if (count > 1) {
+ if (vb2_request_buffer_cnt(req) > 1) {
v4l2_info(&ctx->dev->v4l2_dev,
"More than one buffer was provided with the request\n");
return -EINVAL;
@@ -1987,21 +1983,23 @@ static int vicodec_request_validate(struct media_request *req)
parent_hdl = &ctx->hdl;
- hdl = v4l2_ctrl_request_hdl_find(req, parent_hdl);
- if (!hdl) {
- v4l2_info(&ctx->dev->v4l2_dev, "Missing codec control\n");
- return -ENOENT;
- }
- ctrl = v4l2_ctrl_request_hdl_ctrl_find(hdl,
- vicodec_ctrl_stateless_state.id);
- v4l2_ctrl_request_hdl_put(hdl);
- if (!ctrl) {
- v4l2_info(&ctx->dev->v4l2_dev,
- "Missing required codec control\n");
- return -ENOENT;
+ if (vb->vb2_queue->is_output) {
+ hdl = v4l2_ctrl_request_hdl_find(req, parent_hdl);
+ if (!hdl) {
+ v4l2_info(&ctx->dev->v4l2_dev, "Missing codec control\n");
+ return -ENOENT;
+ }
+ ctrl = v4l2_ctrl_request_hdl_ctrl_find(hdl,
+ vicodec_ctrl_stateless_state.id);
+ v4l2_ctrl_request_hdl_put(hdl);
+ if (!ctrl) {
+ v4l2_info(&ctx->dev->v4l2_dev,
+ "Missing required codec control\n");
+ return -ENOENT;
+ }
}
- return vb2_request_validate(req);
+ return v4l2_m2m_request_validate(req);
}
static const struct v4l2_file_operations vicodec_fops = {
--
2.27.0
prev parent reply other threads:[~2020-08-18 14:37 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-08-18 14:37 [PATCHv2 00/12] Add support for read-only requests Hans Verkuil
2020-08-18 14:37 ` [PATCHv2 01/12] media/mc: keep track of outstanding requests Hans Verkuil
2020-08-18 14:37 ` [PATCHv2 02/12] vivid: add read-only int32 control Hans Verkuil
2020-08-18 14:37 ` [PATCHv2 03/12] media: document read-only requests Hans Verkuil
2020-08-18 14:37 ` [PATCHv2 04/12] videodev2.h: add V4L2_BUF_CAP_SUPPORTS_RO_REQUESTS Hans Verkuil
2020-08-18 14:37 ` [PATCHv2 05/12] videobuf2-core: add vb2_request_buffer_first() Hans Verkuil
2020-08-18 14:37 ` [PATCHv2 06/12] v4l2-ctrls.c: add v4l2_ctrl_request_add_handler Hans Verkuil
2020-08-18 14:37 ` [PATCHv2 07/12] vivid: call v4l2_ctrl_request_add_handler() Hans Verkuil
2020-08-18 14:37 ` [PATCHv2 08/12] vivid: add ro_requests module option Hans Verkuil
2020-08-18 14:37 ` [PATCHv2 09/12] v4l2-mem2mem.c: add v4l2_m2m_request_validate() Hans Verkuil
2020-08-18 14:37 ` [PATCHv2 10/12] vim2m: use v4l2_m2m_request_validate() Hans Verkuil
2020-08-18 14:37 ` [PATCHv2 11/12] vim2m: support read-only requests on the capture queue Hans Verkuil
2020-08-18 14:37 ` Hans Verkuil [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20200818143719.102128-13-hverkuil-cisco@xs4all.nl \
--to=hverkuil-cisco@xs4all.nl \
--cc=dikshita@codeaurora.org \
--cc=linux-media@vger.kernel.org \
--cc=yunfei.dong@mediatek.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).