From e36802c6297adb0c560f3a6c1672546eb380c458 Mon Sep 17 00:00:00 2001 From: Maxime Jourdan Date: Wed, 10 Oct 2018 17:22:27 +0200 Subject: [PATCH] meson: vdec: introduce controls and V4L2_CID_MIN_BUFFERS_FOR_CAPTURE --- drivers/media/platform/meson/vdec/Makefile | 2 +- drivers/media/platform/meson/vdec/vdec.c | 7 ++++ drivers/media/platform/meson/vdec/vdec.h | 2 ++ drivers/media/platform/meson/vdec/vdec_ctrls.c | 45 ++++++++++++++++++++++++++ drivers/media/platform/meson/vdec/vdec_ctrls.h | 8 +++++ 5 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 drivers/media/platform/meson/vdec/vdec_ctrls.c create mode 100644 drivers/media/platform/meson/vdec/vdec_ctrls.h diff --git a/drivers/media/platform/meson/vdec/Makefile b/drivers/media/platform/meson/vdec/Makefile index 6bea129..eba8608 100644 --- a/drivers/media/platform/meson/vdec/Makefile +++ b/drivers/media/platform/meson/vdec/Makefile @@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 # Makefile for Amlogic meson video decoder driver -meson-vdec-objs = esparser.o vdec.o vdec_helpers.o vdec_platform.o +meson-vdec-objs = esparser.o vdec.o vdec_ctrls.o vdec_helpers.o vdec_platform.o meson-vdec-objs += vdec_1.o meson-vdec-objs += codec_mpeg12.o diff --git a/drivers/media/platform/meson/vdec/vdec.c b/drivers/media/platform/meson/vdec/vdec.c index d8db52c..1c5d3e9 100644 --- a/drivers/media/platform/meson/vdec/vdec.c +++ b/drivers/media/platform/meson/vdec/vdec.c @@ -21,6 +21,7 @@ #include "vdec.h" #include "esparser.h" #include "vdec_helpers.h" +#include "vdec_ctrls.h" struct dummy_buf { struct vb2_v4l2_buffer vb; @@ -290,6 +291,7 @@ static int vdec_start_streaming(struct vb2_queue *q, unsigned int count) sess->keyframe_found = 0; sess->last_offset = 0; sess->wrap_count = 0; + sess->dpb_size = 0; sess->pixelaspect.numerator = 1; sess->pixelaspect.denominator = 1; atomic_set(&sess->esparser_queued_bufs, 0); @@ -812,6 +814,10 @@ static int vdec_open(struct file *file) goto err_m2m_release; } + ret = amvdec_init_ctrls(&sess->ctrl_handler); + if (ret) + goto err_m2m_release; + sess->pixfmt_cap = formats[0].pixfmts_cap[0]; sess->fmt_out = &formats[0]; sess->width = 1280; @@ -827,6 +833,7 @@ static int vdec_open(struct file *file) spin_lock_init(&sess->ts_spinlock); v4l2_fh_init(&sess->fh, core->vdev_dec); + sess->fh.ctrl_handler = &sess->ctrl_handler; v4l2_fh_add(&sess->fh); sess->fh.m2m_ctx = sess->m2m_ctx; file->private_data = &sess->fh; diff --git a/drivers/media/platform/meson/vdec/vdec.h b/drivers/media/platform/meson/vdec/vdec.h index 4e8c3f1..6be7de2 100644 --- a/drivers/media/platform/meson/vdec/vdec.h +++ b/drivers/media/platform/meson/vdec/vdec.h @@ -203,6 +203,7 @@ struct amvdec_session { struct v4l2_fh fh; struct v4l2_m2m_dev *m2m_dev; struct v4l2_m2m_ctx *m2m_ctx; + struct v4l2_ctrl_handler ctrl_handler; struct mutex lock; const struct amvdec_format *fmt_out; @@ -242,6 +243,7 @@ struct amvdec_session { u64 last_irq_jiffies; u32 last_offset; u32 wrap_count; + u32 dpb_size; void *priv; }; diff --git a/drivers/media/platform/meson/vdec/vdec_ctrls.c b/drivers/media/platform/meson/vdec/vdec_ctrls.c new file mode 100644 index 0000000..cd6dd6d --- /dev/null +++ b/drivers/media/platform/meson/vdec/vdec_ctrls.c @@ -0,0 +1,45 @@ +#include "vdec_ctrls.h" + +static int vdec_op_g_volatile_ctrl(struct v4l2_ctrl *ctrl) +{ + struct amvdec_session *sess = + container_of(ctrl->handler, struct amvdec_session, ctrl_handler); + + switch (ctrl->id) { + case V4L2_CID_MIN_BUFFERS_FOR_CAPTURE: + ctrl->val = sess->dpb_size; + break; + default: + return -EINVAL; + }; + + return 0; +} + +static const struct v4l2_ctrl_ops vdec_ctrl_ops = { + .g_volatile_ctrl = vdec_op_g_volatile_ctrl, +}; + +int amvdec_init_ctrls(struct v4l2_ctrl_handler *ctrl_handler) +{ + int ret; + struct v4l2_ctrl *ctrl; + + ret = v4l2_ctrl_handler_init(ctrl_handler, 1); + if (ret) + return ret; + + ctrl = v4l2_ctrl_new_std(ctrl_handler, &vdec_ctrl_ops, + V4L2_CID_MIN_BUFFERS_FOR_CAPTURE, 1, 32, 1, 1); + if (ctrl) + ctrl->flags |= V4L2_CTRL_FLAG_VOLATILE; + + ret = ctrl_handler->error; + if (ret) { + v4l2_ctrl_handler_free(ctrl_handler); + return ret; + } + + return 0; +} +EXPORT_SYMBOL_GPL(amvdec_init_ctrls); diff --git a/drivers/media/platform/meson/vdec/vdec_ctrls.h b/drivers/media/platform/meson/vdec/vdec_ctrls.h new file mode 100644 index 0000000..4bcc5e6 --- /dev/null +++ b/drivers/media/platform/meson/vdec/vdec_ctrls.h @@ -0,0 +1,8 @@ +#ifndef __MESON_VDEC_CTRLS_H_ +#define __MESON_VDEC_CTRLS_H_ + +#include "vdec.h" + +int amvdec_init_ctrls(struct v4l2_ctrl_handler *ctrl_handler); + +#endif