mirror of
https://github.com/armbian/build.git
synced 2025-08-14 07:06:58 +02:00
- Chanaged default x.org configuration to disable glamor - Reintroduce patch to use DRM cursor plane as overlay in rk322x-current and -dev - Updated wifi patches for kernel 5.8.10 - Bumped rk322x to u-boot v2020.07, removed reserved zones from device trees - Updated OPTEE to v3.10, using ddrbin v1.10 - Bumped rk322x-current to kernel 5.8.y - Imported new patches from knaerzche's LibreELEC fork for rk322x-dev (kernel 5.8.y) - Adjusted existing patches to match changes, updated rk322x-dev kernel config file - Add default modprobe conf file for esp8089 to force the crystal frequency to 40Mhz for rk322x targets - Removed ssv6051 firmware packages to move to armbian-firmware repository - Switching ssv6051-wifi.cfg to /lib/firmware for rk322x-legacy - Removed P2P interface for esp8089 driver for rk322x-legacy - Optimized ssv6051 performance: kernel module gains -Os flag, disabled p2p interface, enabled HW crypto for CCMP cipher - Enabled remote control interface, IR GPIO kernel module and HDMI CEC modules
1191 lines
45 KiB
Diff
1191 lines
45 KiB
Diff
From 7ecb99ec97624da3354bc7702179e21309fb3a4e Mon Sep 17 00:00:00 2001
|
|
From: Ezequiel Garcia <ezequiel@collabora.com>
|
|
Date: Wed, 1 Jul 2020 15:17:30 +0200
|
|
Subject: [PATCH] v4l2-core: Print control name in VIDIOC_S/G_(EXT)_CTRL(S)
|
|
|
|
While debugging, it's currently really hard to identify controls
|
|
by their ID. Print the control name making the print more helpful.
|
|
|
|
With this change, the print changes from:
|
|
|
|
video1: VIDIOC_S_EXT_CTRLS: which=0xf010000, count=5, error_idx=4, request_fd=45, id/size=0x990ce8/1048, id/size=0x990ce9/12, id/size=0x990cea/480, id/size=0x990ceb/896, id/size=0x990cec/400
|
|
|
|
video1: VIDIOC_S_EXT_CTRLS: which=0xf010000, count=5, error_idx=4, request_fd=42, name=H264 Sequence Parameter Set, id/size=0x990ce8/1048, name=H264 Picture Parameter Set, id/size=0x990ce9/12, name=H264 Scaling Matrix, id/size=0x990cea/480, name=H264 Slice Parameters, id/size=0x990ceb/896, name=H264 Decode Parameters, id/size=0x990cec/400
|
|
|
|
For instance, this is specially helpful when the ioctl fails. Consider
|
|
the following example:
|
|
|
|
v4l2-ctrls: prepare_ext_ctrls: video1: pointer control id 0x990cec size too small, 400 bytes but 784 bytes needed
|
|
v4l2-ctrls: try_set_ext_ctrls: video1: video1: try_set_ext_ctrls_common failed (-14)
|
|
video1: VIDIOC_S_EXT_CTRLS: error -14: which=0xf010000, count=5, error_idx=5, request_fd=39, name=H264 Sequence Parameter Set, id/size=0x990ce8/1048, name=H264 Picture Parameter Set, id/size=0x990ce9/12, name=H264 Scaling Matrix, id/size=0x990cea/480, name=H264 Slice Parameters, id/size=0x990ceb/896, name=H264 Decode Parameters, id/size=0x990cec/400
|
|
|
|
Signed-off-by: Ezequiel Garcia <ezequiel@collabora.com>
|
|
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
|
|
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
|
|
(cherry picked from commit a69a7a33268308ddcc9abf0f7d7cd61ec4300cbe)
|
|
---
|
|
drivers/media/v4l2-core/v4l2-ioctl.c | 14 ++++++++++----
|
|
1 file changed, 10 insertions(+), 4 deletions(-)
|
|
|
|
diff --git a/drivers/media/v4l2-core/v4l2-ioctl.c b/drivers/media/v4l2-core/v4l2-ioctl.c
|
|
index 5e057f798a15..ccf947632a3b 100644
|
|
--- a/drivers/media/v4l2-core/v4l2-ioctl.c
|
|
+++ b/drivers/media/v4l2-core/v4l2-ioctl.c
|
|
@@ -582,7 +582,10 @@ static void v4l_print_querymenu(const void *arg, bool write_only)
|
|
static void v4l_print_control(const void *arg, bool write_only)
|
|
{
|
|
const struct v4l2_control *p = arg;
|
|
+ const char *name = v4l2_ctrl_get_name(p->id);
|
|
|
|
+ if (name)
|
|
+ pr_cont("name=%s, ", name);
|
|
pr_cont("id=0x%x, value=%d\n", p->id, p->value);
|
|
}
|
|
|
|
@@ -594,12 +597,15 @@ static void v4l_print_ext_controls(const void *arg, bool write_only)
|
|
pr_cont("which=0x%x, count=%d, error_idx=%d, request_fd=%d",
|
|
p->which, p->count, p->error_idx, p->request_fd);
|
|
for (i = 0; i < p->count; i++) {
|
|
+ unsigned int id = p->controls[i].id;
|
|
+ const char *name = v4l2_ctrl_get_name(id);
|
|
+
|
|
+ if (name)
|
|
+ pr_cont(", name=%s", name);
|
|
if (!p->controls[i].size)
|
|
- pr_cont(", id/val=0x%x/0x%x",
|
|
- p->controls[i].id, p->controls[i].value);
|
|
+ pr_cont(", id/val=0x%x/0x%x", id, p->controls[i].value);
|
|
else
|
|
- pr_cont(", id/size=0x%x/%u",
|
|
- p->controls[i].id, p->controls[i].size);
|
|
+ pr_cont(", id/size=0x%x/%u", id, p->controls[i].size);
|
|
}
|
|
pr_cont("\n");
|
|
}
|
|
|
|
From d524e0ef051dcccefbdff08e1023489922da198f Mon Sep 17 00:00:00 2001
|
|
From: Ezequiel Garcia <ezequiel@collabora.com>
|
|
Date: Wed, 24 Jun 2020 21:28:00 +0200
|
|
Subject: [PATCH] media: Add V4L2_TYPE_IS_CAPTURE helper
|
|
|
|
It's all too easy to get confused by the V4L2_TYPE_IS_OUTPUT
|
|
macro, when it's used as !V4L2_TYPE_IS_OUTPUT.
|
|
|
|
Reduce the risk of confusion with macro to explicitly
|
|
check for the CAPTURE queue type case.
|
|
|
|
This change does not affect functionality, and it's
|
|
only intended to make the code more readable.
|
|
|
|
Suggested-by: Nicolas Dufresne <nicolas.dufresne@collabora.com>
|
|
Signed-off-by: Ezequiel Garcia <ezequiel@collabora.com>
|
|
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
|
|
[hverkuil-cisco@xs4all.nl: checkpatch: align with parenthesis]
|
|
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
|
|
(cherry picked from commit b3ab1c6058fad8cd5726f24e9ed9053e43bb2af4)
|
|
---
|
|
drivers/media/common/videobuf2/videobuf2-v4l2.c | 4 ++--
|
|
drivers/media/platform/exynos-gsc/gsc-core.c | 2 +-
|
|
drivers/media/platform/exynos-gsc/gsc-m2m.c | 2 +-
|
|
drivers/media/platform/mtk-jpeg/mtk_jpeg_core.c | 2 +-
|
|
drivers/media/platform/mtk-mdp/mtk_mdp_m2m.c | 7 +++----
|
|
drivers/media/platform/rcar_jpu.c | 2 +-
|
|
drivers/media/platform/sti/hva/hva-v4l2.c | 2 +-
|
|
drivers/media/platform/ti-vpe/vpe.c | 2 +-
|
|
drivers/media/test-drivers/vicodec/vicodec-core.c | 6 +++---
|
|
drivers/media/v4l2-core/v4l2-mem2mem.c | 6 +++---
|
|
drivers/staging/media/hantro/hantro_v4l2.c | 2 +-
|
|
drivers/staging/media/rkvdec/rkvdec.c | 2 +-
|
|
include/uapi/linux/videodev2.h | 2 ++
|
|
13 files changed, 21 insertions(+), 20 deletions(-)
|
|
|
|
diff --git a/drivers/media/common/videobuf2/videobuf2-v4l2.c b/drivers/media/common/videobuf2/videobuf2-v4l2.c
|
|
index eb5d5db96552..fd32c2e64809 100644
|
|
--- a/drivers/media/common/videobuf2/videobuf2-v4l2.c
|
|
+++ b/drivers/media/common/videobuf2/videobuf2-v4l2.c
|
|
@@ -94,7 +94,7 @@ static int __verify_length(struct vb2_buffer *vb, const struct v4l2_buffer *b)
|
|
unsigned int bytesused;
|
|
unsigned int plane;
|
|
|
|
- if (!V4L2_TYPE_IS_OUTPUT(b->type))
|
|
+ if (V4L2_TYPE_IS_CAPTURE(b->type))
|
|
return 0;
|
|
|
|
if (V4L2_TYPE_IS_MULTIPLANAR(b->type)) {
|
|
@@ -307,7 +307,7 @@ static int vb2_fill_vb2_v4l2_buffer(struct vb2_buffer *vb, struct v4l2_buffer *b
|
|
|
|
/* Zero flags that we handle */
|
|
vbuf->flags = b->flags & ~V4L2_BUFFER_MASK_FLAGS;
|
|
- if (!vb->vb2_queue->copy_timestamp || !V4L2_TYPE_IS_OUTPUT(b->type)) {
|
|
+ if (!vb->vb2_queue->copy_timestamp || V4L2_TYPE_IS_CAPTURE(b->type)) {
|
|
/*
|
|
* Non-COPY timestamps and non-OUTPUT queues will get
|
|
* their timestamp and timestamp source flags from the
|
|
diff --git a/drivers/media/platform/exynos-gsc/gsc-core.c b/drivers/media/platform/exynos-gsc/gsc-core.c
|
|
index f6650b45bc3d..9f41c2e7097a 100644
|
|
--- a/drivers/media/platform/exynos-gsc/gsc-core.c
|
|
+++ b/drivers/media/platform/exynos-gsc/gsc-core.c
|
|
@@ -577,7 +577,7 @@ int gsc_try_selection(struct gsc_ctx *ctx, struct v4l2_selection *s)
|
|
v4l_bound_align_image(&tmp_w, min_w, max_w, mod_x,
|
|
&tmp_h, min_h, max_h, mod_y, 0);
|
|
|
|
- if (!V4L2_TYPE_IS_OUTPUT(s->type) &&
|
|
+ if (V4L2_TYPE_IS_CAPTURE(s->type) &&
|
|
(ctx->gsc_ctrls.rotate->val == 90 ||
|
|
ctx->gsc_ctrls.rotate->val == 270))
|
|
gsc_check_crop_change(tmp_h, tmp_w,
|
|
diff --git a/drivers/media/platform/exynos-gsc/gsc-m2m.c b/drivers/media/platform/exynos-gsc/gsc-m2m.c
|
|
index e2c162635f72..27a3c92c73bc 100644
|
|
--- a/drivers/media/platform/exynos-gsc/gsc-m2m.c
|
|
+++ b/drivers/media/platform/exynos-gsc/gsc-m2m.c
|
|
@@ -255,7 +255,7 @@ static int gsc_m2m_buf_prepare(struct vb2_buffer *vb)
|
|
if (IS_ERR(frame))
|
|
return PTR_ERR(frame);
|
|
|
|
- if (!V4L2_TYPE_IS_OUTPUT(vb->vb2_queue->type)) {
|
|
+ if (V4L2_TYPE_IS_CAPTURE(vb->vb2_queue->type)) {
|
|
for (i = 0; i < frame->fmt->num_planes; i++)
|
|
vb2_set_plane_payload(vb, i, frame->payload[i]);
|
|
}
|
|
diff --git a/drivers/media/platform/mtk-jpeg/mtk_jpeg_core.c b/drivers/media/platform/mtk-jpeg/mtk_jpeg_core.c
|
|
index f82a81a3bdee..61fed1e35a00 100644
|
|
--- a/drivers/media/platform/mtk-jpeg/mtk_jpeg_core.c
|
|
+++ b/drivers/media/platform/mtk-jpeg/mtk_jpeg_core.c
|
|
@@ -731,7 +731,7 @@ static void mtk_jpeg_stop_streaming(struct vb2_queue *q)
|
|
* subsampling. Update capture queue when the stream is off.
|
|
*/
|
|
if (ctx->state == MTK_JPEG_SOURCE_CHANGE &&
|
|
- !V4L2_TYPE_IS_OUTPUT(q->type)) {
|
|
+ V4L2_TYPE_IS_CAPTURE(q->type)) {
|
|
struct mtk_jpeg_src_buf *src_buf;
|
|
|
|
vb = v4l2_m2m_next_src_buf(ctx->fh.m2m_ctx);
|
|
diff --git a/drivers/media/platform/mtk-mdp/mtk_mdp_m2m.c b/drivers/media/platform/mtk-mdp/mtk_mdp_m2m.c
|
|
index 821f2cf325f0..a6ea22b57416 100644
|
|
--- a/drivers/media/platform/mtk-mdp/mtk_mdp_m2m.c
|
|
+++ b/drivers/media/platform/mtk-mdp/mtk_mdp_m2m.c
|
|
@@ -193,7 +193,7 @@ static const struct mtk_mdp_fmt *mtk_mdp_try_fmt_mplane(struct mtk_mdp_ctx *ctx,
|
|
|
|
pix_mp->field = V4L2_FIELD_NONE;
|
|
pix_mp->pixelformat = fmt->pixelformat;
|
|
- if (!V4L2_TYPE_IS_OUTPUT(f->type)) {
|
|
+ if (V4L2_TYPE_IS_CAPTURE(f->type)) {
|
|
pix_mp->colorspace = ctx->colorspace;
|
|
pix_mp->xfer_func = ctx->xfer_func;
|
|
pix_mp->ycbcr_enc = ctx->ycbcr_enc;
|
|
@@ -327,9 +327,8 @@ static int mtk_mdp_try_crop(struct mtk_mdp_ctx *ctx, u32 type,
|
|
mtk_mdp_bound_align_image(&new_w, min_w, max_w, align_w,
|
|
&new_h, min_h, max_h, align_h);
|
|
|
|
- if (!V4L2_TYPE_IS_OUTPUT(type) &&
|
|
- (ctx->ctrls.rotate->val == 90 ||
|
|
- ctx->ctrls.rotate->val == 270))
|
|
+ if (V4L2_TYPE_IS_CAPTURE(type) &&
|
|
+ (ctx->ctrls.rotate->val == 90 || ctx->ctrls.rotate->val == 270))
|
|
mtk_mdp_check_crop_change(new_h, new_w,
|
|
&r->width, &r->height);
|
|
else
|
|
diff --git a/drivers/media/platform/rcar_jpu.c b/drivers/media/platform/rcar_jpu.c
|
|
index 5250a14324e9..9b99ff368698 100644
|
|
--- a/drivers/media/platform/rcar_jpu.c
|
|
+++ b/drivers/media/platform/rcar_jpu.c
|
|
@@ -1066,7 +1066,7 @@ static int jpu_buf_prepare(struct vb2_buffer *vb)
|
|
}
|
|
|
|
/* decoder capture queue */
|
|
- if (!ctx->encoder && !V4L2_TYPE_IS_OUTPUT(vb->vb2_queue->type))
|
|
+ if (!ctx->encoder && V4L2_TYPE_IS_CAPTURE(vb->vb2_queue->type))
|
|
vb2_set_plane_payload(vb, i, size);
|
|
}
|
|
|
|
diff --git a/drivers/media/platform/sti/hva/hva-v4l2.c b/drivers/media/platform/sti/hva/hva-v4l2.c
|
|
index 197b99d8fd9c..bb34d6997d99 100644
|
|
--- a/drivers/media/platform/sti/hva/hva-v4l2.c
|
|
+++ b/drivers/media/platform/sti/hva/hva-v4l2.c
|
|
@@ -1087,7 +1087,7 @@ static void hva_stop_streaming(struct vb2_queue *vq)
|
|
|
|
if ((V4L2_TYPE_IS_OUTPUT(vq->type) &&
|
|
vb2_is_streaming(&ctx->fh.m2m_ctx->cap_q_ctx.q)) ||
|
|
- (!V4L2_TYPE_IS_OUTPUT(vq->type) &&
|
|
+ (V4L2_TYPE_IS_CAPTURE(vq->type) &&
|
|
vb2_is_streaming(&ctx->fh.m2m_ctx->out_q_ctx.q))) {
|
|
dev_dbg(dev, "%s %s out=%d cap=%d\n",
|
|
ctx->name, to_type_str(vq->type),
|
|
diff --git a/drivers/media/platform/ti-vpe/vpe.c b/drivers/media/platform/ti-vpe/vpe.c
|
|
index cff2fcd6d812..346f8212791c 100644
|
|
--- a/drivers/media/platform/ti-vpe/vpe.c
|
|
+++ b/drivers/media/platform/ti-vpe/vpe.c
|
|
@@ -1576,7 +1576,7 @@ static int vpe_g_fmt(struct file *file, void *priv, struct v4l2_format *f)
|
|
|
|
*f = q_data->format;
|
|
|
|
- if (!V4L2_TYPE_IS_OUTPUT(f->type)) {
|
|
+ if (V4L2_TYPE_IS_CAPTURE(f->type)) {
|
|
struct vpe_q_data *s_q_data;
|
|
struct v4l2_pix_format_mplane *spix;
|
|
|
|
diff --git a/drivers/media/test-drivers/vicodec/vicodec-core.c b/drivers/media/test-drivers/vicodec/vicodec-core.c
|
|
index e879290727ef..8941d73f6611 100644
|
|
--- a/drivers/media/test-drivers/vicodec/vicodec-core.c
|
|
+++ b/drivers/media/test-drivers/vicodec/vicodec-core.c
|
|
@@ -1442,7 +1442,7 @@ static void vicodec_buf_queue(struct vb2_buffer *vb)
|
|
.u.src_change.changes = V4L2_EVENT_SRC_CH_RESOLUTION,
|
|
};
|
|
|
|
- if (!V4L2_TYPE_IS_OUTPUT(vb->vb2_queue->type) &&
|
|
+ if (V4L2_TYPE_IS_CAPTURE(vb->vb2_queue->type) &&
|
|
vb2_is_streaming(vb->vb2_queue) &&
|
|
v4l2_m2m_dst_buf_is_last(ctx->fh.m2m_ctx)) {
|
|
unsigned int i;
|
|
@@ -1479,7 +1479,7 @@ static void vicodec_buf_queue(struct vb2_buffer *vb)
|
|
* in the compressed stream
|
|
*/
|
|
if (ctx->is_stateless || ctx->is_enc ||
|
|
- !V4L2_TYPE_IS_OUTPUT(vb->vb2_queue->type)) {
|
|
+ V4L2_TYPE_IS_CAPTURE(vb->vb2_queue->type)) {
|
|
v4l2_m2m_buf_queue(ctx->fh.m2m_ctx, vbuf);
|
|
return;
|
|
}
|
|
@@ -1574,7 +1574,7 @@ static int vicodec_start_streaming(struct vb2_queue *q,
|
|
state->gop_cnt = 0;
|
|
|
|
if ((V4L2_TYPE_IS_OUTPUT(q->type) && !ctx->is_enc) ||
|
|
- (!V4L2_TYPE_IS_OUTPUT(q->type) && ctx->is_enc))
|
|
+ (V4L2_TYPE_IS_CAPTURE(q->type) && ctx->is_enc))
|
|
return 0;
|
|
|
|
if (info->id == V4L2_PIX_FMT_FWHT ||
|
|
diff --git a/drivers/media/v4l2-core/v4l2-mem2mem.c b/drivers/media/v4l2-core/v4l2-mem2mem.c
|
|
index 62ac9424c92a..95a8f2dc5341 100644
|
|
--- a/drivers/media/v4l2-core/v4l2-mem2mem.c
|
|
+++ b/drivers/media/v4l2-core/v4l2-mem2mem.c
|
|
@@ -556,7 +556,7 @@ int v4l2_m2m_querybuf(struct file *file, struct v4l2_m2m_ctx *m2m_ctx,
|
|
ret = vb2_querybuf(vq, buf);
|
|
|
|
/* Adjust MMAP memory offsets for the CAPTURE queue */
|
|
- if (buf->memory == V4L2_MEMORY_MMAP && !V4L2_TYPE_IS_OUTPUT(vq->type)) {
|
|
+ if (buf->memory == V4L2_MEMORY_MMAP && V4L2_TYPE_IS_CAPTURE(vq->type)) {
|
|
if (V4L2_TYPE_IS_MULTIPLANAR(vq->type)) {
|
|
for (i = 0; i < buf->length; ++i)
|
|
buf->m.planes[i].m.mem_offset
|
|
@@ -712,7 +712,7 @@ int v4l2_m2m_qbuf(struct file *file, struct v4l2_m2m_ctx *m2m_ctx,
|
|
int ret;
|
|
|
|
vq = v4l2_m2m_get_vq(m2m_ctx, buf->type);
|
|
- if (!V4L2_TYPE_IS_OUTPUT(vq->type) &&
|
|
+ if (V4L2_TYPE_IS_CAPTURE(vq->type) &&
|
|
(buf->flags & V4L2_BUF_FLAG_REQUEST_FD)) {
|
|
dprintk("%s: requests cannot be used with capture buffers\n",
|
|
__func__);
|
|
@@ -729,7 +729,7 @@ int v4l2_m2m_qbuf(struct file *file, struct v4l2_m2m_ctx *m2m_ctx,
|
|
* buffer as DONE with LAST flag since it won't be queued on the
|
|
* device.
|
|
*/
|
|
- if (!V4L2_TYPE_IS_OUTPUT(vq->type) &&
|
|
+ if (V4L2_TYPE_IS_CAPTURE(vq->type) &&
|
|
vb2_is_streaming(vq) && !vb2_start_streaming_called(vq) &&
|
|
(v4l2_m2m_has_stopped(m2m_ctx) || v4l2_m2m_dst_buf_is_last(m2m_ctx)))
|
|
v4l2_m2m_force_last_buf_done(m2m_ctx, vq);
|
|
diff --git a/drivers/staging/media/hantro/hantro_v4l2.c b/drivers/staging/media/hantro/hantro_v4l2.c
|
|
index f28a94e2fa93..63859e8a0923 100644
|
|
--- a/drivers/staging/media/hantro/hantro_v4l2.c
|
|
+++ b/drivers/staging/media/hantro/hantro_v4l2.c
|
|
@@ -237,7 +237,7 @@ static int hantro_try_fmt(const struct hantro_ctx *ctx,
|
|
enum v4l2_buf_type type)
|
|
{
|
|
const struct hantro_fmt *fmt, *vpu_fmt;
|
|
- bool capture = !V4L2_TYPE_IS_OUTPUT(type);
|
|
+ bool capture = V4L2_TYPE_IS_CAPTURE(type);
|
|
bool coded;
|
|
|
|
coded = capture == hantro_is_encoder_ctx(ctx);
|
|
diff --git a/drivers/staging/media/rkvdec/rkvdec.c b/drivers/staging/media/rkvdec/rkvdec.c
|
|
index 225eeca73356..fd68671f0286 100644
|
|
--- a/drivers/staging/media/rkvdec/rkvdec.c
|
|
+++ b/drivers/staging/media/rkvdec/rkvdec.c
|
|
@@ -489,7 +489,7 @@ static int rkvdec_start_streaming(struct vb2_queue *q, unsigned int count)
|
|
const struct rkvdec_coded_fmt_desc *desc;
|
|
int ret;
|
|
|
|
- if (!V4L2_TYPE_IS_OUTPUT(q->type))
|
|
+ if (V4L2_TYPE_IS_CAPTURE(q->type))
|
|
return 0;
|
|
|
|
desc = ctx->coded_fmt_desc;
|
|
diff --git a/include/uapi/linux/videodev2.h b/include/uapi/linux/videodev2.h
|
|
index c3a1cf1c507f..6fe8822d2cb4 100644
|
|
--- a/include/uapi/linux/videodev2.h
|
|
+++ b/include/uapi/linux/videodev2.h
|
|
@@ -171,6 +171,8 @@ enum v4l2_buf_type {
|
|
|| (type) == V4L2_BUF_TYPE_SDR_OUTPUT \
|
|
|| (type) == V4L2_BUF_TYPE_META_OUTPUT)
|
|
|
|
+#define V4L2_TYPE_IS_CAPTURE(type) (!V4L2_TYPE_IS_OUTPUT(type))
|
|
+
|
|
enum v4l2_tuner_type {
|
|
V4L2_TUNER_RADIO = 1,
|
|
V4L2_TUNER_ANALOG_TV = 2,
|
|
|
|
From 728f96ea31862791706eb9390cb865e4fd8fa09d Mon Sep 17 00:00:00 2001
|
|
From: Ezequiel Garcia <ezequiel@collabora.com>
|
|
Date: Wed, 1 Jul 2020 15:16:02 +0200
|
|
Subject: [PATCH] hantro: h264: Remove unused macro definition
|
|
|
|
The generic H264 reference list builder moved all
|
|
the users of this macro, but left the macro.
|
|
|
|
Remove it.
|
|
|
|
Signed-off-by: Ezequiel Garcia <ezequiel@collabora.com>
|
|
Reviewed-by: Philipp Zabel <p.zabel@pengutronix.de>
|
|
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
|
|
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
|
|
(cherry picked from commit 3ebf271b1dee6df816bd8f2135218640c478dedd)
|
|
---
|
|
drivers/staging/media/hantro/hantro_h264.c | 2 --
|
|
1 file changed, 2 deletions(-)
|
|
|
|
diff --git a/drivers/staging/media/hantro/hantro_h264.c b/drivers/staging/media/hantro/hantro_h264.c
|
|
index d561f125085a..dd935d7009bf 100644
|
|
--- a/drivers/staging/media/hantro/hantro_h264.c
|
|
+++ b/drivers/staging/media/hantro/hantro_h264.c
|
|
@@ -22,8 +22,6 @@
|
|
#define POC_BUFFER_SIZE 34
|
|
#define SCALING_LIST_SIZE (6 * 16 + 2 * 64)
|
|
|
|
-#define HANTRO_CMP(a, b) ((a) < (b) ? -1 : 1)
|
|
-
|
|
/* Data structure describing auxiliary buffer format. */
|
|
struct hantro_h264_dec_priv_tbl {
|
|
u32 cabac_table[CABAC_INIT_BUFFER_SIZE];
|
|
|
|
From ad6f6337541843af2f943f603636f64a6a55e215 Mon Sep 17 00:00:00 2001
|
|
From: Ezequiel Garcia <ezequiel@collabora.com>
|
|
Date: Wed, 1 Jul 2020 15:16:03 +0200
|
|
Subject: [PATCH] hantro: h264: Rename scaling list handling function
|
|
|
|
Commit e17f08e31666 ("media: hantro: Do not reorder
|
|
H264 scaling list") removed the scaling list reordering,
|
|
which was wrong and not needed.
|
|
|
|
However, the name of the function stayed, which is
|
|
confusing for anyone reading the code. Rename
|
|
from "reorder" to "assemble" which is cleaner.
|
|
|
|
This is just a cosmetic cleanup.
|
|
|
|
Signed-off-by: Ezequiel Garcia <ezequiel@collabora.com>
|
|
Reviewed-by: Philipp Zabel <p.zabel@pengutronix.de>
|
|
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
|
|
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
|
|
(cherry picked from commit 4df3a47e3422a9de1f3ce1a4ba8a0447a73e7567)
|
|
---
|
|
drivers/staging/media/hantro/hantro_h264.c | 4 ++--
|
|
1 file changed, 2 insertions(+), 2 deletions(-)
|
|
|
|
diff --git a/drivers/staging/media/hantro/hantro_h264.c b/drivers/staging/media/hantro/hantro_h264.c
|
|
index dd935d7009bf..194d05848077 100644
|
|
--- a/drivers/staging/media/hantro/hantro_h264.c
|
|
+++ b/drivers/staging/media/hantro/hantro_h264.c
|
|
@@ -193,7 +193,7 @@ static const u32 h264_cabac_table[] = {
|
|
};
|
|
|
|
static void
|
|
-reorder_scaling_list(struct hantro_ctx *ctx)
|
|
+assemble_scaling_list(struct hantro_ctx *ctx)
|
|
{
|
|
const struct hantro_h264_dec_ctrls *ctrls = &ctx->h264_dec.ctrls;
|
|
const struct v4l2_ctrl_h264_scaling_matrix *scaling = ctrls->scaling;
|
|
@@ -235,7 +235,7 @@ static void prepare_table(struct hantro_ctx *ctx)
|
|
tbl->poc[32] = dec_param->top_field_order_cnt;
|
|
tbl->poc[33] = dec_param->bottom_field_order_cnt;
|
|
|
|
- reorder_scaling_list(ctx);
|
|
+ assemble_scaling_list(ctx);
|
|
}
|
|
|
|
static bool dpb_entry_match(const struct v4l2_h264_dpb_entry *a,
|
|
|
|
From 63c05ac390a6fb9d4930804931732630dd0e20ac Mon Sep 17 00:00:00 2001
|
|
From: Ezequiel Garcia <ezequiel@collabora.com>
|
|
Date: Wed, 1 Jul 2020 15:16:04 +0200
|
|
Subject: [PATCH] hantro: Rework how encoder and decoder are identified
|
|
|
|
So far we've been using the .buf_finish hook to distinguish
|
|
decoder from encoder. This is unnecessarily obfuscated.
|
|
|
|
Moreover, we want to move the buf_finish, so use a cleaner
|
|
scheme to distinguish the driver decoder/encoder type.
|
|
|
|
Signed-off-by: Ezequiel Garcia <ezequiel@collabora.com>
|
|
Reviewed-by: Philipp Zabel <p.zabel@pengutronix.de>
|
|
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
|
|
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
|
|
(cherry picked from commit 21f0315b7b3ee6ca909d81a963744671fb27bf71)
|
|
---
|
|
drivers/staging/media/hantro/hantro.h | 6 ++---
|
|
drivers/staging/media/hantro/hantro_drv.c | 9 +++----
|
|
drivers/staging/media/hantro/hantro_v4l2.c | 28 +++++++++++-----------
|
|
3 files changed, 20 insertions(+), 23 deletions(-)
|
|
|
|
diff --git a/drivers/staging/media/hantro/hantro.h b/drivers/staging/media/hantro/hantro.h
|
|
index 3005207fc6fb..2284e23d8500 100644
|
|
--- a/drivers/staging/media/hantro/hantro.h
|
|
+++ b/drivers/staging/media/hantro/hantro.h
|
|
@@ -199,6 +199,7 @@ struct hantro_dev {
|
|
*
|
|
* @dev: VPU driver data to which the context belongs.
|
|
* @fh: V4L2 file handler.
|
|
+ * @is_encoder: Decoder or encoder context?
|
|
*
|
|
* @sequence_cap: Sequence counter for capture queue
|
|
* @sequence_out: Sequence counter for output queue
|
|
@@ -223,6 +224,7 @@ struct hantro_dev {
|
|
struct hantro_ctx {
|
|
struct hantro_dev *dev;
|
|
struct v4l2_fh fh;
|
|
+ bool is_encoder;
|
|
|
|
u32 sequence_cap;
|
|
u32 sequence_out;
|
|
@@ -399,8 +401,6 @@ static inline void hantro_reg_write_s(struct hantro_dev *vpu,
|
|
vdpu_write(vpu, vdpu_read_mask(vpu, reg, val), reg->base);
|
|
}
|
|
|
|
-bool hantro_is_encoder_ctx(const struct hantro_ctx *ctx);
|
|
-
|
|
void *hantro_get_ctrl(struct hantro_ctx *ctx, u32 id);
|
|
dma_addr_t hantro_get_ref(struct hantro_ctx *ctx, u64 ts);
|
|
|
|
@@ -420,7 +420,7 @@ static inline bool
|
|
hantro_needs_postproc(const struct hantro_ctx *ctx,
|
|
const struct hantro_fmt *fmt)
|
|
{
|
|
- return !hantro_is_encoder_ctx(ctx) && fmt->fourcc != V4L2_PIX_FMT_NV12;
|
|
+ return !ctx->is_encoder && fmt->fourcc != V4L2_PIX_FMT_NV12;
|
|
}
|
|
|
|
static inline dma_addr_t
|
|
diff --git a/drivers/staging/media/hantro/hantro_drv.c b/drivers/staging/media/hantro/hantro_drv.c
|
|
index 0db8ad455160..9145d02e5d3c 100644
|
|
--- a/drivers/staging/media/hantro/hantro_drv.c
|
|
+++ b/drivers/staging/media/hantro/hantro_drv.c
|
|
@@ -195,11 +195,6 @@ static void device_run(void *priv)
|
|
hantro_job_finish(ctx->dev, ctx, 0, VB2_BUF_STATE_ERROR);
|
|
}
|
|
|
|
-bool hantro_is_encoder_ctx(const struct hantro_ctx *ctx)
|
|
-{
|
|
- return ctx->buf_finish == hantro_enc_buf_finish;
|
|
-}
|
|
-
|
|
static struct v4l2_m2m_ops vpu_m2m_ops = {
|
|
.device_run = device_run,
|
|
};
|
|
@@ -240,7 +235,7 @@ queue_init(void *priv, struct vb2_queue *src_vq, struct vb2_queue *dst_vq)
|
|
*
|
|
* For the DMA destination buffer, we use a bounce buffer.
|
|
*/
|
|
- if (hantro_is_encoder_ctx(ctx)) {
|
|
+ if (ctx->is_encoder) {
|
|
dst_vq->mem_ops = &vb2_vmalloc_memops;
|
|
} else {
|
|
dst_vq->bidirectional = true;
|
|
@@ -420,8 +415,10 @@ static int hantro_open(struct file *filp)
|
|
if (func->id == MEDIA_ENT_F_PROC_VIDEO_ENCODER) {
|
|
allowed_codecs = vpu->variant->codec & HANTRO_ENCODERS;
|
|
ctx->buf_finish = hantro_enc_buf_finish;
|
|
+ ctx->is_encoder = true;
|
|
} else if (func->id == MEDIA_ENT_F_PROC_VIDEO_DECODER) {
|
|
allowed_codecs = vpu->variant->codec & HANTRO_DECODERS;
|
|
+ ctx->is_encoder = false;
|
|
} else {
|
|
ret = -ENODEV;
|
|
goto err_ctx_free;
|
|
diff --git a/drivers/staging/media/hantro/hantro_v4l2.c b/drivers/staging/media/hantro/hantro_v4l2.c
|
|
index 63859e8a0923..b668a82d40ad 100644
|
|
--- a/drivers/staging/media/hantro/hantro_v4l2.c
|
|
+++ b/drivers/staging/media/hantro/hantro_v4l2.c
|
|
@@ -40,7 +40,7 @@ hantro_get_formats(const struct hantro_ctx *ctx, unsigned int *num_fmts)
|
|
{
|
|
const struct hantro_fmt *formats;
|
|
|
|
- if (hantro_is_encoder_ctx(ctx)) {
|
|
+ if (ctx->is_encoder) {
|
|
formats = ctx->dev->variant->enc_fmts;
|
|
*num_fmts = ctx->dev->variant->num_enc_fmts;
|
|
} else {
|
|
@@ -55,7 +55,7 @@ static const struct hantro_fmt *
|
|
hantro_get_postproc_formats(const struct hantro_ctx *ctx,
|
|
unsigned int *num_fmts)
|
|
{
|
|
- if (hantro_is_encoder_ctx(ctx)) {
|
|
+ if (ctx->is_encoder) {
|
|
*num_fmts = 0;
|
|
return NULL;
|
|
}
|
|
@@ -158,7 +158,7 @@ static int vidioc_enum_fmt(struct file *file, void *priv,
|
|
* not MODE_NONE.
|
|
* - on the output side we want to filter out all MODE_NONE formats.
|
|
*/
|
|
- skip_mode_none = capture == hantro_is_encoder_ctx(ctx);
|
|
+ skip_mode_none = capture == ctx->is_encoder;
|
|
|
|
formats = hantro_get_formats(ctx, &num_fmts);
|
|
for (i = 0; i < num_fmts; i++) {
|
|
@@ -240,7 +240,7 @@ static int hantro_try_fmt(const struct hantro_ctx *ctx,
|
|
bool capture = V4L2_TYPE_IS_CAPTURE(type);
|
|
bool coded;
|
|
|
|
- coded = capture == hantro_is_encoder_ctx(ctx);
|
|
+ coded = capture == ctx->is_encoder;
|
|
|
|
vpu_debug(4, "trying format %c%c%c%c\n",
|
|
(pix_mp->pixelformat & 0x7f),
|
|
@@ -257,7 +257,7 @@ static int hantro_try_fmt(const struct hantro_ctx *ctx,
|
|
if (coded) {
|
|
pix_mp->num_planes = 1;
|
|
vpu_fmt = fmt;
|
|
- } else if (hantro_is_encoder_ctx(ctx)) {
|
|
+ } else if (ctx->is_encoder) {
|
|
vpu_fmt = ctx->vpu_dst_fmt;
|
|
} else {
|
|
vpu_fmt = ctx->vpu_src_fmt;
|
|
@@ -330,7 +330,7 @@ hantro_reset_encoded_fmt(struct hantro_ctx *ctx)
|
|
|
|
vpu_fmt = hantro_get_default_fmt(ctx, true);
|
|
|
|
- if (hantro_is_encoder_ctx(ctx)) {
|
|
+ if (ctx->is_encoder) {
|
|
ctx->vpu_dst_fmt = vpu_fmt;
|
|
fmt = &ctx->dst_fmt;
|
|
} else {
|
|
@@ -341,7 +341,7 @@ hantro_reset_encoded_fmt(struct hantro_ctx *ctx)
|
|
hantro_reset_fmt(fmt, vpu_fmt);
|
|
fmt->width = vpu_fmt->frmsize.min_width;
|
|
fmt->height = vpu_fmt->frmsize.min_height;
|
|
- if (hantro_is_encoder_ctx(ctx))
|
|
+ if (ctx->is_encoder)
|
|
hantro_set_fmt_cap(ctx, fmt);
|
|
else
|
|
hantro_set_fmt_out(ctx, fmt);
|
|
@@ -355,7 +355,7 @@ hantro_reset_raw_fmt(struct hantro_ctx *ctx)
|
|
|
|
raw_vpu_fmt = hantro_get_default_fmt(ctx, false);
|
|
|
|
- if (hantro_is_encoder_ctx(ctx)) {
|
|
+ if (ctx->is_encoder) {
|
|
ctx->vpu_src_fmt = raw_vpu_fmt;
|
|
raw_fmt = &ctx->src_fmt;
|
|
encoded_fmt = &ctx->dst_fmt;
|
|
@@ -368,7 +368,7 @@ hantro_reset_raw_fmt(struct hantro_ctx *ctx)
|
|
hantro_reset_fmt(raw_fmt, raw_vpu_fmt);
|
|
raw_fmt->width = encoded_fmt->width;
|
|
raw_fmt->width = encoded_fmt->width;
|
|
- if (hantro_is_encoder_ctx(ctx))
|
|
+ if (ctx->is_encoder)
|
|
hantro_set_fmt_out(ctx, raw_fmt);
|
|
else
|
|
hantro_set_fmt_cap(ctx, raw_fmt);
|
|
@@ -409,7 +409,7 @@ static int hantro_set_fmt_out(struct hantro_ctx *ctx,
|
|
if (ret)
|
|
return ret;
|
|
|
|
- if (!hantro_is_encoder_ctx(ctx)) {
|
|
+ if (!ctx->is_encoder) {
|
|
struct vb2_queue *peer_vq;
|
|
|
|
/*
|
|
@@ -450,7 +450,7 @@ static int hantro_set_fmt_out(struct hantro_ctx *ctx,
|
|
* Note that hantro_reset_raw_fmt() also propagates size
|
|
* changes to the raw format.
|
|
*/
|
|
- if (!hantro_is_encoder_ctx(ctx))
|
|
+ if (!ctx->is_encoder)
|
|
hantro_reset_raw_fmt(ctx);
|
|
|
|
/* Colorimetry information are always propagated. */
|
|
@@ -479,7 +479,7 @@ static int hantro_set_fmt_cap(struct hantro_ctx *ctx,
|
|
if (vb2_is_busy(vq))
|
|
return -EBUSY;
|
|
|
|
- if (hantro_is_encoder_ctx(ctx)) {
|
|
+ if (ctx->is_encoder) {
|
|
struct vb2_queue *peer_vq;
|
|
|
|
/*
|
|
@@ -512,7 +512,7 @@ static int hantro_set_fmt_cap(struct hantro_ctx *ctx,
|
|
* Note that hantro_reset_raw_fmt() also propagates size
|
|
* changes to the raw format.
|
|
*/
|
|
- if (hantro_is_encoder_ctx(ctx))
|
|
+ if (ctx->is_encoder)
|
|
hantro_reset_raw_fmt(ctx);
|
|
|
|
/* Colorimetry information are always propagated. */
|
|
@@ -655,7 +655,7 @@ static bool hantro_vq_is_coded(struct vb2_queue *q)
|
|
{
|
|
struct hantro_ctx *ctx = vb2_get_drv_priv(q);
|
|
|
|
- return hantro_is_encoder_ctx(ctx) != V4L2_TYPE_IS_OUTPUT(q->type);
|
|
+ return ctx->is_encoder != V4L2_TYPE_IS_OUTPUT(q->type);
|
|
}
|
|
|
|
static int hantro_start_streaming(struct vb2_queue *q, unsigned int count)
|
|
|
|
From 9067e59021400f6924e6fe593585bb6a561ef251 Mon Sep 17 00:00:00 2001
|
|
From: Ezequiel Garcia <ezequiel@collabora.com>
|
|
Date: Wed, 1 Jul 2020 15:16:05 +0200
|
|
Subject: [PATCH] hantro: Move hantro_enc_buf_finish to JPEG codec_ops.done
|
|
|
|
hantro_enc_buf_finish is used only for JPEG, and so should
|
|
be moved to JPEG codec_ops.done.
|
|
|
|
This cleanup is also taking care of addressing
|
|
a subtle issue: checking the non-NULL bounce buffer
|
|
using ctx->jpeg_enc, which is a member of a union is
|
|
confusing and error-prone.
|
|
|
|
Note that the issue is currently innocuous because an
|
|
encoder context only supports JPEG.
|
|
|
|
The codec_ops.done has an argument that codec-specific code
|
|
shouldn't need, so drop that as well.
|
|
|
|
Signed-off-by: Ezequiel Garcia <ezequiel@collabora.com>
|
|
Reviewed-by: Philipp Zabel <p.zabel@pengutronix.de>
|
|
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
|
|
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
|
|
(cherry picked from commit e765dba11ec26d7ea42974ec4d470b5ce00be3de)
|
|
---
|
|
drivers/staging/media/hantro/hantro.h | 7 ----
|
|
drivers/staging/media/hantro/hantro_drv.c | 37 ++-----------------
|
|
.../staging/media/hantro/hantro_h1_jpeg_enc.c | 17 +++++++++
|
|
drivers/staging/media/hantro/hantro_hw.h | 3 +-
|
|
drivers/staging/media/hantro/rk3288_vpu_hw.c | 1 +
|
|
5 files changed, 24 insertions(+), 41 deletions(-)
|
|
|
|
diff --git a/drivers/staging/media/hantro/hantro.h b/drivers/staging/media/hantro/hantro.h
|
|
index 2284e23d8500..65f9f7ea7dcf 100644
|
|
--- a/drivers/staging/media/hantro/hantro.h
|
|
+++ b/drivers/staging/media/hantro/hantro.h
|
|
@@ -212,9 +212,6 @@ struct hantro_dev {
|
|
* @ctrl_handler: Control handler used to register controls.
|
|
* @jpeg_quality: User-specified JPEG compression quality.
|
|
*
|
|
- * @buf_finish: Buffer finish. This depends on encoder or decoder
|
|
- * context, and it's called right before
|
|
- * calling v4l2_m2m_job_finish.
|
|
* @codec_ops: Set of operations related to codec mode.
|
|
* @postproc: Post-processing context.
|
|
* @jpeg_enc: JPEG-encoding context.
|
|
@@ -237,10 +234,6 @@ struct hantro_ctx {
|
|
struct v4l2_ctrl_handler ctrl_handler;
|
|
int jpeg_quality;
|
|
|
|
- int (*buf_finish)(struct hantro_ctx *ctx,
|
|
- struct vb2_buffer *buf,
|
|
- unsigned int bytesused);
|
|
-
|
|
const struct hantro_codec_ops *codec_ops;
|
|
struct hantro_postproc_ctx postproc;
|
|
|
|
diff --git a/drivers/staging/media/hantro/hantro_drv.c b/drivers/staging/media/hantro/hantro_drv.c
|
|
index 9145d02e5d3c..88b5c5989d83 100644
|
|
--- a/drivers/staging/media/hantro/hantro_drv.c
|
|
+++ b/drivers/staging/media/hantro/hantro_drv.c
|
|
@@ -56,37 +56,12 @@ dma_addr_t hantro_get_ref(struct hantro_ctx *ctx, u64 ts)
|
|
return hantro_get_dec_buf_addr(ctx, buf);
|
|
}
|
|
|
|
-static int
|
|
-hantro_enc_buf_finish(struct hantro_ctx *ctx, struct vb2_buffer *buf,
|
|
- unsigned int bytesused)
|
|
-{
|
|
- size_t avail_size;
|
|
-
|
|
- avail_size = vb2_plane_size(buf, 0) - ctx->vpu_dst_fmt->header_size;
|
|
- if (bytesused > avail_size)
|
|
- return -EINVAL;
|
|
- /*
|
|
- * The bounce buffer is only for the JPEG encoder.
|
|
- * TODO: Rework the JPEG encoder to eliminate the need
|
|
- * for a bounce buffer.
|
|
- */
|
|
- if (ctx->jpeg_enc.bounce_buffer.cpu) {
|
|
- memcpy(vb2_plane_vaddr(buf, 0) +
|
|
- ctx->vpu_dst_fmt->header_size,
|
|
- ctx->jpeg_enc.bounce_buffer.cpu, bytesused);
|
|
- }
|
|
- buf->planes[0].bytesused =
|
|
- ctx->vpu_dst_fmt->header_size + bytesused;
|
|
- return 0;
|
|
-}
|
|
-
|
|
static void hantro_job_finish(struct hantro_dev *vpu,
|
|
struct hantro_ctx *ctx,
|
|
unsigned int bytesused,
|
|
enum vb2_buffer_state result)
|
|
{
|
|
struct vb2_v4l2_buffer *src, *dst;
|
|
- int ret;
|
|
|
|
pm_runtime_mark_last_busy(vpu->dev);
|
|
pm_runtime_put_autosuspend(vpu->dev);
|
|
@@ -103,12 +78,6 @@ static void hantro_job_finish(struct hantro_dev *vpu,
|
|
src->sequence = ctx->sequence_out++;
|
|
dst->sequence = ctx->sequence_cap++;
|
|
|
|
- if (ctx->buf_finish) {
|
|
- ret = ctx->buf_finish(ctx, &dst->vb2_buf, bytesused);
|
|
- if (ret)
|
|
- result = VB2_BUF_STATE_ERROR;
|
|
- }
|
|
-
|
|
v4l2_m2m_buf_done_and_job_finish(ctx->dev->m2m_dev, ctx->fh.m2m_ctx,
|
|
result);
|
|
}
|
|
@@ -124,8 +93,11 @@ void hantro_irq_done(struct hantro_dev *vpu, unsigned int bytesused,
|
|
* the timeout expired. The watchdog is running,
|
|
* and will take care of finishing the job.
|
|
*/
|
|
- if (cancel_delayed_work(&vpu->watchdog_work))
|
|
+ if (cancel_delayed_work(&vpu->watchdog_work)) {
|
|
+ if (result == VB2_BUF_STATE_DONE && ctx->codec_ops->done)
|
|
+ ctx->codec_ops->done(ctx);
|
|
hantro_job_finish(vpu, ctx, bytesused, result);
|
|
+ }
|
|
}
|
|
|
|
void hantro_watchdog(struct work_struct *work)
|
|
@@ -414,7 +386,6 @@ static int hantro_open(struct file *filp)
|
|
ctx->dev = vpu;
|
|
if (func->id == MEDIA_ENT_F_PROC_VIDEO_ENCODER) {
|
|
allowed_codecs = vpu->variant->codec & HANTRO_ENCODERS;
|
|
- ctx->buf_finish = hantro_enc_buf_finish;
|
|
ctx->is_encoder = true;
|
|
} else if (func->id == MEDIA_ENT_F_PROC_VIDEO_DECODER) {
|
|
allowed_codecs = vpu->variant->codec & HANTRO_DECODERS;
|
|
diff --git a/drivers/staging/media/hantro/hantro_h1_jpeg_enc.c b/drivers/staging/media/hantro/hantro_h1_jpeg_enc.c
|
|
index b22418436823..b88dc4ed06db 100644
|
|
--- a/drivers/staging/media/hantro/hantro_h1_jpeg_enc.c
|
|
+++ b/drivers/staging/media/hantro/hantro_h1_jpeg_enc.c
|
|
@@ -137,3 +137,20 @@ void hantro_h1_jpeg_enc_run(struct hantro_ctx *ctx)
|
|
|
|
vepu_write(vpu, reg, H1_REG_ENC_CTRL);
|
|
}
|
|
+
|
|
+void hantro_jpeg_enc_done(struct hantro_ctx *ctx)
|
|
+{
|
|
+ struct hantro_dev *vpu = ctx->dev;
|
|
+ u32 bytesused = vepu_read(vpu, H1_REG_STR_BUF_LIMIT) / 8;
|
|
+ struct vb2_v4l2_buffer *dst_buf = hantro_get_dst_buf(ctx);
|
|
+
|
|
+ /*
|
|
+ * TODO: Rework the JPEG encoder to eliminate the need
|
|
+ * for a bounce buffer.
|
|
+ */
|
|
+ memcpy(vb2_plane_vaddr(&dst_buf->vb2_buf, 0) +
|
|
+ ctx->vpu_dst_fmt->header_size,
|
|
+ ctx->jpeg_enc.bounce_buffer.cpu, bytesused);
|
|
+ vb2_set_plane_payload(&dst_buf->vb2_buf, 0,
|
|
+ ctx->vpu_dst_fmt->header_size + bytesused);
|
|
+}
|
|
diff --git a/drivers/staging/media/hantro/hantro_hw.h b/drivers/staging/media/hantro/hantro_hw.h
|
|
index 4053d8710e04..2d6323cd6732 100644
|
|
--- a/drivers/staging/media/hantro/hantro_hw.h
|
|
+++ b/drivers/staging/media/hantro/hantro_hw.h
|
|
@@ -138,7 +138,7 @@ struct hantro_codec_ops {
|
|
int (*init)(struct hantro_ctx *ctx);
|
|
void (*exit)(struct hantro_ctx *ctx);
|
|
void (*run)(struct hantro_ctx *ctx);
|
|
- void (*done)(struct hantro_ctx *ctx, enum vb2_buffer_state);
|
|
+ void (*done)(struct hantro_ctx *ctx);
|
|
void (*reset)(struct hantro_ctx *ctx);
|
|
};
|
|
|
|
@@ -172,6 +172,7 @@ void hantro_h1_jpeg_enc_run(struct hantro_ctx *ctx);
|
|
void rk3399_vpu_jpeg_enc_run(struct hantro_ctx *ctx);
|
|
int hantro_jpeg_enc_init(struct hantro_ctx *ctx);
|
|
void hantro_jpeg_enc_exit(struct hantro_ctx *ctx);
|
|
+void hantro_jpeg_enc_done(struct hantro_ctx *ctx);
|
|
|
|
dma_addr_t hantro_h264_get_ref_buf(struct hantro_ctx *ctx,
|
|
unsigned int dpb_idx);
|
|
diff --git a/drivers/staging/media/hantro/rk3288_vpu_hw.c b/drivers/staging/media/hantro/rk3288_vpu_hw.c
|
|
index 2f914b37b9e5..b1cf2abb972f 100644
|
|
--- a/drivers/staging/media/hantro/rk3288_vpu_hw.c
|
|
+++ b/drivers/staging/media/hantro/rk3288_vpu_hw.c
|
|
@@ -180,6 +180,7 @@ static const struct hantro_codec_ops rk3288_vpu_codec_ops[] = {
|
|
.run = hantro_h1_jpeg_enc_run,
|
|
.reset = rk3288_vpu_enc_reset,
|
|
.init = hantro_jpeg_enc_init,
|
|
+ .done = hantro_jpeg_enc_done,
|
|
.exit = hantro_jpeg_enc_exit,
|
|
},
|
|
[HANTRO_MODE_H264_DEC] = {
|
|
|
|
From 7d3bf1fa2170bacf99bd02ccd7dc0f5fdc1fbc45 Mon Sep 17 00:00:00 2001
|
|
From: Ezequiel Garcia <ezequiel@collabora.com>
|
|
Date: Wed, 1 Jul 2020 15:16:06 +0200
|
|
Subject: [PATCH] hantro: Remove unused bytesused argument
|
|
|
|
The driver doesn't need the bytesused argument.
|
|
|
|
For decoders, the plane bytesused is known and therefore,
|
|
buf_prepare is used to set it. For encoders, it's
|
|
handled by the codec_ops.done hook.
|
|
|
|
Signed-off-by: Ezequiel Garcia <ezequiel@collabora.com>
|
|
Reviewed-by: Philipp Zabel <p.zabel@pengutronix.de>
|
|
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
|
|
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
|
|
(cherry picked from commit b72a6342dd240ce8e15b7acf1c38c67a0c56092b)
|
|
---
|
|
drivers/staging/media/hantro/hantro_drv.c | 9 ++++-----
|
|
drivers/staging/media/hantro/hantro_hw.h | 2 +-
|
|
drivers/staging/media/hantro/imx8m_vpu_hw.c | 2 +-
|
|
drivers/staging/media/hantro/rk3288_vpu_hw.c | 7 +++----
|
|
drivers/staging/media/hantro/rk3399_vpu_hw.c | 7 +++----
|
|
5 files changed, 12 insertions(+), 15 deletions(-)
|
|
|
|
diff --git a/drivers/staging/media/hantro/hantro_drv.c b/drivers/staging/media/hantro/hantro_drv.c
|
|
index 88b5c5989d83..34367b169011 100644
|
|
--- a/drivers/staging/media/hantro/hantro_drv.c
|
|
+++ b/drivers/staging/media/hantro/hantro_drv.c
|
|
@@ -58,7 +58,6 @@ dma_addr_t hantro_get_ref(struct hantro_ctx *ctx, u64 ts)
|
|
|
|
static void hantro_job_finish(struct hantro_dev *vpu,
|
|
struct hantro_ctx *ctx,
|
|
- unsigned int bytesused,
|
|
enum vb2_buffer_state result)
|
|
{
|
|
struct vb2_v4l2_buffer *src, *dst;
|
|
@@ -82,7 +81,7 @@ static void hantro_job_finish(struct hantro_dev *vpu,
|
|
result);
|
|
}
|
|
|
|
-void hantro_irq_done(struct hantro_dev *vpu, unsigned int bytesused,
|
|
+void hantro_irq_done(struct hantro_dev *vpu,
|
|
enum vb2_buffer_state result)
|
|
{
|
|
struct hantro_ctx *ctx =
|
|
@@ -96,7 +95,7 @@ void hantro_irq_done(struct hantro_dev *vpu, unsigned int bytesused,
|
|
if (cancel_delayed_work(&vpu->watchdog_work)) {
|
|
if (result == VB2_BUF_STATE_DONE && ctx->codec_ops->done)
|
|
ctx->codec_ops->done(ctx);
|
|
- hantro_job_finish(vpu, ctx, bytesused, result);
|
|
+ hantro_job_finish(vpu, ctx, result);
|
|
}
|
|
}
|
|
|
|
@@ -111,7 +110,7 @@ void hantro_watchdog(struct work_struct *work)
|
|
if (ctx) {
|
|
vpu_err("frame processing timed out!\n");
|
|
ctx->codec_ops->reset(ctx);
|
|
- hantro_job_finish(vpu, ctx, 0, VB2_BUF_STATE_ERROR);
|
|
+ hantro_job_finish(vpu, ctx, VB2_BUF_STATE_ERROR);
|
|
}
|
|
}
|
|
|
|
@@ -164,7 +163,7 @@ static void device_run(void *priv)
|
|
return;
|
|
|
|
err_cancel_job:
|
|
- hantro_job_finish(ctx->dev, ctx, 0, VB2_BUF_STATE_ERROR);
|
|
+ hantro_job_finish(ctx->dev, ctx, VB2_BUF_STATE_ERROR);
|
|
}
|
|
|
|
static struct v4l2_m2m_ops vpu_m2m_ops = {
|
|
diff --git a/drivers/staging/media/hantro/hantro_hw.h b/drivers/staging/media/hantro/hantro_hw.h
|
|
index 2d6323cd6732..f066de6b592d 100644
|
|
--- a/drivers/staging/media/hantro/hantro_hw.h
|
|
+++ b/drivers/staging/media/hantro/hantro_hw.h
|
|
@@ -163,7 +163,7 @@ extern const u32 hantro_vp8_dec_mc_filter[8][6];
|
|
|
|
void hantro_watchdog(struct work_struct *work);
|
|
void hantro_run(struct hantro_ctx *ctx);
|
|
-void hantro_irq_done(struct hantro_dev *vpu, unsigned int bytesused,
|
|
+void hantro_irq_done(struct hantro_dev *vpu,
|
|
enum vb2_buffer_state result);
|
|
void hantro_start_prepare_run(struct hantro_ctx *ctx);
|
|
void hantro_end_prepare_run(struct hantro_ctx *ctx);
|
|
diff --git a/drivers/staging/media/hantro/imx8m_vpu_hw.c b/drivers/staging/media/hantro/imx8m_vpu_hw.c
|
|
index cb2420c5526e..c222de075ef4 100644
|
|
--- a/drivers/staging/media/hantro/imx8m_vpu_hw.c
|
|
+++ b/drivers/staging/media/hantro/imx8m_vpu_hw.c
|
|
@@ -143,7 +143,7 @@ static irqreturn_t imx8m_vpu_g1_irq(int irq, void *dev_id)
|
|
vdpu_write(vpu, 0, G1_REG_INTERRUPT);
|
|
vdpu_write(vpu, G1_REG_CONFIG_DEC_CLK_GATE_E, G1_REG_CONFIG);
|
|
|
|
- hantro_irq_done(vpu, 0, state);
|
|
+ hantro_irq_done(vpu, state);
|
|
|
|
return IRQ_HANDLED;
|
|
}
|
|
diff --git a/drivers/staging/media/hantro/rk3288_vpu_hw.c b/drivers/staging/media/hantro/rk3288_vpu_hw.c
|
|
index b1cf2abb972f..7b299ee3e93d 100644
|
|
--- a/drivers/staging/media/hantro/rk3288_vpu_hw.c
|
|
+++ b/drivers/staging/media/hantro/rk3288_vpu_hw.c
|
|
@@ -113,17 +113,16 @@ static irqreturn_t rk3288_vepu_irq(int irq, void *dev_id)
|
|
{
|
|
struct hantro_dev *vpu = dev_id;
|
|
enum vb2_buffer_state state;
|
|
- u32 status, bytesused;
|
|
+ u32 status;
|
|
|
|
status = vepu_read(vpu, H1_REG_INTERRUPT);
|
|
- bytesused = vepu_read(vpu, H1_REG_STR_BUF_LIMIT) / 8;
|
|
state = (status & H1_REG_INTERRUPT_FRAME_RDY) ?
|
|
VB2_BUF_STATE_DONE : VB2_BUF_STATE_ERROR;
|
|
|
|
vepu_write(vpu, 0, H1_REG_INTERRUPT);
|
|
vepu_write(vpu, 0, H1_REG_AXI_CTRL);
|
|
|
|
- hantro_irq_done(vpu, bytesused, state);
|
|
+ hantro_irq_done(vpu, state);
|
|
|
|
return IRQ_HANDLED;
|
|
}
|
|
@@ -141,7 +140,7 @@ static irqreturn_t rk3288_vdpu_irq(int irq, void *dev_id)
|
|
vdpu_write(vpu, 0, G1_REG_INTERRUPT);
|
|
vdpu_write(vpu, G1_REG_CONFIG_DEC_CLK_GATE_E, G1_REG_CONFIG);
|
|
|
|
- hantro_irq_done(vpu, 0, state);
|
|
+ hantro_irq_done(vpu, state);
|
|
|
|
return IRQ_HANDLED;
|
|
}
|
|
diff --git a/drivers/staging/media/hantro/rk3399_vpu_hw.c b/drivers/staging/media/hantro/rk3399_vpu_hw.c
|
|
index 9ac1f2cb6a16..7a7962cf771e 100644
|
|
--- a/drivers/staging/media/hantro/rk3399_vpu_hw.c
|
|
+++ b/drivers/staging/media/hantro/rk3399_vpu_hw.c
|
|
@@ -92,17 +92,16 @@ static irqreturn_t rk3399_vepu_irq(int irq, void *dev_id)
|
|
{
|
|
struct hantro_dev *vpu = dev_id;
|
|
enum vb2_buffer_state state;
|
|
- u32 status, bytesused;
|
|
+ u32 status;
|
|
|
|
status = vepu_read(vpu, VEPU_REG_INTERRUPT);
|
|
- bytesused = vepu_read(vpu, VEPU_REG_STR_BUF_LIMIT) / 8;
|
|
state = (status & VEPU_REG_INTERRUPT_FRAME_READY) ?
|
|
VB2_BUF_STATE_DONE : VB2_BUF_STATE_ERROR;
|
|
|
|
vepu_write(vpu, 0, VEPU_REG_INTERRUPT);
|
|
vepu_write(vpu, 0, VEPU_REG_AXI_CTRL);
|
|
|
|
- hantro_irq_done(vpu, bytesused, state);
|
|
+ hantro_irq_done(vpu, state);
|
|
|
|
return IRQ_HANDLED;
|
|
}
|
|
@@ -120,7 +119,7 @@ static irqreturn_t rk3399_vdpu_irq(int irq, void *dev_id)
|
|
vdpu_write(vpu, 0, VDPU_REG_INTERRUPT);
|
|
vdpu_write(vpu, 0, VDPU_REG_AXI_CTRL);
|
|
|
|
- hantro_irq_done(vpu, 0, state);
|
|
+ hantro_irq_done(vpu, state);
|
|
|
|
return IRQ_HANDLED;
|
|
}
|
|
|
|
From 7e6a3bfc6d6ac30204d5ad0fc6496f1c263f809b Mon Sep 17 00:00:00 2001
|
|
From: Ezequiel Garcia <ezequiel@collabora.com>
|
|
Date: Wed, 1 Jul 2020 15:16:07 +0200
|
|
Subject: [PATCH] hantro: Make sure we don't use post-processor on an encoder
|
|
|
|
Commit 986eee3a5234 ("media: hantro: Prevent encoders from using
|
|
post-processing") fixed hantro_needs_postproc condition,
|
|
but missed one case. Encoders don't have any post-processor
|
|
hardware block, so also can't be disabled.
|
|
|
|
Fix it.
|
|
|
|
Fixes: 986eee3a5234 ("media: hantro: Prevent encoders from using post-processing")
|
|
Signed-off-by: Ezequiel Garcia <ezequiel@collabora.com>
|
|
Reviewed-by: Philipp Zabel <p.zabel@pengutronix.de>
|
|
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
|
|
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
|
|
(cherry picked from commit 46d7aaebbe441d5381e35d8e16df784690e65ef3)
|
|
---
|
|
drivers/staging/media/hantro/hantro_drv.c | 10 ++++++----
|
|
1 file changed, 6 insertions(+), 4 deletions(-)
|
|
|
|
diff --git a/drivers/staging/media/hantro/hantro_drv.c b/drivers/staging/media/hantro/hantro_drv.c
|
|
index 34367b169011..d32b6b1ab70b 100644
|
|
--- a/drivers/staging/media/hantro/hantro_drv.c
|
|
+++ b/drivers/staging/media/hantro/hantro_drv.c
|
|
@@ -122,10 +122,12 @@ void hantro_start_prepare_run(struct hantro_ctx *ctx)
|
|
v4l2_ctrl_request_setup(src_buf->vb2_buf.req_obj.req,
|
|
&ctx->ctrl_handler);
|
|
|
|
- if (hantro_needs_postproc(ctx, ctx->vpu_dst_fmt))
|
|
- hantro_postproc_enable(ctx);
|
|
- else
|
|
- hantro_postproc_disable(ctx);
|
|
+ if (!ctx->is_encoder) {
|
|
+ if (hantro_needs_postproc(ctx, ctx->vpu_dst_fmt))
|
|
+ hantro_postproc_enable(ctx);
|
|
+ else
|
|
+ hantro_postproc_disable(ctx);
|
|
+ }
|
|
}
|
|
|
|
void hantro_end_prepare_run(struct hantro_ctx *ctx)
|
|
|
|
From 1f833bbde61660aabc0320b314bab5a2f7e42d10 Mon Sep 17 00:00:00 2001
|
|
From: Ezequiel Garcia <ezequiel@collabora.com>
|
|
Date: Thu, 9 Jul 2020 18:36:34 +0200
|
|
Subject: [PATCH] rkvdec: h264: Refuse to decode unsupported bitstream
|
|
|
|
The hardware only supports 4:2:2, 4:2:0 or 4:0:0 (monochrome),
|
|
8-bit or 10-bit depth content.
|
|
|
|
Verify that the SPS refers to a supported bitstream, and refuse
|
|
unsupported bitstreams by failing at TRY_EXT_CTRLS time.
|
|
|
|
The driver is currently broken on 10-bit and 4:2:2
|
|
so disallow those as well.
|
|
|
|
Signed-off-by: Ezequiel Garcia <ezequiel@collabora.com>
|
|
Reviewed-by: Jonas Karlman <jonas@kwiboo.se>
|
|
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
|
|
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
|
|
(cherry picked from commit 9363aa33f6a9acfd16f98c749f17f6c65d184670)
|
|
---
|
|
drivers/staging/media/rkvdec/rkvdec.c | 27 +++++++++++++++++++++++++++
|
|
1 file changed, 27 insertions(+)
|
|
|
|
diff --git a/drivers/staging/media/rkvdec/rkvdec.c b/drivers/staging/media/rkvdec/rkvdec.c
|
|
index fd68671f0286..c8151328fb70 100644
|
|
--- a/drivers/staging/media/rkvdec/rkvdec.c
|
|
+++ b/drivers/staging/media/rkvdec/rkvdec.c
|
|
@@ -27,6 +27,32 @@
|
|
#include "rkvdec.h"
|
|
#include "rkvdec-regs.h"
|
|
|
|
+static int rkvdec_try_ctrl(struct v4l2_ctrl *ctrl)
|
|
+{
|
|
+ if (ctrl->id == V4L2_CID_MPEG_VIDEO_H264_SPS) {
|
|
+ const struct v4l2_ctrl_h264_sps *sps = ctrl->p_new.p_h264_sps;
|
|
+ /*
|
|
+ * TODO: The hardware supports 10-bit and 4:2:2 profiles,
|
|
+ * but it's currently broken in the driver.
|
|
+ * Reject them for now, until it's fixed.
|
|
+ */
|
|
+ if (sps->chroma_format_idc > 1)
|
|
+ /* Only 4:0:0 and 4:2:0 are supported */
|
|
+ return -EINVAL;
|
|
+ if (sps->bit_depth_luma_minus8 != sps->bit_depth_chroma_minus8)
|
|
+ /* Luma and chroma bit depth mismatch */
|
|
+ return -EINVAL;
|
|
+ if (sps->bit_depth_luma_minus8 != 0)
|
|
+ /* Only 8-bit is supported */
|
|
+ return -EINVAL;
|
|
+ }
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+static const struct v4l2_ctrl_ops rkvdec_ctrl_ops = {
|
|
+ .try_ctrl = rkvdec_try_ctrl,
|
|
+};
|
|
+
|
|
static const struct rkvdec_ctrl_desc rkvdec_h264_ctrl_descs[] = {
|
|
{
|
|
.per_request = true,
|
|
@@ -42,6 +68,7 @@ static const struct rkvdec_ctrl_desc rkvdec_h264_ctrl_descs[] = {
|
|
.per_request = true,
|
|
.mandatory = true,
|
|
.cfg.id = V4L2_CID_MPEG_VIDEO_H264_SPS,
|
|
+ .cfg.ops = &rkvdec_ctrl_ops,
|
|
},
|
|
{
|
|
.per_request = true,
|
|
|
|
From c09155eb49e230da5fa16f188677120f967bbb36 Mon Sep 17 00:00:00 2001
|
|
From: Ezequiel Garcia <ezequiel@collabora.com>
|
|
Date: Thu, 9 Jul 2020 18:36:35 +0200
|
|
Subject: [PATCH] hantro: h264: Refuse to decode unsupported bitstream
|
|
|
|
The hardware only supports 4:2:0 or 4:0:0 (monochrome),
|
|
8-bit depth content.
|
|
|
|
Verify that the SPS refers to a supported bitstream, and refuse
|
|
unsupported bitstreams by failing at TRY_EXT_CTRLS time.
|
|
|
|
Given the JPEG compression level control is the only one
|
|
that needs setting, a specific ops is provided.
|
|
|
|
Signed-off-by: Ezequiel Garcia <ezequiel@collabora.com>
|
|
Reviewed-by: Philipp Zabel <p.zabel@pengutronix.de>
|
|
Reviewed-by: Jonas Karlman <jonas@kwiboo.se>
|
|
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
|
|
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
|
|
(cherry picked from commit d70cca7323442026e20c474314518c446cb4766f)
|
|
---
|
|
drivers/staging/media/hantro/hantro_drv.c | 29 ++++++++++++++++++++---
|
|
1 file changed, 26 insertions(+), 3 deletions(-)
|
|
|
|
diff --git a/drivers/staging/media/hantro/hantro_drv.c b/drivers/staging/media/hantro/hantro_drv.c
|
|
index d32b6b1ab70b..34797507f214 100644
|
|
--- a/drivers/staging/media/hantro/hantro_drv.c
|
|
+++ b/drivers/staging/media/hantro/hantro_drv.c
|
|
@@ -229,7 +229,25 @@ queue_init(void *priv, struct vb2_queue *src_vq, struct vb2_queue *dst_vq)
|
|
return vb2_queue_init(dst_vq);
|
|
}
|
|
|
|
-static int hantro_s_ctrl(struct v4l2_ctrl *ctrl)
|
|
+static int hantro_try_ctrl(struct v4l2_ctrl *ctrl)
|
|
+{
|
|
+ if (ctrl->id == V4L2_CID_MPEG_VIDEO_H264_SPS) {
|
|
+ const struct v4l2_ctrl_h264_sps *sps = ctrl->p_new.p_h264_sps;
|
|
+
|
|
+ if (sps->chroma_format_idc > 1)
|
|
+ /* Only 4:0:0 and 4:2:0 are supported */
|
|
+ return -EINVAL;
|
|
+ if (sps->bit_depth_luma_minus8 != sps->bit_depth_chroma_minus8)
|
|
+ /* Luma and chroma bit depth mismatch */
|
|
+ return -EINVAL;
|
|
+ if (sps->bit_depth_luma_minus8 != 0)
|
|
+ /* Only 8-bit is supported */
|
|
+ return -EINVAL;
|
|
+ }
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+static int hantro_jpeg_s_ctrl(struct v4l2_ctrl *ctrl)
|
|
{
|
|
struct hantro_ctx *ctx;
|
|
|
|
@@ -250,7 +268,11 @@ static int hantro_s_ctrl(struct v4l2_ctrl *ctrl)
|
|
}
|
|
|
|
static const struct v4l2_ctrl_ops hantro_ctrl_ops = {
|
|
- .s_ctrl = hantro_s_ctrl,
|
|
+ .try_ctrl = hantro_try_ctrl,
|
|
+};
|
|
+
|
|
+static const struct v4l2_ctrl_ops hantro_jpeg_ctrl_ops = {
|
|
+ .s_ctrl = hantro_jpeg_s_ctrl,
|
|
};
|
|
|
|
static const struct hantro_ctrl controls[] = {
|
|
@@ -262,7 +284,7 @@ static const struct hantro_ctrl controls[] = {
|
|
.max = 100,
|
|
.step = 1,
|
|
.def = 50,
|
|
- .ops = &hantro_ctrl_ops,
|
|
+ .ops = &hantro_jpeg_ctrl_ops,
|
|
},
|
|
}, {
|
|
.codec = HANTRO_MPEG2_DECODER,
|
|
@@ -293,6 +315,7 @@ static const struct hantro_ctrl controls[] = {
|
|
.codec = HANTRO_H264_DECODER,
|
|
.cfg = {
|
|
.id = V4L2_CID_MPEG_VIDEO_H264_SPS,
|
|
+ .ops = &hantro_ctrl_ops,
|
|
},
|
|
}, {
|
|
.codec = HANTRO_H264_DECODER,
|