[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20260113-iris_enc_roi-v1-3-6c86eba38587@oss.qualcomm.com>
Date: Tue, 13 Jan 2026 12:33:34 -0800
From: Deepa Guthyappa Madivalara <deepa.madivalara@....qualcomm.com>
To: Mauro Carvalho Chehab <mchehab@...nel.org>,
Vikash Garodia <vikash.garodia@....qualcomm.com>,
Dikshita Agarwal <dikshita.agarwal@....qualcomm.com>,
Abhinav Kumar <abhinav.kumar@...ux.dev>,
Bryan O'Donoghue <bod@...nel.org>
Cc: linux-media@...r.kernel.org, linux-kernel@...r.kernel.org,
linux-arm-msm@...r.kernel.org,
Deepa Guthyappa Madivalara <deepa.madivalara@....qualcomm.com>
Subject: [RFC PATCH 3/3] media: iris: Add ROI support framework for video
encoder
Add ROI support in the iris driver, including control structures
and default parameters. Extend support to set ROI parameters
using compound control V4L2_CTRL_TYPE_ENC_ROI_PARAMS.
Signed-off-by: Deepa Guthyappa Madivalara <deepa.madivalara@....qualcomm.com>
---
drivers/media/platform/qcom/iris/iris_ctrls.c | 54 +++++++++++++++++++++-
drivers/media/platform/qcom/iris/iris_ctrls.h | 1 +
.../platform/qcom/iris/iris_platform_common.h | 4 ++
.../media/platform/qcom/iris/iris_platform_gen2.c | 8 ++++
4 files changed, 66 insertions(+), 1 deletion(-)
diff --git a/drivers/media/platform/qcom/iris/iris_ctrls.c b/drivers/media/platform/qcom/iris/iris_ctrls.c
index c0b3a09ad3e3dfb0a47e3603a8089cf61390fda8..2d00df554a64829af550ed43267bf73b6a9c892e 100644
--- a/drivers/media/platform/qcom/iris/iris_ctrls.c
+++ b/drivers/media/platform/qcom/iris/iris_ctrls.c
@@ -98,6 +98,8 @@ static enum platform_inst_fw_cap_type iris_get_cap_id(u32 id)
return B_FRAME_QP_H264;
case V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_QP:
return B_FRAME_QP_HEVC;
+ case V4L2_CID_MPEG_VIDEO_ENC_ROI:
+ return ROI_PARAMS;
default:
return INST_FW_CAP_MAX;
}
@@ -185,6 +187,8 @@ static u32 iris_get_v4l2_id(enum platform_inst_fw_cap_type cap_id)
return V4L2_CID_MPEG_VIDEO_H264_B_FRAME_QP;
case B_FRAME_QP_HEVC:
return V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_QP;
+ case ROI_PARAMS:
+ return V4L2_CID_MPEG_VIDEO_ENC_ROI;
default:
return 0;
}
@@ -208,9 +212,14 @@ static int iris_op_s_ctrl(struct v4l2_ctrl *ctrl)
return -EINVAL;
cap[cap_id].flags |= CAP_FLAG_CLIENT_SET;
-
inst->fw_caps[cap_id].value = ctrl->val;
+ if (inst->fw_caps[cap_id].flags & CAP_FLAG_COMPOUND) {
+ if (cap_id == ROI_PARAMS)
+ inst->fw_caps[cap_id].p_def =
+ (const void *)ctrl->p_new.p_enc_roi_params;
+ }
+
if (vb2_is_streaming(q)) {
if (cap[cap_id].set)
cap[cap_id].set(inst, cap_id);
@@ -223,6 +232,21 @@ static const struct v4l2_ctrl_ops iris_ctrl_ops = {
.s_ctrl = iris_op_s_ctrl,
};
+static const struct v4l2_ctrl_enc_roi_params enc_roi_params = {
+ .num_roi_regions = 10,
+ .roi_params = {
+ [0 ... 9] = {
+ .roi_rect = {
+ .left = 0,
+ .top = 0,
+ .width = 0,
+ .height = 0,
+ },
+ .delta_qp = 0,
+ },
+ },
+};
+
int iris_ctrls_init(struct iris_inst *inst)
{
struct platform_inst_fw_cap *cap = &inst->fw_caps[0];
@@ -263,6 +287,22 @@ int iris_ctrls_init(struct iris_inst *inst)
cap[idx].max,
~(cap[idx].step_or_mask),
cap[idx].value);
+ } else if (cap[idx].flags & CAP_FLAG_COMPOUND) {
+ if (cap[idx].cap_id == ROI_PARAMS)
+ cap[idx].p_def = &enc_roi_params;
+
+ ctrl = v4l2_ctrl_new_std_compound(&inst->ctrl_handler,
+ &iris_ctrl_ops,
+ v4l2_id,
+ v4l2_ctrl_ptr_create
+ ((void *)
+ cap[idx].p_def),
+ v4l2_ctrl_ptr_create
+ ((void *)
+ NULL),
+ v4l2_ctrl_ptr_create
+ ((void *)
+ NULL));
} else {
ctrl = v4l2_ctrl_new_std(&inst->ctrl_handler,
&iris_ctrl_ops,
@@ -915,3 +955,15 @@ int iris_set_properties(struct iris_inst *inst, u32 plane)
return 0;
}
+
+int iris_set_roi_params(struct iris_inst *inst, u32 plane)
+{
+ const struct v4l2_ctrl_enc_roi_params *enc_roi_params;
+ enc_roi_params = inst->fw_caps[ROI_PARAMS].p_def;
+
+ /* Todo: Send HFI prop to firmware
+ * once support is available
+ */
+
+ return 0;
+}
diff --git a/drivers/media/platform/qcom/iris/iris_ctrls.h b/drivers/media/platform/qcom/iris/iris_ctrls.h
index 30af333cc4941e737eb1ae83a6944b4192896e23..92ceb9e412635f04787fe92a9e5c6ba03bb7332d 100644
--- a/drivers/media/platform/qcom/iris/iris_ctrls.h
+++ b/drivers/media/platform/qcom/iris/iris_ctrls.h
@@ -33,5 +33,6 @@ int iris_set_max_qp(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_i
int iris_set_frame_qp(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id);
int iris_set_qp_range(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id);
int iris_set_properties(struct iris_inst *inst, u32 plane);
+int iris_set_roi_params(struct iris_inst *inst, u32 plane);
#endif
diff --git a/drivers/media/platform/qcom/iris/iris_platform_common.h b/drivers/media/platform/qcom/iris/iris_platform_common.h
index 8d8cdb56a3c7722c06287d4d10feed14ba2b254c..6fcbdcb11db7785085de8f95b07f93f8a045c9ce 100644
--- a/drivers/media/platform/qcom/iris/iris_platform_common.h
+++ b/drivers/media/platform/qcom/iris/iris_platform_common.h
@@ -6,6 +6,7 @@
#ifndef __IRIS_PLATFORM_COMMON_H__
#define __IRIS_PLATFORM_COMMON_H__
+#include <media/v4l2-ctrls.h>
#include <linux/bits.h>
#include "iris_buffer.h"
@@ -143,6 +144,7 @@ enum platform_inst_fw_cap_type {
P_FRAME_QP_HEVC,
B_FRAME_QP_H264,
B_FRAME_QP_HEVC,
+ ROI_PARAMS,
INST_FW_CAP_MAX,
};
@@ -154,6 +156,7 @@ enum platform_inst_fw_cap_flags {
CAP_FLAG_CLIENT_SET = BIT(4),
CAP_FLAG_BITMASK = BIT(5),
CAP_FLAG_VOLATILE = BIT(6),
+ CAP_FLAG_COMPOUND = BIT(7),
};
struct platform_inst_fw_cap {
@@ -163,6 +166,7 @@ struct platform_inst_fw_cap {
s64 step_or_mask;
s64 value;
u32 hfi_id;
+ const void *p_def;
enum platform_inst_fw_cap_flags flags;
int (*set)(struct iris_inst *inst,
enum platform_inst_fw_cap_type cap_id);
diff --git a/drivers/media/platform/qcom/iris/iris_platform_gen2.c b/drivers/media/platform/qcom/iris/iris_platform_gen2.c
index c1989240c248601c34b84f508f1b72d72f81260a..eccfe5642d6803fd435787cadc83f878572dbdd5 100644
--- a/drivers/media/platform/qcom/iris/iris_platform_gen2.c
+++ b/drivers/media/platform/qcom/iris/iris_platform_gen2.c
@@ -586,6 +586,14 @@ static const struct platform_inst_fw_cap inst_fw_cap_sm8550_enc[] = {
.flags = CAP_FLAG_OUTPUT_PORT,
.set = iris_set_u32,
},
+ {
+ .cap_id = ROI_PARAMS,
+ .step_or_mask = 1,
+ .p_def = NULL,
+ .flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_COMPOUND |
+ CAP_FLAG_DYNAMIC_ALLOWED,
+ .set = iris_set_roi_params,
+ },
};
static struct platform_inst_caps platform_inst_cap_sm8550 = {
--
2.34.1
Powered by blists - more mailing lists