mirror of
https://github.com/Fishwaldo/build.git
synced 2025-03-30 18:51:30 +00:00
153 lines
4.6 KiB
Diff
153 lines
4.6 KiB
Diff
From e36802c6297adb0c560f3a6c1672546eb380c458 Mon Sep 17 00:00:00 2001
|
|
From: Maxime Jourdan <mjourdan@baylibre.com>
|
|
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
|