* [PATCH v1 1/4] media: qcom: iris: Add support for scale and improve format alignment
2025-10-15 9:27 [PATCH v1 0/4] media: qcom: iris: encoder feature enhancements Wangao Wang
@ 2025-10-15 9:27 ` Wangao Wang
2025-10-15 16:00 ` Bryan O'Donoghue
` (2 more replies)
2025-10-15 9:27 ` [PATCH v1 2/4] media: qcom: iris: Add rotation support for encoder Wangao Wang
` (3 subsequent siblings)
4 siblings, 3 replies; 14+ messages in thread
From: Wangao Wang @ 2025-10-15 9:27 UTC (permalink / raw)
To: vikash.garodia, dikshita.agarwal, abhinav.kumar, bod, mchehab
Cc: linux-media, linux-arm-msm, linux-kernel, quic_qiweil,
quic_renjiang, Wangao Wang
Add output width and height settings in iris_venc_s_fmt_output to
enable scaling functionality.
Add members enc_raw_width, enc_raw_height, enc_bitstream_width and
enc_bitstream_height to the struct iris_inst to support codec
alignment requirements.
HFI_PROP_CROP_OFFSETS is used to inform the firmware of the region
of interest, rather than indicating that the codec supports crop.
Therefore, the crop handling has been corrected accordingly.
Signed-off-by: Wangao Wang <wangao.wang@oss.qualcomm.com>
---
.../qcom/iris/iris_hfi_gen2_command.c | 18 ++++++++----
.../media/platform/qcom/iris/iris_instance.h | 8 ++++++
drivers/media/platform/qcom/iris/iris_venc.c | 28 ++++++++++++++++---
3 files changed, 44 insertions(+), 10 deletions(-)
diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c b/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c
index 4ce71a142508..c2258dfb2a8a 100644
--- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c
+++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c
@@ -168,9 +168,12 @@ static int iris_hfi_gen2_session_set_property(struct iris_inst *inst, u32 packet
static int iris_hfi_gen2_set_raw_resolution(struct iris_inst *inst, u32 plane)
{
- u32 resolution = inst->fmt_src->fmt.pix_mp.width << 16 |
- inst->fmt_src->fmt.pix_mp.height;
u32 port = iris_hfi_gen2_get_port(inst, plane);
+ u32 resolution, codec_align;
+
+ codec_align = inst->codec == V4L2_PIX_FMT_HEVC ? 32 : 16;
+ resolution = ALIGN(inst->enc_raw_width, codec_align) << 16 |
+ ALIGN(inst->enc_raw_height, codec_align);
return iris_hfi_gen2_session_set_property(inst,
HFI_PROP_RAW_RESOLUTION,
@@ -195,8 +198,8 @@ static int iris_hfi_gen2_set_bitstream_resolution(struct iris_inst *inst, u32 pl
payload_type = HFI_PAYLOAD_U32;
} else {
codec_align = inst->codec == V4L2_PIX_FMT_HEVC ? 32 : 16;
- resolution = ALIGN(inst->fmt_dst->fmt.pix_mp.width, codec_align) << 16 |
- ALIGN(inst->fmt_dst->fmt.pix_mp.height, codec_align);
+ resolution = ALIGN(inst->enc_bitstream_width, codec_align) << 16 |
+ ALIGN(inst->enc_bitstream_height, codec_align);
inst_hfi_gen2->dst_subcr_params.bitstream_resolution = resolution;
payload_type = HFI_PAYLOAD_32_PACKED;
}
@@ -216,8 +219,11 @@ static int iris_hfi_gen2_set_crop_offsets(struct iris_inst *inst, u32 plane)
u32 port = iris_hfi_gen2_get_port(inst, plane);
u32 bottom_offset, right_offset;
u32 left_offset, top_offset;
+ u32 codec_align;
u32 payload[2];
+ codec_align = inst->codec == V4L2_PIX_FMT_HEVC ? 32 : 16;
+
if (inst->domain == DECODER) {
if (V4L2_TYPE_IS_OUTPUT(plane)) {
bottom_offset = (inst->fmt_src->fmt.pix_mp.height - inst->crop.height);
@@ -231,8 +237,8 @@ static int iris_hfi_gen2_set_crop_offsets(struct iris_inst *inst, u32 plane)
top_offset = inst->compose.top;
}
} else {
- bottom_offset = (inst->fmt_src->fmt.pix_mp.height - inst->crop.height);
- right_offset = (inst->fmt_src->fmt.pix_mp.width - inst->crop.width);
+ bottom_offset = (ALIGN(inst->enc_raw_height, codec_align) - inst->enc_raw_height);
+ right_offset = (ALIGN(inst->enc_raw_width, codec_align) - inst->enc_raw_width);
left_offset = inst->crop.left;
top_offset = inst->crop.top;
}
diff --git a/drivers/media/platform/qcom/iris/iris_instance.h b/drivers/media/platform/qcom/iris/iris_instance.h
index 5982d7adefea..f371b1cbef47 100644
--- a/drivers/media/platform/qcom/iris/iris_instance.h
+++ b/drivers/media/platform/qcom/iris/iris_instance.h
@@ -64,6 +64,10 @@ struct iris_fmt {
* @frame_rate: frame rate of current instance
* @operating_rate: operating rate of current instance
* @hfi_rc_type: rate control type
+ * @enc_raw_width: raw image width for encoder instance
+ * @enc_raw_height: raw image height for encoder instance
+ * @enc_bitstream_width: bitstream width for encoder instance
+ * @enc_bitstream_height: bitstream height for encoder instance
*/
struct iris_inst {
@@ -102,6 +106,10 @@ struct iris_inst {
u32 frame_rate;
u32 operating_rate;
u32 hfi_rc_type;
+ u32 enc_raw_width;
+ u32 enc_raw_height;
+ u32 enc_bitstream_width;
+ u32 enc_bitstream_height;
};
#endif
diff --git a/drivers/media/platform/qcom/iris/iris_venc.c b/drivers/media/platform/qcom/iris/iris_venc.c
index 099bd5ed4ae0..25c05123dee4 100644
--- a/drivers/media/platform/qcom/iris/iris_venc.c
+++ b/drivers/media/platform/qcom/iris/iris_venc.c
@@ -68,6 +68,11 @@ int iris_venc_inst_init(struct iris_inst *inst)
inst->operating_rate = DEFAULT_FPS;
inst->frame_rate = DEFAULT_FPS;
+ inst->enc_raw_width = DEFAULT_WIDTH;
+ inst->enc_raw_height = DEFAULT_HEIGHT;
+ inst->enc_bitstream_width = DEFAULT_WIDTH;
+ inst->enc_bitstream_height = DEFAULT_HEIGHT;
+
memcpy(&inst->fw_caps[0], &core->inst_fw_caps_enc[0],
INST_FW_CAP_MAX * sizeof(struct platform_inst_fw_cap));
@@ -185,15 +190,27 @@ int iris_venc_try_fmt(struct iris_inst *inst, struct v4l2_format *f)
static int iris_venc_s_fmt_output(struct iris_inst *inst, struct v4l2_format *f)
{
+ const struct iris_fmt *venc_fmt;
struct v4l2_format *fmt;
+ u32 codec_align;
iris_venc_try_fmt(inst, f);
- if (!(find_format(inst, f->fmt.pix_mp.pixelformat, f->type)))
+ venc_fmt = find_format(inst, f->fmt.pix_mp.pixelformat, f->type);
+ if (!venc_fmt)
return -EINVAL;
+ codec_align = venc_fmt->pixfmt == V4L2_PIX_FMT_HEVC ? 32 : 16;
+
fmt = inst->fmt_dst;
fmt->type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;
+ if (f->fmt.pix_mp.width != fmt->fmt.pix_mp.width ||
+ f->fmt.pix_mp.height != fmt->fmt.pix_mp.height) {
+ fmt->fmt.pix_mp.width = ALIGN(f->fmt.pix_mp.width, codec_align);
+ fmt->fmt.pix_mp.height = ALIGN(f->fmt.pix_mp.height, codec_align);
+ inst->enc_bitstream_width = f->fmt.pix_mp.width;
+ inst->enc_bitstream_height = f->fmt.pix_mp.height;
+ }
fmt->fmt.pix_mp.num_planes = 1;
fmt->fmt.pix_mp.plane_fmt[0].bytesperline = 0;
fmt->fmt.pix_mp.plane_fmt[0].sizeimage = iris_get_buffer_size(inst, BUF_OUTPUT);
@@ -249,6 +266,11 @@ static int iris_venc_s_fmt_input(struct iris_inst *inst, struct v4l2_format *f)
inst->buffers[BUF_INPUT].min_count = iris_vpu_buf_count(inst, BUF_INPUT);
inst->buffers[BUF_INPUT].size = fmt->fmt.pix_mp.plane_fmt[0].sizeimage;
+ inst->enc_raw_width = f->fmt.pix_mp.width;
+ inst->enc_raw_height = f->fmt.pix_mp.height;
+ inst->enc_bitstream_width = f->fmt.pix_mp.width;
+ inst->enc_bitstream_height = f->fmt.pix_mp.height;
+
if (f->fmt.pix_mp.width != inst->crop.width ||
f->fmt.pix_mp.height != inst->crop.height) {
inst->crop.top = 0;
@@ -329,9 +351,7 @@ int iris_venc_s_selection(struct iris_inst *inst, struct v4l2_selection *s)
inst->crop.top = s->r.top;
inst->crop.width = s->r.width;
inst->crop.height = s->r.height;
- inst->fmt_dst->fmt.pix_mp.width = inst->crop.width;
- inst->fmt_dst->fmt.pix_mp.height = inst->crop.height;
- return iris_venc_s_fmt_output(inst, inst->fmt_dst);
+ return 0;
default:
return -EINVAL;
}
--
2.43.0
^ permalink raw reply related [flat|nested] 14+ messages in thread* Re: [PATCH v1 1/4] media: qcom: iris: Add support for scale and improve format alignment
2025-10-15 9:27 ` [PATCH v1 1/4] media: qcom: iris: Add support for scale and improve format alignment Wangao Wang
@ 2025-10-15 16:00 ` Bryan O'Donoghue
2025-10-17 5:43 ` Wangao Wang
2025-10-28 10:39 ` Vikash Garodia
2025-10-31 7:12 ` Dikshita Agarwal
2 siblings, 1 reply; 14+ messages in thread
From: Bryan O'Donoghue @ 2025-10-15 16:00 UTC (permalink / raw)
To: Wangao Wang, vikash.garodia, dikshita.agarwal, abhinav.kumar,
mchehab
Cc: linux-media, linux-arm-msm, linux-kernel, quic_qiweil,
quic_renjiang
On 15/10/2025 10:27, Wangao Wang wrote:
> Add output width and height settings in iris_venc_s_fmt_output to
> enable scaling functionality.
>
> Add members enc_raw_width, enc_raw_height, enc_bitstream_width and
> enc_bitstream_height to the struct iris_inst to support codec
> alignment requirements.
>
> HFI_PROP_CROP_OFFSETS is used to inform the firmware of the region
> of interest, rather than indicating that the codec supports crop.
> Therefore, the crop handling has been corrected accordingly.
>
> Signed-off-by: Wangao Wang <wangao.wang@oss.qualcomm.com>
Generally a patch that contains and "and" could be split into two patches.
Please do that here.
- One patch for your alignment changes
- One patch to support scaling
in whatever order is more logical.
---
bod
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v1 1/4] media: qcom: iris: Add support for scale and improve format alignment
2025-10-15 16:00 ` Bryan O'Donoghue
@ 2025-10-17 5:43 ` Wangao Wang
0 siblings, 0 replies; 14+ messages in thread
From: Wangao Wang @ 2025-10-17 5:43 UTC (permalink / raw)
To: Bryan O'Donoghue, vikash.garodia, dikshita.agarwal,
abhinav.kumar, mchehab
Cc: linux-media, linux-arm-msm, linux-kernel, quic_qiweil,
quic_renjiang
On 10/16/2025 12:00 AM, Bryan O'Donoghue wrote:
>
> Generally a patch that contains and "and" could be split into two patches.
>
> Please do that here.
>
> - One patch for your alignment changes
> - One patch to support scaling
>
> in whatever order is more logical.
Sure, will update in v2.
--
Best Regards,
Wangao
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v1 1/4] media: qcom: iris: Add support for scale and improve format alignment
2025-10-15 9:27 ` [PATCH v1 1/4] media: qcom: iris: Add support for scale and improve format alignment Wangao Wang
2025-10-15 16:00 ` Bryan O'Donoghue
@ 2025-10-28 10:39 ` Vikash Garodia
2025-10-31 7:12 ` Dikshita Agarwal
2 siblings, 0 replies; 14+ messages in thread
From: Vikash Garodia @ 2025-10-28 10:39 UTC (permalink / raw)
To: Wangao Wang, dikshita.agarwal, abhinav.kumar, bod, mchehab
Cc: linux-media, linux-arm-msm, linux-kernel, quic_qiweil,
quic_renjiang
On 10/15/2025 2:57 PM, Wangao Wang wrote:
> Add output width and height settings in iris_venc_s_fmt_output to
> enable scaling functionality.
>
> Add members enc_raw_width, enc_raw_height, enc_bitstream_width and
> enc_bitstream_height to the struct iris_inst to support codec
> alignment requirements.
>
> HFI_PROP_CROP_OFFSETS is used to inform the firmware of the region
> of interest, rather than indicating that the codec supports crop.
> Therefore, the crop handling has been corrected accordingly.
>
> Signed-off-by: Wangao Wang <wangao.wang@oss.qualcomm.com>
> ---
> .../qcom/iris/iris_hfi_gen2_command.c | 18 ++++++++----
> .../media/platform/qcom/iris/iris_instance.h | 8 ++++++
> drivers/media/platform/qcom/iris/iris_venc.c | 28 ++++++++++++++++---
> 3 files changed, 44 insertions(+), 10 deletions(-)
>
> diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c b/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c
> index 4ce71a142508..c2258dfb2a8a 100644
> --- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c
> +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c
> @@ -168,9 +168,12 @@ static int iris_hfi_gen2_session_set_property(struct iris_inst *inst, u32 packet
>
> static int iris_hfi_gen2_set_raw_resolution(struct iris_inst *inst, u32 plane)
> {
> - u32 resolution = inst->fmt_src->fmt.pix_mp.width << 16 |
> - inst->fmt_src->fmt.pix_mp.height;
> u32 port = iris_hfi_gen2_get_port(inst, plane);
> + u32 resolution, codec_align;
> +
> + codec_align = inst->codec == V4L2_PIX_FMT_HEVC ? 32 : 16;
> + resolution = ALIGN(inst->enc_raw_width, codec_align) << 16 |
> + ALIGN(inst->enc_raw_height, codec_align);
HFI_PROP_RAW_RESOLUTION interface expects actual YUV resolution. It is not
suppose to be aligned while configuring it to firmware.
>
> return iris_hfi_gen2_session_set_property(inst,
> HFI_PROP_RAW_RESOLUTION,
> @@ -195,8 +198,8 @@ static int iris_hfi_gen2_set_bitstream_resolution(struct iris_inst *inst, u32 pl
> payload_type = HFI_PAYLOAD_U32;
> } else {
> codec_align = inst->codec == V4L2_PIX_FMT_HEVC ? 32 : 16;
> - resolution = ALIGN(inst->fmt_dst->fmt.pix_mp.width, codec_align) << 16 |
> - ALIGN(inst->fmt_dst->fmt.pix_mp.height, codec_align);
> + resolution = ALIGN(inst->enc_bitstream_width, codec_align) << 16 |
> + ALIGN(inst->enc_bitstream_height, codec_align);
Do we really need *bitstream variable here ? What is the concern in using the
instance capture fmt height and width ?
> inst_hfi_gen2->dst_subcr_params.bitstream_resolution = resolution;
> payload_type = HFI_PAYLOAD_32_PACKED;
> }
> @@ -216,8 +219,11 @@ static int iris_hfi_gen2_set_crop_offsets(struct iris_inst *inst, u32 plane)
> u32 port = iris_hfi_gen2_get_port(inst, plane);
> u32 bottom_offset, right_offset;
> u32 left_offset, top_offset;
> + u32 codec_align;
> u32 payload[2];
>
> + codec_align = inst->codec == V4L2_PIX_FMT_HEVC ? 32 : 16;
> +
> if (inst->domain == DECODER) {
> if (V4L2_TYPE_IS_OUTPUT(plane)) {
> bottom_offset = (inst->fmt_src->fmt.pix_mp.height - inst->crop.height);
> @@ -231,8 +237,8 @@ static int iris_hfi_gen2_set_crop_offsets(struct iris_inst *inst, u32 plane)
> top_offset = inst->compose.top;
> }
> } else {
> - bottom_offset = (inst->fmt_src->fmt.pix_mp.height - inst->crop.height);
> - right_offset = (inst->fmt_src->fmt.pix_mp.width - inst->crop.width);
> + bottom_offset = (ALIGN(inst->enc_raw_height, codec_align) - inst->enc_raw_height);
> + right_offset = (ALIGN(inst->enc_raw_width, codec_align) - inst->enc_raw_width);
I would suggest as below:
S_FMT (output) -> Keep the driver fmt same as what client sets in s_fmt.
So crop setting here could be "inst->fmt_src->fmt.pix_mp.height - inst->crop.height"
without the need of additional variable ?
Could you fix s_fmt and other places and run through compliance/ffmpeg to see it
works well ?
Regards,
Vikash
^ permalink raw reply [flat|nested] 14+ messages in thread* Re: [PATCH v1 1/4] media: qcom: iris: Add support for scale and improve format alignment
2025-10-15 9:27 ` [PATCH v1 1/4] media: qcom: iris: Add support for scale and improve format alignment Wangao Wang
2025-10-15 16:00 ` Bryan O'Donoghue
2025-10-28 10:39 ` Vikash Garodia
@ 2025-10-31 7:12 ` Dikshita Agarwal
2 siblings, 0 replies; 14+ messages in thread
From: Dikshita Agarwal @ 2025-10-31 7:12 UTC (permalink / raw)
To: Wangao Wang, vikash.garodia, abhinav.kumar, bod, mchehab
Cc: linux-media, linux-arm-msm, linux-kernel, quic_qiweil,
quic_renjiang
On 10/15/2025 2:57 PM, Wangao Wang wrote:
> Add output width and height settings in iris_venc_s_fmt_output to
> enable scaling functionality.
>
> Add members enc_raw_width, enc_raw_height, enc_bitstream_width and
> enc_bitstream_height to the struct iris_inst to support codec
> alignment requirements.
>
> HFI_PROP_CROP_OFFSETS is used to inform the firmware of the region
> of interest, rather than indicating that the codec supports crop.
> Therefore, the crop handling has been corrected accordingly.
>
> Signed-off-by: Wangao Wang <wangao.wang@oss.qualcomm.com>
> ---
> .../qcom/iris/iris_hfi_gen2_command.c | 18 ++++++++----
> .../media/platform/qcom/iris/iris_instance.h | 8 ++++++
> drivers/media/platform/qcom/iris/iris_venc.c | 28 ++++++++++++++++---
> 3 files changed, 44 insertions(+), 10 deletions(-)
>
> diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c b/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c
> index 4ce71a142508..c2258dfb2a8a 100644
> --- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c
> +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c
> @@ -168,9 +168,12 @@ static int iris_hfi_gen2_session_set_property(struct iris_inst *inst, u32 packet
>
> static int iris_hfi_gen2_set_raw_resolution(struct iris_inst *inst, u32 plane)
> {
> - u32 resolution = inst->fmt_src->fmt.pix_mp.width << 16 |
> - inst->fmt_src->fmt.pix_mp.height;
> u32 port = iris_hfi_gen2_get_port(inst, plane);
> + u32 resolution, codec_align;
> +
> + codec_align = inst->codec == V4L2_PIX_FMT_HEVC ? 32 : 16;
> + resolution = ALIGN(inst->enc_raw_width, codec_align) << 16 |
> + ALIGN(inst->enc_raw_height, codec_align);
This shouldn't need to be aligned, pls check.
>
> return iris_hfi_gen2_session_set_property(inst,
> HFI_PROP_RAW_RESOLUTION,
> @@ -195,8 +198,8 @@ static int iris_hfi_gen2_set_bitstream_resolution(struct iris_inst *inst, u32 pl
> payload_type = HFI_PAYLOAD_U32;
> } else {
> codec_align = inst->codec == V4L2_PIX_FMT_HEVC ? 32 : 16;
> - resolution = ALIGN(inst->fmt_dst->fmt.pix_mp.width, codec_align) << 16 |
> - ALIGN(inst->fmt_dst->fmt.pix_mp.height, codec_align);
> + resolution = ALIGN(inst->enc_bitstream_width, codec_align) << 16 |
> + ALIGN(inst->enc_bitstream_height, codec_align);
> inst_hfi_gen2->dst_subcr_params.bitstream_resolution = resolution;
> payload_type = HFI_PAYLOAD_32_PACKED;
> }
> @@ -216,8 +219,11 @@ static int iris_hfi_gen2_set_crop_offsets(struct iris_inst *inst, u32 plane)
> u32 port = iris_hfi_gen2_get_port(inst, plane);
> u32 bottom_offset, right_offset;
> u32 left_offset, top_offset;
> + u32 codec_align;
> u32 payload[2];
>
> + codec_align = inst->codec == V4L2_PIX_FMT_HEVC ? 32 : 16;
> +
> if (inst->domain == DECODER) {
> if (V4L2_TYPE_IS_OUTPUT(plane)) {
> bottom_offset = (inst->fmt_src->fmt.pix_mp.height - inst->crop.height);
> @@ -231,8 +237,8 @@ static int iris_hfi_gen2_set_crop_offsets(struct iris_inst *inst, u32 plane)
> top_offset = inst->compose.top;
> }
> } else {
> - bottom_offset = (inst->fmt_src->fmt.pix_mp.height - inst->crop.height);
> - right_offset = (inst->fmt_src->fmt.pix_mp.width - inst->crop.width);
> + bottom_offset = (ALIGN(inst->enc_raw_height, codec_align) - inst->enc_raw_height);
> + right_offset = (ALIGN(inst->enc_raw_width, codec_align) - inst->enc_raw_width);
> left_offset = inst->crop.left;
> top_offset = inst->crop.top;
> }
> diff --git a/drivers/media/platform/qcom/iris/iris_instance.h b/drivers/media/platform/qcom/iris/iris_instance.h
> index 5982d7adefea..f371b1cbef47 100644
> --- a/drivers/media/platform/qcom/iris/iris_instance.h
> +++ b/drivers/media/platform/qcom/iris/iris_instance.h
> @@ -64,6 +64,10 @@ struct iris_fmt {
> * @frame_rate: frame rate of current instance
> * @operating_rate: operating rate of current instance
> * @hfi_rc_type: rate control type
> + * @enc_raw_width: raw image width for encoder instance
> + * @enc_raw_height: raw image height for encoder instance
> + * @enc_bitstream_width: bitstream width for encoder instance
> + * @enc_bitstream_height: bitstream height for encoder instance
> */
>
> struct iris_inst {
> @@ -102,6 +106,10 @@ struct iris_inst {
> u32 frame_rate;
> u32 operating_rate;
> u32 hfi_rc_type;
> + u32 enc_raw_width;
> + u32 enc_raw_height;
> + u32 enc_bitstream_width;
> + u32 enc_bitstream_height;
As enc_bitstream_with/height is used for scaling, rename them accordingly.
> };
>
> #endif
> diff --git a/drivers/media/platform/qcom/iris/iris_venc.c b/drivers/media/platform/qcom/iris/iris_venc.c
> index 099bd5ed4ae0..25c05123dee4 100644
> --- a/drivers/media/platform/qcom/iris/iris_venc.c
> +++ b/drivers/media/platform/qcom/iris/iris_venc.c
> @@ -68,6 +68,11 @@ int iris_venc_inst_init(struct iris_inst *inst)
> inst->operating_rate = DEFAULT_FPS;
> inst->frame_rate = DEFAULT_FPS;
>
> + inst->enc_raw_width = DEFAULT_WIDTH;
> + inst->enc_raw_height = DEFAULT_HEIGHT;
> + inst->enc_bitstream_width = DEFAULT_WIDTH;
> + inst->enc_bitstream_height = DEFAULT_HEIGHT;
> +
> memcpy(&inst->fw_caps[0], &core->inst_fw_caps_enc[0],
> INST_FW_CAP_MAX * sizeof(struct platform_inst_fw_cap));
>
> @@ -185,15 +190,27 @@ int iris_venc_try_fmt(struct iris_inst *inst, struct v4l2_format *f)
>
> static int iris_venc_s_fmt_output(struct iris_inst *inst, struct v4l2_format *f)
> {
> + const struct iris_fmt *venc_fmt;
> struct v4l2_format *fmt;
> + u32 codec_align;
>
> iris_venc_try_fmt(inst, f);
>
> - if (!(find_format(inst, f->fmt.pix_mp.pixelformat, f->type)))
> + venc_fmt = find_format(inst, f->fmt.pix_mp.pixelformat, f->type);
> + if (!venc_fmt)
> return -EINVAL;
>
> + codec_align = venc_fmt->pixfmt == V4L2_PIX_FMT_HEVC ? 32 : 16;
> +
> fmt = inst->fmt_dst;
> fmt->type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE;> + if (f->fmt.pix_mp.width != fmt->fmt.pix_mp.width ||
> + f->fmt.pix_mp.height != fmt->fmt.pix_mp.height) {
pls add a comment here, as this is for scaling specific usecase
> + fmt->fmt.pix_mp.width = ALIGN(f->fmt.pix_mp.width, codec_align);
> + fmt->fmt.pix_mp.height = ALIGN(f->fmt.pix_mp.height, codec_align);
> + inst->enc_bitstream_width = f->fmt.pix_mp.width;
> + inst->enc_bitstream_height = f->fmt.pix_mp.height;
> + }
> fmt->fmt.pix_mp.num_planes = 1;
> fmt->fmt.pix_mp.plane_fmt[0].bytesperline = 0;
> fmt->fmt.pix_mp.plane_fmt[0].sizeimage = iris_get_buffer_size(inst, BUF_OUTPUT);
> @@ -249,6 +266,11 @@ static int iris_venc_s_fmt_input(struct iris_inst *inst, struct v4l2_format *f)
> inst->buffers[BUF_INPUT].min_count = iris_vpu_buf_count(inst, BUF_INPUT);
> inst->buffers[BUF_INPUT].size = fmt->fmt.pix_mp.plane_fmt[0].sizeimage;
>
> + inst->enc_raw_width = f->fmt.pix_mp.width;
> + inst->enc_raw_height = f->fmt.pix_mp.height;
> + inst->enc_bitstream_width = f->fmt.pix_mp.width;
> + inst->enc_bitstream_height = f->fmt.pix_mp.height;
> +
> if (f->fmt.pix_mp.width != inst->crop.width ||
> f->fmt.pix_mp.height != inst->crop.height) {
> inst->crop.top = 0;
> @@ -329,9 +351,7 @@ int iris_venc_s_selection(struct iris_inst *inst, struct v4l2_selection *s)
> inst->crop.top = s->r.top;
> inst->crop.width = s->r.width;
> inst->crop.height = s->r.height;
> - inst->fmt_dst->fmt.pix_mp.width = inst->crop.width;
> - inst->fmt_dst->fmt.pix_mp.height = inst->crop.height;
> - return iris_venc_s_fmt_output(inst, inst->fmt_dst);
> + return 0;
> default:
> return -EINVAL;
> }
^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH v1 2/4] media: qcom: iris: Add rotation support for encoder
2025-10-15 9:27 [PATCH v1 0/4] media: qcom: iris: encoder feature enhancements Wangao Wang
2025-10-15 9:27 ` [PATCH v1 1/4] media: qcom: iris: Add support for scale and improve format alignment Wangao Wang
@ 2025-10-15 9:27 ` Wangao Wang
2025-10-15 16:08 ` Bryan O'Donoghue
2025-10-31 7:14 ` Dikshita Agarwal
2025-10-15 9:27 ` [PATCH v1 3/4] media: qcom: iris: Add flip " Wangao Wang
` (2 subsequent siblings)
4 siblings, 2 replies; 14+ messages in thread
From: Wangao Wang @ 2025-10-15 9:27 UTC (permalink / raw)
To: vikash.garodia, dikshita.agarwal, abhinav.kumar, bod, mchehab
Cc: linux-media, linux-arm-msm, linux-kernel, quic_qiweil,
quic_renjiang, Wangao Wang
Add rotation control for encoder, enabling V4L2_CID_ROTATE and handling
90/180/270 degree rotation.
Add VPSS buffer to platform data, which the rotate function requires.
Signed-off-by: Wangao Wang <wangao.wang@oss.qualcomm.com>
---
drivers/media/platform/qcom/iris/iris_ctrls.c | 34 ++++++++++++
drivers/media/platform/qcom/iris/iris_ctrls.h | 1 +
.../qcom/iris/iris_hfi_gen2_command.c | 12 ++++-
.../qcom/iris/iris_hfi_gen2_defines.h | 9 ++++
.../qcom/iris/iris_hfi_gen2_response.c | 2 +
.../platform/qcom/iris/iris_platform_common.h | 1 +
.../platform/qcom/iris/iris_platform_gen2.c | 20 +++++++
drivers/media/platform/qcom/iris/iris_utils.c | 6 +++
drivers/media/platform/qcom/iris/iris_utils.h | 1 +
.../platform/qcom/iris/iris_vpu_buffer.c | 52 +++++++++++--------
10 files changed, 114 insertions(+), 24 deletions(-)
diff --git a/drivers/media/platform/qcom/iris/iris_ctrls.c b/drivers/media/platform/qcom/iris/iris_ctrls.c
index 754a5ad718bc..00949c207ddb 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_ROTATE:
+ return ROTATION;
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 ROTATION:
+ return V4L2_CID_ROTATE;
default:
return 0;
}
@@ -883,6 +887,36 @@ int iris_set_qp_range(struct iris_inst *inst, enum platform_inst_fw_cap_type cap
&range, sizeof(range));
}
+int iris_set_rotation(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id)
+{
+ const struct iris_hfi_command_ops *hfi_ops = inst->core->hfi_ops;
+ u32 hfi_id = inst->fw_caps[cap_id].hfi_id;
+ u32 hfi_val;
+
+ switch (inst->fw_caps[cap_id].value) {
+ case 0:
+ hfi_val = HFI_ROTATION_NONE;
+ return 0;
+ case 90:
+ hfi_val = HFI_ROTATION_90;
+ break;
+ case 180:
+ hfi_val = HFI_ROTATION_180;
+ break;
+ case 270:
+ hfi_val = HFI_ROTATION_270;
+ break;
+ default:
+ return -EINVAL;
+ }
+
+ return hfi_ops->session_set_property(inst, hfi_id,
+ HFI_HOST_FLAGS_NONE,
+ iris_get_port_info(inst, cap_id),
+ HFI_PAYLOAD_U32,
+ &hfi_val, sizeof(u32));
+}
+
int iris_set_properties(struct iris_inst *inst, u32 plane)
{
const struct iris_hfi_command_ops *hfi_ops = inst->core->hfi_ops;
diff --git a/drivers/media/platform/qcom/iris/iris_ctrls.h b/drivers/media/platform/qcom/iris/iris_ctrls.h
index 30af333cc494..3ea0a00c7587 100644
--- a/drivers/media/platform/qcom/iris/iris_ctrls.h
+++ b/drivers/media/platform/qcom/iris/iris_ctrls.h
@@ -32,6 +32,7 @@ int iris_set_min_qp(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_i
int iris_set_max_qp(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id);
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_rotation(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id);
int iris_set_properties(struct iris_inst *inst, u32 plane);
#endif
diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c b/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c
index c2258dfb2a8a..15db4f9e85ff 100644
--- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c
+++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c
@@ -198,8 +198,12 @@ static int iris_hfi_gen2_set_bitstream_resolution(struct iris_inst *inst, u32 pl
payload_type = HFI_PAYLOAD_U32;
} else {
codec_align = inst->codec == V4L2_PIX_FMT_HEVC ? 32 : 16;
- resolution = ALIGN(inst->enc_bitstream_width, codec_align) << 16 |
- ALIGN(inst->enc_bitstream_height, codec_align);
+ if (is_rotation_90_or_270(inst))
+ resolution = ALIGN(inst->enc_bitstream_height, codec_align) << 16 |
+ ALIGN(inst->enc_bitstream_width, codec_align);
+ else
+ resolution = ALIGN(inst->enc_bitstream_width, codec_align) << 16 |
+ ALIGN(inst->enc_bitstream_height, codec_align);
inst_hfi_gen2->dst_subcr_params.bitstream_resolution = resolution;
payload_type = HFI_PAYLOAD_32_PACKED;
}
@@ -241,6 +245,10 @@ static int iris_hfi_gen2_set_crop_offsets(struct iris_inst *inst, u32 plane)
right_offset = (ALIGN(inst->enc_raw_width, codec_align) - inst->enc_raw_width);
left_offset = inst->crop.left;
top_offset = inst->crop.top;
+ if (inst->fw_caps[ROTATION].value) {
+ bottom_offset = 0;
+ right_offset = 0;
+ }
}
payload[0] = FIELD_PREP(GENMASK(31, 16), left_offset) | top_offset;
diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h b/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h
index aa1f795f5626..4edcce7faf5e 100644
--- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h
+++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h
@@ -83,6 +83,15 @@ enum hfi_seq_header_mode {
};
#define HFI_PROP_SEQ_HEADER_MODE 0x03000149
+
+enum hfi_rotation {
+ HFI_ROTATION_NONE = 0x00000000,
+ HFI_ROTATION_90 = 0x00000001,
+ HFI_ROTATION_180 = 0x00000002,
+ HFI_ROTATION_270 = 0x00000003,
+};
+
+#define HFI_PROP_ROTATION 0x0300014b
#define HFI_PROP_SIGNAL_COLOR_INFO 0x03000155
#define HFI_PROP_PICTURE_TYPE 0x03000162
#define HFI_PROP_DEC_DEFAULT_HEADER 0x03000168
diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen2_response.c b/drivers/media/platform/qcom/iris/iris_hfi_gen2_response.c
index 2f1f118eae4f..dc3e606b6ab4 100644
--- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_response.c
+++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_response.c
@@ -54,6 +54,8 @@ static u32 iris_hfi_gen2_buf_type_to_driver(struct iris_inst *inst,
return BUF_SCRATCH_2;
case HFI_BUFFER_PERSIST:
return BUF_PERSIST;
+ case HFI_BUFFER_VPSS:
+ return BUF_VPSS;
default:
return 0;
}
diff --git a/drivers/media/platform/qcom/iris/iris_platform_common.h b/drivers/media/platform/qcom/iris/iris_platform_common.h
index 58d05e0a112e..9a4232b1c64e 100644
--- a/drivers/media/platform/qcom/iris/iris_platform_common.h
+++ b/drivers/media/platform/qcom/iris/iris_platform_common.h
@@ -140,6 +140,7 @@ enum platform_inst_fw_cap_type {
P_FRAME_QP_HEVC,
B_FRAME_QP_H264,
B_FRAME_QP_HEVC,
+ ROTATION,
INST_FW_CAP_MAX,
};
diff --git a/drivers/media/platform/qcom/iris/iris_platform_gen2.c b/drivers/media/platform/qcom/iris/iris_platform_gen2.c
index 36d69cc73986..c2cba30be83d 100644
--- a/drivers/media/platform/qcom/iris/iris_platform_gen2.c
+++ b/drivers/media/platform/qcom/iris/iris_platform_gen2.c
@@ -588,6 +588,16 @@ static struct platform_inst_fw_cap inst_fw_cap_sm8550_enc[] = {
.flags = CAP_FLAG_OUTPUT_PORT,
.set = iris_set_u32,
},
+ {
+ .cap_id = ROTATION,
+ .min = 0,
+ .max = 270,
+ .step_or_mask = 90,
+ .value = 0,
+ .hfi_id = HFI_PROP_ROTATION,
+ .flags = CAP_FLAG_OUTPUT_PORT,
+ .set = iris_set_rotation,
+ },
};
static struct platform_inst_caps platform_inst_cap_sm8550 = {
@@ -729,6 +739,10 @@ static const u32 sm8550_dec_op_int_buf_tbl[] = {
BUF_DPB,
};
+static const u32 sm8550_enc_ip_int_buf_tbl[] = {
+ BUF_VPSS,
+};
+
static const u32 sm8550_enc_op_int_buf_tbl[] = {
BUF_BIN,
BUF_COMV,
@@ -816,6 +830,8 @@ struct iris_platform_data sm8550_data = {
.dec_op_int_buf_tbl = sm8550_dec_op_int_buf_tbl,
.dec_op_int_buf_tbl_size = ARRAY_SIZE(sm8550_dec_op_int_buf_tbl),
+ .enc_ip_int_buf_tbl = sm8550_enc_ip_int_buf_tbl,
+ .enc_ip_int_buf_tbl_size = ARRAY_SIZE(sm8550_enc_ip_int_buf_tbl),
.enc_op_int_buf_tbl = sm8550_enc_op_int_buf_tbl,
.enc_op_int_buf_tbl_size = ARRAY_SIZE(sm8550_enc_op_int_buf_tbl),
};
@@ -908,6 +924,8 @@ struct iris_platform_data sm8650_data = {
.dec_op_int_buf_tbl = sm8550_dec_op_int_buf_tbl,
.dec_op_int_buf_tbl_size = ARRAY_SIZE(sm8550_dec_op_int_buf_tbl),
+ .enc_ip_int_buf_tbl = sm8550_enc_ip_int_buf_tbl,
+ .enc_ip_int_buf_tbl_size = ARRAY_SIZE(sm8550_enc_ip_int_buf_tbl),
.enc_op_int_buf_tbl = sm8550_enc_op_int_buf_tbl,
.enc_op_int_buf_tbl_size = ARRAY_SIZE(sm8550_enc_op_int_buf_tbl),
};
@@ -989,6 +1007,8 @@ struct iris_platform_data sm8750_data = {
.dec_op_int_buf_tbl = sm8550_dec_op_int_buf_tbl,
.dec_op_int_buf_tbl_size = ARRAY_SIZE(sm8550_dec_op_int_buf_tbl),
+ .enc_ip_int_buf_tbl = sm8550_enc_ip_int_buf_tbl,
+ .enc_ip_int_buf_tbl_size = ARRAY_SIZE(sm8550_enc_ip_int_buf_tbl),
.enc_op_int_buf_tbl = sm8550_enc_op_int_buf_tbl,
.enc_op_int_buf_tbl_size = ARRAY_SIZE(sm8550_enc_op_int_buf_tbl),
};
diff --git a/drivers/media/platform/qcom/iris/iris_utils.c b/drivers/media/platform/qcom/iris/iris_utils.c
index 85c70a62b1fd..97465dfbdec1 100644
--- a/drivers/media/platform/qcom/iris/iris_utils.c
+++ b/drivers/media/platform/qcom/iris/iris_utils.c
@@ -124,3 +124,9 @@ int iris_check_core_mbps(struct iris_inst *inst)
return 0;
}
+
+bool is_rotation_90_or_270(struct iris_inst *inst)
+{
+ return inst->fw_caps[ROTATION].value == 90 ||
+ inst->fw_caps[ROTATION].value == 270;
+}
diff --git a/drivers/media/platform/qcom/iris/iris_utils.h b/drivers/media/platform/qcom/iris/iris_utils.h
index 75740181122f..b5705d156431 100644
--- a/drivers/media/platform/qcom/iris/iris_utils.h
+++ b/drivers/media/platform/qcom/iris/iris_utils.h
@@ -51,5 +51,6 @@ void iris_helper_buffers_done(struct iris_inst *inst, unsigned int type,
int iris_wait_for_session_response(struct iris_inst *inst, bool is_flush);
int iris_check_core_mbpf(struct iris_inst *inst);
int iris_check_core_mbps(struct iris_inst *inst);
+bool is_rotation_90_or_270(struct iris_inst *inst);
#endif
diff --git a/drivers/media/platform/qcom/iris/iris_vpu_buffer.c b/drivers/media/platform/qcom/iris/iris_vpu_buffer.c
index 4463be05ce16..749cc3139de2 100644
--- a/drivers/media/platform/qcom/iris/iris_vpu_buffer.c
+++ b/drivers/media/platform/qcom/iris/iris_vpu_buffer.c
@@ -556,6 +556,22 @@ static u32 iris_vpu_dec_scratch1_size(struct iris_inst *inst)
iris_vpu_dec_line_size(inst);
}
+static inline u32 iris_vpu_enc_get_bitstream_width(struct iris_inst *inst)
+{
+ if (is_rotation_90_or_270(inst))
+ return inst->fmt_dst->fmt.pix_mp.height;
+ else
+ return inst->fmt_dst->fmt.pix_mp.width;
+}
+
+static inline u32 iris_vpu_enc_get_bitstream_height(struct iris_inst *inst)
+{
+ if (is_rotation_90_or_270(inst))
+ return inst->fmt_dst->fmt.pix_mp.width;
+ else
+ return inst->fmt_dst->fmt.pix_mp.height;
+}
+
static inline u32 size_bin_bitstream_enc(u32 width, u32 height,
u32 rc_type)
{
@@ -638,10 +654,9 @@ static inline u32 hfi_buffer_bin_enc(u32 width, u32 height,
static u32 iris_vpu_enc_bin_size(struct iris_inst *inst)
{
u32 num_vpp_pipes = inst->core->iris_platform_data->num_vpp_pipe;
+ u32 height = iris_vpu_enc_get_bitstream_height(inst);
+ u32 width = iris_vpu_enc_get_bitstream_width(inst);
u32 stage = inst->fw_caps[STAGE].value;
- struct v4l2_format *f = inst->fmt_dst;
- u32 height = f->fmt.pix_mp.height;
- u32 width = f->fmt.pix_mp.width;
u32 lcu_size;
if (inst->codec == V4L2_PIX_FMT_HEVC)
@@ -676,9 +691,8 @@ u32 hfi_buffer_comv_enc(u32 frame_width, u32 frame_height, u32 lcu_size,
static u32 iris_vpu_enc_comv_size(struct iris_inst *inst)
{
- struct v4l2_format *f = inst->fmt_dst;
- u32 height = f->fmt.pix_mp.height;
- u32 width = f->fmt.pix_mp.width;
+ u32 height = iris_vpu_enc_get_bitstream_height(inst);
+ u32 width = iris_vpu_enc_get_bitstream_width(inst);
u32 num_recon = 1;
u32 lcu_size = 16;
@@ -958,9 +972,8 @@ u32 hfi_buffer_non_comv_enc(u32 frame_width, u32 frame_height,
static u32 iris_vpu_enc_non_comv_size(struct iris_inst *inst)
{
u32 num_vpp_pipes = inst->core->iris_platform_data->num_vpp_pipe;
- struct v4l2_format *f = inst->fmt_dst;
- u32 height = f->fmt.pix_mp.height;
- u32 width = f->fmt.pix_mp.width;
+ u32 height = iris_vpu_enc_get_bitstream_height(inst);
+ u32 width = iris_vpu_enc_get_bitstream_width(inst);
u32 lcu_size = 16;
if (inst->codec == V4L2_PIX_FMT_HEVC) {
@@ -1051,9 +1064,8 @@ u32 hfi_buffer_line_enc_vpu33(u32 frame_width, u32 frame_height, bool is_ten_bit
static u32 iris_vpu_enc_line_size(struct iris_inst *inst)
{
u32 num_vpp_pipes = inst->core->iris_platform_data->num_vpp_pipe;
- struct v4l2_format *f = inst->fmt_dst;
- u32 height = f->fmt.pix_mp.height;
- u32 width = f->fmt.pix_mp.width;
+ u32 height = iris_vpu_enc_get_bitstream_height(inst);
+ u32 width = iris_vpu_enc_get_bitstream_width(inst);
u32 lcu_size = 16;
if (inst->codec == V4L2_PIX_FMT_HEVC) {
@@ -1131,10 +1143,8 @@ static u32 iris_vpu_enc_arp_size(struct iris_inst *inst)
inline bool is_scaling_enabled(struct iris_inst *inst)
{
- return inst->crop.left != inst->compose.left ||
- inst->crop.top != inst->compose.top ||
- inst->crop.width != inst->compose.width ||
- inst->crop.height != inst->compose.height;
+ return inst->fmt_dst->fmt.pix_mp.width != inst->fmt_src->fmt.pix_mp.width ||
+ inst->fmt_dst->fmt.pix_mp.height != inst->fmt_src->fmt.pix_mp.height;
}
static inline
@@ -1291,9 +1301,8 @@ static inline u32 hfi_buffer_scratch1_enc(u32 frame_width, u32 frame_height,
static u32 iris_vpu_enc_scratch1_size(struct iris_inst *inst)
{
u32 num_vpp_pipes = inst->core->iris_platform_data->num_vpp_pipe;
- struct v4l2_format *f = inst->fmt_dst;
- u32 frame_height = f->fmt.pix_mp.height;
- u32 frame_width = f->fmt.pix_mp.width;
+ u32 frame_height = iris_vpu_enc_get_bitstream_height(inst);
+ u32 frame_width = iris_vpu_enc_get_bitstream_width(inst);
u32 num_ref = 1;
u32 lcu_size;
bool is_h265;
@@ -1389,9 +1398,8 @@ static inline u32 hfi_buffer_scratch2_enc(u32 frame_width, u32 frame_height,
static u32 iris_vpu_enc_scratch2_size(struct iris_inst *inst)
{
- struct v4l2_format *f = inst->fmt_dst;
- u32 frame_width = f->fmt.pix_mp.width;
- u32 frame_height = f->fmt.pix_mp.height;
+ u32 frame_height = iris_vpu_enc_get_bitstream_height(inst);
+ u32 frame_width = iris_vpu_enc_get_bitstream_width(inst);
u32 num_ref = 1;
return hfi_buffer_scratch2_enc(frame_width, frame_height, num_ref,
--
2.43.0
^ permalink raw reply related [flat|nested] 14+ messages in thread* Re: [PATCH v1 2/4] media: qcom: iris: Add rotation support for encoder
2025-10-15 9:27 ` [PATCH v1 2/4] media: qcom: iris: Add rotation support for encoder Wangao Wang
@ 2025-10-15 16:08 ` Bryan O'Donoghue
2025-10-17 5:54 ` Wangao Wang
2025-10-31 7:14 ` Dikshita Agarwal
1 sibling, 1 reply; 14+ messages in thread
From: Bryan O'Donoghue @ 2025-10-15 16:08 UTC (permalink / raw)
To: Wangao Wang, vikash.garodia, dikshita.agarwal, abhinav.kumar,
mchehab
Cc: linux-media, linux-arm-msm, linux-kernel, quic_qiweil,
quic_renjiang
On 15/10/2025 10:27, Wangao Wang wrote:
> Add rotation control for encoder, enabling V4L2_CID_ROTATE and handling
> 90/180/270 degree rotation.
>
> Add VPSS buffer to platform data, which the rotate function requires.
>
> Signed-off-by: Wangao Wang <wangao.wang@oss.qualcomm.com>
> ---
> drivers/media/platform/qcom/iris/iris_ctrls.c | 34 ++++++++++++
> drivers/media/platform/qcom/iris/iris_ctrls.h | 1 +
> .../qcom/iris/iris_hfi_gen2_command.c | 12 ++++-
> .../qcom/iris/iris_hfi_gen2_defines.h | 9 ++++
> .../qcom/iris/iris_hfi_gen2_response.c | 2 +
> .../platform/qcom/iris/iris_platform_common.h | 1 +
> .../platform/qcom/iris/iris_platform_gen2.c | 20 +++++++
> drivers/media/platform/qcom/iris/iris_utils.c | 6 +++
> drivers/media/platform/qcom/iris/iris_utils.h | 1 +
> .../platform/qcom/iris/iris_vpu_buffer.c | 52 +++++++++++--------
> 10 files changed, 114 insertions(+), 24 deletions(-)
>
> diff --git a/drivers/media/platform/qcom/iris/iris_ctrls.c b/drivers/media/platform/qcom/iris/iris_ctrls.c
> index 754a5ad718bc..00949c207ddb 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_ROTATE:
> + return ROTATION;
> 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 ROTATION:
> + return V4L2_CID_ROTATE;
> default:
> return 0;
> }
> @@ -883,6 +887,36 @@ int iris_set_qp_range(struct iris_inst *inst, enum platform_inst_fw_cap_type cap
> &range, sizeof(range));
> }
>
> +int iris_set_rotation(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id)
> +{
> + const struct iris_hfi_command_ops *hfi_ops = inst->core->hfi_ops;
> + u32 hfi_id = inst->fw_caps[cap_id].hfi_id;
> + u32 hfi_val;
> +
> + switch (inst->fw_caps[cap_id].value) {
> + case 0:
> + hfi_val = HFI_ROTATION_NONE;
> + return 0;
> + case 90:
> + hfi_val = HFI_ROTATION_90;
> + break;
> + case 180:
> + hfi_val = HFI_ROTATION_180;
> + break;
> + case 270:
> + hfi_val = HFI_ROTATION_270;
> + break;
> + default:
> + return -EINVAL;
> + }
> +
> + return hfi_ops->session_set_property(inst, hfi_id,
> + HFI_HOST_FLAGS_NONE,
> + iris_get_port_info(inst, cap_id),
> + HFI_PAYLOAD_U32,
> + &hfi_val, sizeof(u32));
> +}
> +
> int iris_set_properties(struct iris_inst *inst, u32 plane)
> {
> const struct iris_hfi_command_ops *hfi_ops = inst->core->hfi_ops;
> diff --git a/drivers/media/platform/qcom/iris/iris_ctrls.h b/drivers/media/platform/qcom/iris/iris_ctrls.h
> index 30af333cc494..3ea0a00c7587 100644
> --- a/drivers/media/platform/qcom/iris/iris_ctrls.h
> +++ b/drivers/media/platform/qcom/iris/iris_ctrls.h
> @@ -32,6 +32,7 @@ int iris_set_min_qp(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_i
> int iris_set_max_qp(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id);
> 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_rotation(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id);
> int iris_set_properties(struct iris_inst *inst, u32 plane);
>
> #endif
> diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c b/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c
> index c2258dfb2a8a..15db4f9e85ff 100644
> --- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c
> +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c
> @@ -198,8 +198,12 @@ static int iris_hfi_gen2_set_bitstream_resolution(struct iris_inst *inst, u32 pl
> payload_type = HFI_PAYLOAD_U32;
> } else {
> codec_align = inst->codec == V4L2_PIX_FMT_HEVC ? 32 : 16;
> - resolution = ALIGN(inst->enc_bitstream_width, codec_align) << 16 |
> - ALIGN(inst->enc_bitstream_height, codec_align);
> + if (is_rotation_90_or_270(inst))
> + resolution = ALIGN(inst->enc_bitstream_height, codec_align) << 16 |
> + ALIGN(inst->enc_bitstream_width, codec_align);
> + else
> + resolution = ALIGN(inst->enc_bitstream_width, codec_align) << 16 |
> + ALIGN(inst->enc_bitstream_height, codec_align);
That complex assignement can be expressed as a macro, static inline or
just a regular method instead of copy/paste the same code with one
variable changed.
> inst_hfi_gen2->dst_subcr_params.bitstream_resolution = resolution;
> payload_type = HFI_PAYLOAD_32_PACKED;
> }
> @@ -241,6 +245,10 @@ static int iris_hfi_gen2_set_crop_offsets(struct iris_inst *inst, u32 plane)
> right_offset = (ALIGN(inst->enc_raw_width, codec_align) - inst->enc_raw_width);
> left_offset = inst->crop.left;
> top_offset = inst->crop.top;
> + if (inst->fw_caps[ROTATION].value) {
> + bottom_offset = 0;
> + right_offset = 0;
> + }
> }
>
> payload[0] = FIELD_PREP(GENMASK(31, 16), left_offset) | top_offset;
> diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h b/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h
> index aa1f795f5626..4edcce7faf5e 100644
> --- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h
> +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h
> @@ -83,6 +83,15 @@ enum hfi_seq_header_mode {
> };
>
> #define HFI_PROP_SEQ_HEADER_MODE 0x03000149
> +
> +enum hfi_rotation {
> + HFI_ROTATION_NONE = 0x00000000,
> + HFI_ROTATION_90 = 0x00000001,
> + HFI_ROTATION_180 = 0x00000002,
> + HFI_ROTATION_270 = 0x00000003,
> +};
> +
> +#define HFI_PROP_ROTATION 0x0300014b
> #define HFI_PROP_SIGNAL_COLOR_INFO 0x03000155
> #define HFI_PROP_PICTURE_TYPE 0x03000162
> #define HFI_PROP_DEC_DEFAULT_HEADER 0x03000168
> diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen2_response.c b/drivers/media/platform/qcom/iris/iris_hfi_gen2_response.c
> index 2f1f118eae4f..dc3e606b6ab4 100644
> --- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_response.c
> +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_response.c
> @@ -54,6 +54,8 @@ static u32 iris_hfi_gen2_buf_type_to_driver(struct iris_inst *inst,
> return BUF_SCRATCH_2;
> case HFI_BUFFER_PERSIST:
> return BUF_PERSIST;
> + case HFI_BUFFER_VPSS:
> + return BUF_VPSS;
> default:
> return 0;
> }
> diff --git a/drivers/media/platform/qcom/iris/iris_platform_common.h b/drivers/media/platform/qcom/iris/iris_platform_common.h
> index 58d05e0a112e..9a4232b1c64e 100644
> --- a/drivers/media/platform/qcom/iris/iris_platform_common.h
> +++ b/drivers/media/platform/qcom/iris/iris_platform_common.h
> @@ -140,6 +140,7 @@ enum platform_inst_fw_cap_type {
> P_FRAME_QP_HEVC,
> B_FRAME_QP_H264,
> B_FRAME_QP_HEVC,
> + ROTATION,
> INST_FW_CAP_MAX,
> };
>
> diff --git a/drivers/media/platform/qcom/iris/iris_platform_gen2.c b/drivers/media/platform/qcom/iris/iris_platform_gen2.c
> index 36d69cc73986..c2cba30be83d 100644
> --- a/drivers/media/platform/qcom/iris/iris_platform_gen2.c
> +++ b/drivers/media/platform/qcom/iris/iris_platform_gen2.c
> @@ -588,6 +588,16 @@ static struct platform_inst_fw_cap inst_fw_cap_sm8550_enc[] = {
> .flags = CAP_FLAG_OUTPUT_PORT,
> .set = iris_set_u32,
> },
> + {
> + .cap_id = ROTATION,
> + .min = 0,
> + .max = 270,
> + .step_or_mask = 90,
> + .value = 0,
> + .hfi_id = HFI_PROP_ROTATION,
> + .flags = CAP_FLAG_OUTPUT_PORT,
> + .set = iris_set_rotation,
> + },
> };
>
> static struct platform_inst_caps platform_inst_cap_sm8550 = {
> @@ -729,6 +739,10 @@ static const u32 sm8550_dec_op_int_buf_tbl[] = {
> BUF_DPB,
> };
>
> +static const u32 sm8550_enc_ip_int_buf_tbl[] = {
> + BUF_VPSS,
> +};
> +
> static const u32 sm8550_enc_op_int_buf_tbl[] = {
> BUF_BIN,
> BUF_COMV,
> @@ -816,6 +830,8 @@ struct iris_platform_data sm8550_data = {
> .dec_op_int_buf_tbl = sm8550_dec_op_int_buf_tbl,
> .dec_op_int_buf_tbl_size = ARRAY_SIZE(sm8550_dec_op_int_buf_tbl),
>
> + .enc_ip_int_buf_tbl = sm8550_enc_ip_int_buf_tbl,
> + .enc_ip_int_buf_tbl_size = ARRAY_SIZE(sm8550_enc_ip_int_buf_tbl),
> .enc_op_int_buf_tbl = sm8550_enc_op_int_buf_tbl,
> .enc_op_int_buf_tbl_size = ARRAY_SIZE(sm8550_enc_op_int_buf_tbl),
> };
> @@ -908,6 +924,8 @@ struct iris_platform_data sm8650_data = {
> .dec_op_int_buf_tbl = sm8550_dec_op_int_buf_tbl,
> .dec_op_int_buf_tbl_size = ARRAY_SIZE(sm8550_dec_op_int_buf_tbl),
>
> + .enc_ip_int_buf_tbl = sm8550_enc_ip_int_buf_tbl,
> + .enc_ip_int_buf_tbl_size = ARRAY_SIZE(sm8550_enc_ip_int_buf_tbl),
> .enc_op_int_buf_tbl = sm8550_enc_op_int_buf_tbl,
> .enc_op_int_buf_tbl_size = ARRAY_SIZE(sm8550_enc_op_int_buf_tbl),
> };
> @@ -989,6 +1007,8 @@ struct iris_platform_data sm8750_data = {
> .dec_op_int_buf_tbl = sm8550_dec_op_int_buf_tbl,
> .dec_op_int_buf_tbl_size = ARRAY_SIZE(sm8550_dec_op_int_buf_tbl),
>
> + .enc_ip_int_buf_tbl = sm8550_enc_ip_int_buf_tbl,
> + .enc_ip_int_buf_tbl_size = ARRAY_SIZE(sm8550_enc_ip_int_buf_tbl),
> .enc_op_int_buf_tbl = sm8550_enc_op_int_buf_tbl,
> .enc_op_int_buf_tbl_size = ARRAY_SIZE(sm8550_enc_op_int_buf_tbl),
> };
> diff --git a/drivers/media/platform/qcom/iris/iris_utils.c b/drivers/media/platform/qcom/iris/iris_utils.c
> index 85c70a62b1fd..97465dfbdec1 100644
> --- a/drivers/media/platform/qcom/iris/iris_utils.c
> +++ b/drivers/media/platform/qcom/iris/iris_utils.c
> @@ -124,3 +124,9 @@ int iris_check_core_mbps(struct iris_inst *inst)
>
> return 0;
> }
> +
> +bool is_rotation_90_or_270(struct iris_inst *inst)
> +{
> + return inst->fw_caps[ROTATION].value == 90 ||
> + inst->fw_caps[ROTATION].value == 270;
> +}
> diff --git a/drivers/media/platform/qcom/iris/iris_utils.h b/drivers/media/platform/qcom/iris/iris_utils.h
> index 75740181122f..b5705d156431 100644
> --- a/drivers/media/platform/qcom/iris/iris_utils.h
> +++ b/drivers/media/platform/qcom/iris/iris_utils.h
> @@ -51,5 +51,6 @@ void iris_helper_buffers_done(struct iris_inst *inst, unsigned int type,
> int iris_wait_for_session_response(struct iris_inst *inst, bool is_flush);
> int iris_check_core_mbpf(struct iris_inst *inst);
> int iris_check_core_mbps(struct iris_inst *inst);
> +bool is_rotation_90_or_270(struct iris_inst *inst);
>
> #endif
> diff --git a/drivers/media/platform/qcom/iris/iris_vpu_buffer.c b/drivers/media/platform/qcom/iris/iris_vpu_buffer.c
> index 4463be05ce16..749cc3139de2 100644
> --- a/drivers/media/platform/qcom/iris/iris_vpu_buffer.c
> +++ b/drivers/media/platform/qcom/iris/iris_vpu_buffer.c
> @@ -556,6 +556,22 @@ static u32 iris_vpu_dec_scratch1_size(struct iris_inst *inst)
> iris_vpu_dec_line_size(inst);
> }
>
> +static inline u32 iris_vpu_enc_get_bitstream_width(struct iris_inst *inst)
> +{
> + if (is_rotation_90_or_270(inst))
> + return inst->fmt_dst->fmt.pix_mp.height;
> + else
> + return inst->fmt_dst->fmt.pix_mp.width;
> +}
> +
> +static inline u32 iris_vpu_enc_get_bitstream_height(struct iris_inst *inst)
> +{
> + if (is_rotation_90_or_270(inst))
> + return inst->fmt_dst->fmt.pix_mp.width;
> + else
> + return inst->fmt_dst->fmt.pix_mp.height;
> +}
> +
> static inline u32 size_bin_bitstream_enc(u32 width, u32 height,
> u32 rc_type)
> {
> @@ -638,10 +654,9 @@ static inline u32 hfi_buffer_bin_enc(u32 width, u32 height,
> static u32 iris_vpu_enc_bin_size(struct iris_inst *inst)
> {
> u32 num_vpp_pipes = inst->core->iris_platform_data->num_vpp_pipe;
> + u32 height = iris_vpu_enc_get_bitstream_height(inst);
> + u32 width = iris_vpu_enc_get_bitstream_width(inst);
> u32 stage = inst->fw_caps[STAGE].value;
> - struct v4l2_format *f = inst->fmt_dst;
> - u32 height = f->fmt.pix_mp.height;
> - u32 width = f->fmt.pix_mp.width;
> u32 lcu_size;
>
> if (inst->codec == V4L2_PIX_FMT_HEVC)
> @@ -676,9 +691,8 @@ u32 hfi_buffer_comv_enc(u32 frame_width, u32 frame_height, u32 lcu_size,
>
> static u32 iris_vpu_enc_comv_size(struct iris_inst *inst)
> {
> - struct v4l2_format *f = inst->fmt_dst;
> - u32 height = f->fmt.pix_mp.height;
> - u32 width = f->fmt.pix_mp.width;
> + u32 height = iris_vpu_enc_get_bitstream_height(inst);
> + u32 width = iris_vpu_enc_get_bitstream_width(inst);
> u32 num_recon = 1;
> u32 lcu_size = 16;
>
> @@ -958,9 +972,8 @@ u32 hfi_buffer_non_comv_enc(u32 frame_width, u32 frame_height,
> static u32 iris_vpu_enc_non_comv_size(struct iris_inst *inst)
> {
> u32 num_vpp_pipes = inst->core->iris_platform_data->num_vpp_pipe;
> - struct v4l2_format *f = inst->fmt_dst;
> - u32 height = f->fmt.pix_mp.height;
> - u32 width = f->fmt.pix_mp.width;
> + u32 height = iris_vpu_enc_get_bitstream_height(inst);
> + u32 width = iris_vpu_enc_get_bitstream_width(inst);
> u32 lcu_size = 16;
>
> if (inst->codec == V4L2_PIX_FMT_HEVC) {
> @@ -1051,9 +1064,8 @@ u32 hfi_buffer_line_enc_vpu33(u32 frame_width, u32 frame_height, bool is_ten_bit
> static u32 iris_vpu_enc_line_size(struct iris_inst *inst)
> {
> u32 num_vpp_pipes = inst->core->iris_platform_data->num_vpp_pipe;
> - struct v4l2_format *f = inst->fmt_dst;
> - u32 height = f->fmt.pix_mp.height;
> - u32 width = f->fmt.pix_mp.width;
> + u32 height = iris_vpu_enc_get_bitstream_height(inst);
> + u32 width = iris_vpu_enc_get_bitstream_width(inst);
> u32 lcu_size = 16;
>
> if (inst->codec == V4L2_PIX_FMT_HEVC) {
> @@ -1131,10 +1143,8 @@ static u32 iris_vpu_enc_arp_size(struct iris_inst *inst)
>
> inline bool is_scaling_enabled(struct iris_inst *inst)
> {
> - return inst->crop.left != inst->compose.left ||
> - inst->crop.top != inst->compose.top ||
> - inst->crop.width != inst->compose.width ||
> - inst->crop.height != inst->compose.height;
> + return inst->fmt_dst->fmt.pix_mp.width != inst->fmt_src->fmt.pix_mp.width ||
> + inst->fmt_dst->fmt.pix_mp.height != inst->fmt_src->fmt.pix_mp.height;
These long chains of indirection make the code not very readable
Please take pointers to &fmt_dts->fmt and &fmt_src->fmt and reduce this
clause.
> }
>
> static inline
> @@ -1291,9 +1301,8 @@ static inline u32 hfi_buffer_scratch1_enc(u32 frame_width, u32 frame_height,
> static u32 iris_vpu_enc_scratch1_size(struct iris_inst *inst)
> {
> u32 num_vpp_pipes = inst->core->iris_platform_data->num_vpp_pipe;
> - struct v4l2_format *f = inst->fmt_dst;
> - u32 frame_height = f->fmt.pix_mp.height;
> - u32 frame_width = f->fmt.pix_mp.width;
> + u32 frame_height = iris_vpu_enc_get_bitstream_height(inst);
> + u32 frame_width = iris_vpu_enc_get_bitstream_width(inst);
> u32 num_ref = 1;
> u32 lcu_size;
> bool is_h265;
> @@ -1389,9 +1398,8 @@ static inline u32 hfi_buffer_scratch2_enc(u32 frame_width, u32 frame_height,
>
> static u32 iris_vpu_enc_scratch2_size(struct iris_inst *inst)
> {
> - struct v4l2_format *f = inst->fmt_dst;
> - u32 frame_width = f->fmt.pix_mp.width;
> - u32 frame_height = f->fmt.pix_mp.height;
> + u32 frame_height = iris_vpu_enc_get_bitstream_height(inst);
> + u32 frame_width = iris_vpu_enc_get_bitstream_width(inst);
> u32 num_ref = 1;
>
> return hfi_buffer_scratch2_enc(frame_width, frame_height, num_ref,
> --
> 2.43.0
>
---
bod
^ permalink raw reply [flat|nested] 14+ messages in thread* Re: [PATCH v1 2/4] media: qcom: iris: Add rotation support for encoder
2025-10-15 16:08 ` Bryan O'Donoghue
@ 2025-10-17 5:54 ` Wangao Wang
0 siblings, 0 replies; 14+ messages in thread
From: Wangao Wang @ 2025-10-17 5:54 UTC (permalink / raw)
To: Bryan O'Donoghue, vikash.garodia, dikshita.agarwal,
abhinav.kumar, mchehab
Cc: linux-media, linux-arm-msm, linux-kernel, quic_qiweil,
quic_renjiang, Wangao Wang
On 10/16/2025 12:08 AM, Bryan O'Donoghue wrote:
>> iris_hfi_gen2_set_bitstream_resolution(struct iris_inst *inst, u32 pl
>> payload_type = HFI_PAYLOAD_U32;
>> } else {
>> codec_align = inst->codec == V4L2_PIX_FMT_HEVC ? 32 : 16;
>> - resolution = ALIGN(inst->enc_bitstream_width, codec_align) <<
>> 16 |
>> - ALIGN(inst->enc_bitstream_height, codec_align);
>> + if (is_rotation_90_or_270(inst))
>> + resolution = ALIGN(inst->enc_bitstream_height,
>> codec_align) << 16 |
>> + ALIGN(inst->enc_bitstream_width, codec_align);
>> + else
>> + resolution = ALIGN(inst->enc_bitstream_width,
>> codec_align) << 16 |
>> + ALIGN(inst->enc_bitstream_height, codec_align);
>
> That complex assignement can be expressed as a macro, static inline or
> just a regular method instead of copy/paste the same code with one
> variable changed.
>
You're right, this code is reused in several places. I will address it
in v2.>> inline bool is_scaling_enabled(struct iris_inst *inst)
>> {
>> - return inst->crop.left != inst->compose.left ||
>> - inst->crop.top != inst->compose.top ||
>> - inst->crop.width != inst->compose.width ||
>> - inst->crop.height != inst->compose.height;
>> + return inst->fmt_dst->fmt.pix_mp.width != inst->fmt_src-
>> >fmt.pix_mp.width ||
>> + inst->fmt_dst->fmt.pix_mp.height != inst->fmt_src-
>> >fmt.pix_mp.height;
>
> These long chains of indirection make the code not very readable
>
> Please take pointers to &fmt_dts->fmt and &fmt_src->fmt and reduce this
> clause.
>
Sure, will update in v2.
--
Best Regards,
Wangao
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v1 2/4] media: qcom: iris: Add rotation support for encoder
2025-10-15 9:27 ` [PATCH v1 2/4] media: qcom: iris: Add rotation support for encoder Wangao Wang
2025-10-15 16:08 ` Bryan O'Donoghue
@ 2025-10-31 7:14 ` Dikshita Agarwal
1 sibling, 0 replies; 14+ messages in thread
From: Dikshita Agarwal @ 2025-10-31 7:14 UTC (permalink / raw)
To: Wangao Wang, vikash.garodia, abhinav.kumar, bod, mchehab
Cc: linux-media, linux-arm-msm, linux-kernel, quic_qiweil,
quic_renjiang
On 10/15/2025 2:57 PM, Wangao Wang wrote:
> Add rotation control for encoder, enabling V4L2_CID_ROTATE and handling
> 90/180/270 degree rotation.
>
> Add VPSS buffer to platform data, which the rotate function requires.
>
> Signed-off-by: Wangao Wang <wangao.wang@oss.qualcomm.com>
> ---
> drivers/media/platform/qcom/iris/iris_ctrls.c | 34 ++++++++++++
> drivers/media/platform/qcom/iris/iris_ctrls.h | 1 +
> .../qcom/iris/iris_hfi_gen2_command.c | 12 ++++-
> .../qcom/iris/iris_hfi_gen2_defines.h | 9 ++++
> .../qcom/iris/iris_hfi_gen2_response.c | 2 +
> .../platform/qcom/iris/iris_platform_common.h | 1 +
> .../platform/qcom/iris/iris_platform_gen2.c | 20 +++++++
> drivers/media/platform/qcom/iris/iris_utils.c | 6 +++
> drivers/media/platform/qcom/iris/iris_utils.h | 1 +
> .../platform/qcom/iris/iris_vpu_buffer.c | 52 +++++++++++--------
> 10 files changed, 114 insertions(+), 24 deletions(-)
>
> diff --git a/drivers/media/platform/qcom/iris/iris_ctrls.c b/drivers/media/platform/qcom/iris/iris_ctrls.c
> index 754a5ad718bc..00949c207ddb 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_ROTATE:
> + return ROTATION;
> 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 ROTATION:
> + return V4L2_CID_ROTATE;
> default:
> return 0;
> }
> @@ -883,6 +887,36 @@ int iris_set_qp_range(struct iris_inst *inst, enum platform_inst_fw_cap_type cap
> &range, sizeof(range));
> }
>
> +int iris_set_rotation(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id)
> +{
> + const struct iris_hfi_command_ops *hfi_ops = inst->core->hfi_ops;
> + u32 hfi_id = inst->fw_caps[cap_id].hfi_id;
> + u32 hfi_val;
> +
> + switch (inst->fw_caps[cap_id].value) {
> + case 0:
> + hfi_val = HFI_ROTATION_NONE;
> + return 0;
> + case 90:
> + hfi_val = HFI_ROTATION_90;
> + break;
> + case 180:
> + hfi_val = HFI_ROTATION_180;
> + break;
> + case 270:
> + hfi_val = HFI_ROTATION_270;
> + break;
> + default:
> + return -EINVAL;
> + }
> +
> + return hfi_ops->session_set_property(inst, hfi_id,
> + HFI_HOST_FLAGS_NONE,
> + iris_get_port_info(inst, cap_id),
> + HFI_PAYLOAD_U32,
> + &hfi_val, sizeof(u32));
> +}
> +
> int iris_set_properties(struct iris_inst *inst, u32 plane)
> {
> const struct iris_hfi_command_ops *hfi_ops = inst->core->hfi_ops;
> diff --git a/drivers/media/platform/qcom/iris/iris_ctrls.h b/drivers/media/platform/qcom/iris/iris_ctrls.h
> index 30af333cc494..3ea0a00c7587 100644
> --- a/drivers/media/platform/qcom/iris/iris_ctrls.h
> +++ b/drivers/media/platform/qcom/iris/iris_ctrls.h
> @@ -32,6 +32,7 @@ int iris_set_min_qp(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_i
> int iris_set_max_qp(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id);
> 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_rotation(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id);
> int iris_set_properties(struct iris_inst *inst, u32 plane);
>
> #endif
> diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c b/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c
> index c2258dfb2a8a..15db4f9e85ff 100644
> --- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c
> +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c
> @@ -198,8 +198,12 @@ static int iris_hfi_gen2_set_bitstream_resolution(struct iris_inst *inst, u32 pl
> payload_type = HFI_PAYLOAD_U32;
> } else {
> codec_align = inst->codec == V4L2_PIX_FMT_HEVC ? 32 : 16;
> - resolution = ALIGN(inst->enc_bitstream_width, codec_align) << 16 |
> - ALIGN(inst->enc_bitstream_height, codec_align);
> + if (is_rotation_90_or_270(inst))
> + resolution = ALIGN(inst->enc_bitstream_height, codec_align) << 16 |
> + ALIGN(inst->enc_bitstream_width, codec_align);
> + else
> + resolution = ALIGN(inst->enc_bitstream_width, codec_align) << 16 |
> + ALIGN(inst->enc_bitstream_height, codec_align);
> inst_hfi_gen2->dst_subcr_params.bitstream_resolution = resolution;
> payload_type = HFI_PAYLOAD_32_PACKED;
> }
> @@ -241,6 +245,10 @@ static int iris_hfi_gen2_set_crop_offsets(struct iris_inst *inst, u32 plane)
> right_offset = (ALIGN(inst->enc_raw_width, codec_align) - inst->enc_raw_width);
> left_offset = inst->crop.left;
> top_offset = inst->crop.top;
> + if (inst->fw_caps[ROTATION].value) {
> + bottom_offset = 0;
> + right_offset = 0;
> + }
why is this needed?
> }
>
> payload[0] = FIELD_PREP(GENMASK(31, 16), left_offset) | top_offset;
> diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h b/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h
> index aa1f795f5626..4edcce7faf5e 100644
> --- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h
> +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h
> @@ -83,6 +83,15 @@ enum hfi_seq_header_mode {
> };
>
> #define HFI_PROP_SEQ_HEADER_MODE 0x03000149
> +
> +enum hfi_rotation {
> + HFI_ROTATION_NONE = 0x00000000,
> + HFI_ROTATION_90 = 0x00000001,
> + HFI_ROTATION_180 = 0x00000002,
> + HFI_ROTATION_270 = 0x00000003,
> +};
> +
> +#define HFI_PROP_ROTATION 0x0300014b
> #define HFI_PROP_SIGNAL_COLOR_INFO 0x03000155
> #define HFI_PROP_PICTURE_TYPE 0x03000162
> #define HFI_PROP_DEC_DEFAULT_HEADER 0x03000168
> diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen2_response.c b/drivers/media/platform/qcom/iris/iris_hfi_gen2_response.c
> index 2f1f118eae4f..dc3e606b6ab4 100644
> --- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_response.c
> +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_response.c
> @@ -54,6 +54,8 @@ static u32 iris_hfi_gen2_buf_type_to_driver(struct iris_inst *inst,
> return BUF_SCRATCH_2;
> case HFI_BUFFER_PERSIST:
> return BUF_PERSIST;
> + case HFI_BUFFER_VPSS:
> + return BUF_VPSS;
> default:
> return 0;
> }
> diff --git a/drivers/media/platform/qcom/iris/iris_platform_common.h b/drivers/media/platform/qcom/iris/iris_platform_common.h
> index 58d05e0a112e..9a4232b1c64e 100644
> --- a/drivers/media/platform/qcom/iris/iris_platform_common.h
> +++ b/drivers/media/platform/qcom/iris/iris_platform_common.h
> @@ -140,6 +140,7 @@ enum platform_inst_fw_cap_type {
> P_FRAME_QP_HEVC,
> B_FRAME_QP_H264,
> B_FRAME_QP_HEVC,
> + ROTATION,
> INST_FW_CAP_MAX,
> };
>
> diff --git a/drivers/media/platform/qcom/iris/iris_platform_gen2.c b/drivers/media/platform/qcom/iris/iris_platform_gen2.c
> index 36d69cc73986..c2cba30be83d 100644
> --- a/drivers/media/platform/qcom/iris/iris_platform_gen2.c
> +++ b/drivers/media/platform/qcom/iris/iris_platform_gen2.c
> @@ -588,6 +588,16 @@ static struct platform_inst_fw_cap inst_fw_cap_sm8550_enc[] = {
> .flags = CAP_FLAG_OUTPUT_PORT,
> .set = iris_set_u32,
> },
> + {
> + .cap_id = ROTATION,
> + .min = 0,
> + .max = 270,
> + .step_or_mask = 90,
> + .value = 0,
> + .hfi_id = HFI_PROP_ROTATION,
> + .flags = CAP_FLAG_OUTPUT_PORT,
> + .set = iris_set_rotation,
> + },
> };
>
> static struct platform_inst_caps platform_inst_cap_sm8550 = {
> @@ -729,6 +739,10 @@ static const u32 sm8550_dec_op_int_buf_tbl[] = {
> BUF_DPB,
> };
>
> +static const u32 sm8550_enc_ip_int_buf_tbl[] = {
> + BUF_VPSS,
VPSS would be needed for scaling as well, pls add in correct patch.
> +};
> +
> static const u32 sm8550_enc_op_int_buf_tbl[] = {
> BUF_BIN,
> BUF_COMV,
> @@ -816,6 +830,8 @@ struct iris_platform_data sm8550_data = {
> .dec_op_int_buf_tbl = sm8550_dec_op_int_buf_tbl,
> .dec_op_int_buf_tbl_size = ARRAY_SIZE(sm8550_dec_op_int_buf_tbl),
>
> + .enc_ip_int_buf_tbl = sm8550_enc_ip_int_buf_tbl,
> + .enc_ip_int_buf_tbl_size = ARRAY_SIZE(sm8550_enc_ip_int_buf_tbl),
> .enc_op_int_buf_tbl = sm8550_enc_op_int_buf_tbl,
> .enc_op_int_buf_tbl_size = ARRAY_SIZE(sm8550_enc_op_int_buf_tbl),
> };
> @@ -908,6 +924,8 @@ struct iris_platform_data sm8650_data = {
> .dec_op_int_buf_tbl = sm8550_dec_op_int_buf_tbl,
> .dec_op_int_buf_tbl_size = ARRAY_SIZE(sm8550_dec_op_int_buf_tbl),
>
> + .enc_ip_int_buf_tbl = sm8550_enc_ip_int_buf_tbl,
> + .enc_ip_int_buf_tbl_size = ARRAY_SIZE(sm8550_enc_ip_int_buf_tbl),
> .enc_op_int_buf_tbl = sm8550_enc_op_int_buf_tbl,
> .enc_op_int_buf_tbl_size = ARRAY_SIZE(sm8550_enc_op_int_buf_tbl),
> };
> @@ -989,6 +1007,8 @@ struct iris_platform_data sm8750_data = {
> .dec_op_int_buf_tbl = sm8550_dec_op_int_buf_tbl,
> .dec_op_int_buf_tbl_size = ARRAY_SIZE(sm8550_dec_op_int_buf_tbl),
>
> + .enc_ip_int_buf_tbl = sm8550_enc_ip_int_buf_tbl,
> + .enc_ip_int_buf_tbl_size = ARRAY_SIZE(sm8550_enc_ip_int_buf_tbl),
> .enc_op_int_buf_tbl = sm8550_enc_op_int_buf_tbl,
> .enc_op_int_buf_tbl_size = ARRAY_SIZE(sm8550_enc_op_int_buf_tbl),
> };
> diff --git a/drivers/media/platform/qcom/iris/iris_utils.c b/drivers/media/platform/qcom/iris/iris_utils.c
> index 85c70a62b1fd..97465dfbdec1 100644
> --- a/drivers/media/platform/qcom/iris/iris_utils.c
> +++ b/drivers/media/platform/qcom/iris/iris_utils.c
> @@ -124,3 +124,9 @@ int iris_check_core_mbps(struct iris_inst *inst)
>
> return 0;
> }
> +
> +bool is_rotation_90_or_270(struct iris_inst *inst)
> +{
> + return inst->fw_caps[ROTATION].value == 90 ||
> + inst->fw_caps[ROTATION].value == 270;
> +}
> diff --git a/drivers/media/platform/qcom/iris/iris_utils.h b/drivers/media/platform/qcom/iris/iris_utils.h
> index 75740181122f..b5705d156431 100644
> --- a/drivers/media/platform/qcom/iris/iris_utils.h
> +++ b/drivers/media/platform/qcom/iris/iris_utils.h
> @@ -51,5 +51,6 @@ void iris_helper_buffers_done(struct iris_inst *inst, unsigned int type,
> int iris_wait_for_session_response(struct iris_inst *inst, bool is_flush);
> int iris_check_core_mbpf(struct iris_inst *inst);
> int iris_check_core_mbps(struct iris_inst *inst);
> +bool is_rotation_90_or_270(struct iris_inst *inst);
>
> #endif
> diff --git a/drivers/media/platform/qcom/iris/iris_vpu_buffer.c b/drivers/media/platform/qcom/iris/iris_vpu_buffer.c
> index 4463be05ce16..749cc3139de2 100644
> --- a/drivers/media/platform/qcom/iris/iris_vpu_buffer.c
> +++ b/drivers/media/platform/qcom/iris/iris_vpu_buffer.c
> @@ -556,6 +556,22 @@ static u32 iris_vpu_dec_scratch1_size(struct iris_inst *inst)
> iris_vpu_dec_line_size(inst);
> }
>
> +static inline u32 iris_vpu_enc_get_bitstream_width(struct iris_inst *inst)
> +{
> + if (is_rotation_90_or_270(inst))
> + return inst->fmt_dst->fmt.pix_mp.height;
> + else
> + return inst->fmt_dst->fmt.pix_mp.width;
> +}
> +
> +static inline u32 iris_vpu_enc_get_bitstream_height(struct iris_inst *inst)
> +{
> + if (is_rotation_90_or_270(inst))
> + return inst->fmt_dst->fmt.pix_mp.width;
> + else
> + return inst->fmt_dst->fmt.pix_mp.height;
> +}
> +
> static inline u32 size_bin_bitstream_enc(u32 width, u32 height,
> u32 rc_type)
> {
> @@ -638,10 +654,9 @@ static inline u32 hfi_buffer_bin_enc(u32 width, u32 height,
> static u32 iris_vpu_enc_bin_size(struct iris_inst *inst)
> {
> u32 num_vpp_pipes = inst->core->iris_platform_data->num_vpp_pipe;
> + u32 height = iris_vpu_enc_get_bitstream_height(inst);
> + u32 width = iris_vpu_enc_get_bitstream_width(inst);
> u32 stage = inst->fw_caps[STAGE].value;
> - struct v4l2_format *f = inst->fmt_dst;
> - u32 height = f->fmt.pix_mp.height;
> - u32 width = f->fmt.pix_mp.width;
> u32 lcu_size;
>
> if (inst->codec == V4L2_PIX_FMT_HEVC)
> @@ -676,9 +691,8 @@ u32 hfi_buffer_comv_enc(u32 frame_width, u32 frame_height, u32 lcu_size,
>
> static u32 iris_vpu_enc_comv_size(struct iris_inst *inst)
> {
> - struct v4l2_format *f = inst->fmt_dst;
> - u32 height = f->fmt.pix_mp.height;
> - u32 width = f->fmt.pix_mp.width;
> + u32 height = iris_vpu_enc_get_bitstream_height(inst);
> + u32 width = iris_vpu_enc_get_bitstream_width(inst);
> u32 num_recon = 1;
> u32 lcu_size = 16;
>
> @@ -958,9 +972,8 @@ u32 hfi_buffer_non_comv_enc(u32 frame_width, u32 frame_height,
> static u32 iris_vpu_enc_non_comv_size(struct iris_inst *inst)
> {
> u32 num_vpp_pipes = inst->core->iris_platform_data->num_vpp_pipe;
> - struct v4l2_format *f = inst->fmt_dst;
> - u32 height = f->fmt.pix_mp.height;
> - u32 width = f->fmt.pix_mp.width;
> + u32 height = iris_vpu_enc_get_bitstream_height(inst);
> + u32 width = iris_vpu_enc_get_bitstream_width(inst);
> u32 lcu_size = 16;
>
> if (inst->codec == V4L2_PIX_FMT_HEVC) {
> @@ -1051,9 +1064,8 @@ u32 hfi_buffer_line_enc_vpu33(u32 frame_width, u32 frame_height, bool is_ten_bit
> static u32 iris_vpu_enc_line_size(struct iris_inst *inst)
> {
> u32 num_vpp_pipes = inst->core->iris_platform_data->num_vpp_pipe;
> - struct v4l2_format *f = inst->fmt_dst;
> - u32 height = f->fmt.pix_mp.height;
> - u32 width = f->fmt.pix_mp.width;
> + u32 height = iris_vpu_enc_get_bitstream_height(inst);
> + u32 width = iris_vpu_enc_get_bitstream_width(inst);
> u32 lcu_size = 16;
>
> if (inst->codec == V4L2_PIX_FMT_HEVC) {
> @@ -1131,10 +1143,8 @@ static u32 iris_vpu_enc_arp_size(struct iris_inst *inst)
>
> inline bool is_scaling_enabled(struct iris_inst *inst)
> {
> - return inst->crop.left != inst->compose.left ||
> - inst->crop.top != inst->compose.top ||
> - inst->crop.width != inst->compose.width ||
> - inst->crop.height != inst->compose.height;
> + return inst->fmt_dst->fmt.pix_mp.width != inst->fmt_src->fmt.pix_mp.width ||
> + inst->fmt_dst->fmt.pix_mp.height != inst->fmt_src->fmt.pix_mp.height;
> }
this is needed for scaling as well? pls add in correct patch.
Thanks,
Dikshita
>
> static inline
> @@ -1291,9 +1301,8 @@ static inline u32 hfi_buffer_scratch1_enc(u32 frame_width, u32 frame_height,
> static u32 iris_vpu_enc_scratch1_size(struct iris_inst *inst)
> {
> u32 num_vpp_pipes = inst->core->iris_platform_data->num_vpp_pipe;
> - struct v4l2_format *f = inst->fmt_dst;
> - u32 frame_height = f->fmt.pix_mp.height;
> - u32 frame_width = f->fmt.pix_mp.width;
> + u32 frame_height = iris_vpu_enc_get_bitstream_height(inst);
> + u32 frame_width = iris_vpu_enc_get_bitstream_width(inst);
> u32 num_ref = 1;
> u32 lcu_size;
> bool is_h265;
> @@ -1389,9 +1398,8 @@ static inline u32 hfi_buffer_scratch2_enc(u32 frame_width, u32 frame_height,
>
> static u32 iris_vpu_enc_scratch2_size(struct iris_inst *inst)
> {
> - struct v4l2_format *f = inst->fmt_dst;
> - u32 frame_width = f->fmt.pix_mp.width;
> - u32 frame_height = f->fmt.pix_mp.height;
> + u32 frame_height = iris_vpu_enc_get_bitstream_height(inst);
> + u32 frame_width = iris_vpu_enc_get_bitstream_width(inst);
> u32 num_ref = 1;
>
> return hfi_buffer_scratch2_enc(frame_width, frame_height, num_ref,
^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH v1 3/4] media: qcom: iris: Add flip support for encoder
2025-10-15 9:27 [PATCH v1 0/4] media: qcom: iris: encoder feature enhancements Wangao Wang
2025-10-15 9:27 ` [PATCH v1 1/4] media: qcom: iris: Add support for scale and improve format alignment Wangao Wang
2025-10-15 9:27 ` [PATCH v1 2/4] media: qcom: iris: Add rotation support for encoder Wangao Wang
@ 2025-10-15 9:27 ` Wangao Wang
2025-10-15 9:27 ` [PATCH v1 4/4] media: qcom: iris: Add intra refresh " Wangao Wang
2025-10-17 9:55 ` [PATCH v1 0/4] media: qcom: iris: encoder feature enhancements Neil Armstrong
4 siblings, 0 replies; 14+ messages in thread
From: Wangao Wang @ 2025-10-15 9:27 UTC (permalink / raw)
To: vikash.garodia, dikshita.agarwal, abhinav.kumar, bod, mchehab
Cc: linux-media, linux-arm-msm, linux-kernel, quic_qiweil,
quic_renjiang, Wangao Wang
Add support for V4L2_CID_HFLIP and V4L2_CID_VFLIP controls in encoder.
Signed-off-by: Wangao Wang <wangao.wang@oss.qualcomm.com>
---
drivers/media/platform/qcom/iris/iris_ctrls.c | 27 +++++++++++++++++++
drivers/media/platform/qcom/iris/iris_ctrls.h | 1 +
.../qcom/iris/iris_hfi_gen2_command.c | 2 +-
.../qcom/iris/iris_hfi_gen2_defines.h | 8 ++++++
.../platform/qcom/iris/iris_platform_common.h | 2 ++
.../platform/qcom/iris/iris_platform_gen2.c | 22 +++++++++++++++
6 files changed, 61 insertions(+), 1 deletion(-)
diff --git a/drivers/media/platform/qcom/iris/iris_ctrls.c b/drivers/media/platform/qcom/iris/iris_ctrls.c
index 00949c207ddb..8f74c12f2f41 100644
--- a/drivers/media/platform/qcom/iris/iris_ctrls.c
+++ b/drivers/media/platform/qcom/iris/iris_ctrls.c
@@ -100,6 +100,10 @@ static enum platform_inst_fw_cap_type iris_get_cap_id(u32 id)
return B_FRAME_QP_HEVC;
case V4L2_CID_ROTATE:
return ROTATION;
+ case V4L2_CID_HFLIP:
+ return HFLIP;
+ case V4L2_CID_VFLIP:
+ return VFLIP;
default:
return INST_FW_CAP_MAX;
}
@@ -189,6 +193,10 @@ static u32 iris_get_v4l2_id(enum platform_inst_fw_cap_type cap_id)
return V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_QP;
case ROTATION:
return V4L2_CID_ROTATE;
+ case HFLIP:
+ return V4L2_CID_HFLIP;
+ case VFLIP:
+ return V4L2_CID_VFLIP;
default:
return 0;
}
@@ -917,6 +925,25 @@ int iris_set_rotation(struct iris_inst *inst, enum platform_inst_fw_cap_type cap
&hfi_val, sizeof(u32));
}
+int iris_set_flip(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id)
+{
+ const struct iris_hfi_command_ops *hfi_ops = inst->core->hfi_ops;
+ u32 hfi_id = inst->fw_caps[cap_id].hfi_id;
+ u32 hfi_val = HFI_DISABLE_FLIP;
+
+ if (inst->fw_caps[HFLIP].value)
+ hfi_val |= HFI_HORIZONTAL_FLIP;
+
+ if (inst->fw_caps[VFLIP].value)
+ hfi_val |= HFI_VERTICAL_FLIP;
+
+ return hfi_ops->session_set_property(inst, hfi_id,
+ HFI_HOST_FLAGS_NONE,
+ iris_get_port_info(inst, cap_id),
+ HFI_PAYLOAD_U32_ENUM,
+ &hfi_val, sizeof(u32));
+}
+
int iris_set_properties(struct iris_inst *inst, u32 plane)
{
const struct iris_hfi_command_ops *hfi_ops = inst->core->hfi_ops;
diff --git a/drivers/media/platform/qcom/iris/iris_ctrls.h b/drivers/media/platform/qcom/iris/iris_ctrls.h
index 3ea0a00c7587..355a592049f3 100644
--- a/drivers/media/platform/qcom/iris/iris_ctrls.h
+++ b/drivers/media/platform/qcom/iris/iris_ctrls.h
@@ -33,6 +33,7 @@ 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_rotation(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id);
+int iris_set_flip(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id);
int iris_set_properties(struct iris_inst *inst, u32 plane);
#endif
diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c b/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c
index 15db4f9e85ff..1f2a5b4d3977 100644
--- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c
+++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c
@@ -245,7 +245,7 @@ static int iris_hfi_gen2_set_crop_offsets(struct iris_inst *inst, u32 plane)
right_offset = (ALIGN(inst->enc_raw_width, codec_align) - inst->enc_raw_width);
left_offset = inst->crop.left;
top_offset = inst->crop.top;
- if (inst->fw_caps[ROTATION].value) {
+ if (inst->fw_caps[ROTATION].value || inst->fw_caps[VFLIP].value) {
bottom_offset = 0;
right_offset = 0;
}
diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h b/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h
index 4edcce7faf5e..0f92468dca91 100644
--- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h
+++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h
@@ -92,6 +92,14 @@ enum hfi_rotation {
};
#define HFI_PROP_ROTATION 0x0300014b
+
+enum hfi_flip {
+ HFI_DISABLE_FLIP = 0x00000000,
+ HFI_HORIZONTAL_FLIP = 0x00000001,
+ HFI_VERTICAL_FLIP = 0x00000002,
+};
+
+#define HFI_PROP_FLIP 0x0300014c
#define HFI_PROP_SIGNAL_COLOR_INFO 0x03000155
#define HFI_PROP_PICTURE_TYPE 0x03000162
#define HFI_PROP_DEC_DEFAULT_HEADER 0x03000168
diff --git a/drivers/media/platform/qcom/iris/iris_platform_common.h b/drivers/media/platform/qcom/iris/iris_platform_common.h
index 9a4232b1c64e..284d6bde6d6b 100644
--- a/drivers/media/platform/qcom/iris/iris_platform_common.h
+++ b/drivers/media/platform/qcom/iris/iris_platform_common.h
@@ -141,6 +141,8 @@ enum platform_inst_fw_cap_type {
B_FRAME_QP_H264,
B_FRAME_QP_HEVC,
ROTATION,
+ HFLIP,
+ VFLIP,
INST_FW_CAP_MAX,
};
diff --git a/drivers/media/platform/qcom/iris/iris_platform_gen2.c b/drivers/media/platform/qcom/iris/iris_platform_gen2.c
index c2cba30be83d..5d76f638020f 100644
--- a/drivers/media/platform/qcom/iris/iris_platform_gen2.c
+++ b/drivers/media/platform/qcom/iris/iris_platform_gen2.c
@@ -598,6 +598,28 @@ static struct platform_inst_fw_cap inst_fw_cap_sm8550_enc[] = {
.flags = CAP_FLAG_OUTPUT_PORT,
.set = iris_set_rotation,
},
+ {
+ .cap_id = HFLIP,
+ .min = 0,
+ .max = 1,
+ .step_or_mask = 1,
+ .value = 0,
+ .hfi_id = HFI_PROP_FLIP,
+ .flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_INPUT_PORT |
+ CAP_FLAG_DYNAMIC_ALLOWED,
+ .set = iris_set_flip,
+ },
+ {
+ .cap_id = VFLIP,
+ .min = 0,
+ .max = 1,
+ .step_or_mask = 1,
+ .value = 0,
+ .hfi_id = HFI_PROP_FLIP,
+ .flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_INPUT_PORT |
+ CAP_FLAG_DYNAMIC_ALLOWED,
+ .set = iris_set_flip,
+ },
};
static struct platform_inst_caps platform_inst_cap_sm8550 = {
--
2.43.0
^ permalink raw reply related [flat|nested] 14+ messages in thread* [PATCH v1 4/4] media: qcom: iris: Add intra refresh support for encoder
2025-10-15 9:27 [PATCH v1 0/4] media: qcom: iris: encoder feature enhancements Wangao Wang
` (2 preceding siblings ...)
2025-10-15 9:27 ` [PATCH v1 3/4] media: qcom: iris: Add flip " Wangao Wang
@ 2025-10-15 9:27 ` Wangao Wang
2025-10-17 9:55 ` [PATCH v1 0/4] media: qcom: iris: encoder feature enhancements Neil Armstrong
4 siblings, 0 replies; 14+ messages in thread
From: Wangao Wang @ 2025-10-15 9:27 UTC (permalink / raw)
To: vikash.garodia, dikshita.agarwal, abhinav.kumar, bod, mchehab
Cc: linux-media, linux-arm-msm, linux-kernel, quic_qiweil,
quic_renjiang, Wangao Wang
Add support for V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD and
V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD_TYPE controls.
Signed-off-by: Wangao Wang <wangao.wang@oss.qualcomm.com>
---
drivers/media/platform/qcom/iris/iris_ctrls.c | 33 +++++++++++++++++++
drivers/media/platform/qcom/iris/iris_ctrls.h | 1 +
.../qcom/iris/iris_hfi_gen2_defines.h | 2 ++
.../platform/qcom/iris/iris_platform_common.h | 2 ++
.../platform/qcom/iris/iris_platform_gen2.c | 19 +++++++++++
5 files changed, 57 insertions(+)
diff --git a/drivers/media/platform/qcom/iris/iris_ctrls.c b/drivers/media/platform/qcom/iris/iris_ctrls.c
index 8f74c12f2f41..148915692473 100644
--- a/drivers/media/platform/qcom/iris/iris_ctrls.c
+++ b/drivers/media/platform/qcom/iris/iris_ctrls.c
@@ -104,6 +104,10 @@ static enum platform_inst_fw_cap_type iris_get_cap_id(u32 id)
return HFLIP;
case V4L2_CID_VFLIP:
return VFLIP;
+ case V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD_TYPE:
+ return IR_TYPE;
+ case V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD:
+ return IR_PERIOD;
default:
return INST_FW_CAP_MAX;
}
@@ -197,6 +201,10 @@ static u32 iris_get_v4l2_id(enum platform_inst_fw_cap_type cap_id)
return V4L2_CID_HFLIP;
case VFLIP:
return V4L2_CID_VFLIP;
+ case IR_TYPE:
+ return V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD_TYPE;
+ case IR_PERIOD:
+ return V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD;
default:
return 0;
}
@@ -944,6 +952,31 @@ int iris_set_flip(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id)
&hfi_val, sizeof(u32));
}
+int iris_set_ir_period(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id)
+{
+ const struct iris_hfi_command_ops *hfi_ops = inst->core->hfi_ops;
+ struct vb2_queue *q = v4l2_m2m_get_dst_vq(inst->m2m_ctx);
+ u32 ir_period = inst->fw_caps[cap_id].value;
+ u32 ir_type = 0;
+
+ if (inst->fw_caps[IR_TYPE].value ==
+ V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD_TYPE_RANDOM) {
+ if (vb2_is_streaming(q))
+ return 0;
+ ir_type = HFI_PROP_IR_RANDOM_PERIOD;
+ } else if (inst->fw_caps[IR_TYPE].value ==
+ V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD_TYPE_CYCLIC) {
+ ir_type = HFI_PROP_IR_CYCLIC_PERIOD;
+ } else
+ return -EINVAL;
+
+ return hfi_ops->session_set_property(inst, ir_type,
+ HFI_HOST_FLAGS_NONE,
+ iris_get_port_info(inst, cap_id),
+ HFI_PAYLOAD_U32,
+ &ir_period, sizeof(u32));
+}
+
int iris_set_properties(struct iris_inst *inst, u32 plane)
{
const struct iris_hfi_command_ops *hfi_ops = inst->core->hfi_ops;
diff --git a/drivers/media/platform/qcom/iris/iris_ctrls.h b/drivers/media/platform/qcom/iris/iris_ctrls.h
index 355a592049f3..9518803577bc 100644
--- a/drivers/media/platform/qcom/iris/iris_ctrls.h
+++ b/drivers/media/platform/qcom/iris/iris_ctrls.h
@@ -34,6 +34,7 @@ int iris_set_frame_qp(struct iris_inst *inst, enum platform_inst_fw_cap_type cap
int iris_set_qp_range(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id);
int iris_set_rotation(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id);
int iris_set_flip(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id);
+int iris_set_ir_period(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id);
int iris_set_properties(struct iris_inst *inst, u32 plane);
#endif
diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h b/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h
index 0f92468dca91..9e8fdddf2aef 100644
--- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h
+++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h
@@ -70,6 +70,7 @@ enum hfi_rate_control {
#define HFI_PROP_QP_PACKED 0x0300012e
#define HFI_PROP_MIN_QP_PACKED 0x0300012f
#define HFI_PROP_MAX_QP_PACKED 0x03000130
+#define HFI_PROP_IR_RANDOM_PERIOD 0x03000131
#define HFI_PROP_TOTAL_BITRATE 0x0300013b
#define HFI_PROP_MAX_GOP_FRAMES 0x03000146
#define HFI_PROP_MAX_B_FRAMES 0x03000147
@@ -108,6 +109,7 @@ enum hfi_flip {
#define HFI_PROP_BUFFER_MARK 0x0300016c
#define HFI_PROP_RAW_RESOLUTION 0x03000178
#define HFI_PROP_TOTAL_PEAK_BITRATE 0x0300017C
+#define HFI_PROP_IR_CYCLIC_PERIOD 0x0300017E
#define HFI_PROP_COMV_BUFFER_COUNT 0x03000193
#define HFI_PROP_END 0x03FFFFFF
diff --git a/drivers/media/platform/qcom/iris/iris_platform_common.h b/drivers/media/platform/qcom/iris/iris_platform_common.h
index 284d6bde6d6b..30b98e769ad3 100644
--- a/drivers/media/platform/qcom/iris/iris_platform_common.h
+++ b/drivers/media/platform/qcom/iris/iris_platform_common.h
@@ -143,6 +143,8 @@ enum platform_inst_fw_cap_type {
ROTATION,
HFLIP,
VFLIP,
+ IR_TYPE,
+ IR_PERIOD,
INST_FW_CAP_MAX,
};
diff --git a/drivers/media/platform/qcom/iris/iris_platform_gen2.c b/drivers/media/platform/qcom/iris/iris_platform_gen2.c
index 5d76f638020f..35915c87c5b1 100644
--- a/drivers/media/platform/qcom/iris/iris_platform_gen2.c
+++ b/drivers/media/platform/qcom/iris/iris_platform_gen2.c
@@ -620,6 +620,25 @@ static struct platform_inst_fw_cap inst_fw_cap_sm8550_enc[] = {
CAP_FLAG_DYNAMIC_ALLOWED,
.set = iris_set_flip,
},
+ {
+ .cap_id = IR_TYPE,
+ .min = V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD_TYPE_RANDOM,
+ .max = V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD_TYPE_CYCLIC,
+ .step_or_mask = BIT(V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD_TYPE_RANDOM) |
+ BIT(V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD_TYPE_CYCLIC),
+ .value = V4L2_CID_MPEG_VIDEO_INTRA_REFRESH_PERIOD_TYPE_RANDOM,
+ .flags = CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
+ },
+ {
+ .cap_id = IR_PERIOD,
+ .min = 0,
+ .max = INT_MAX,
+ .step_or_mask = 1,
+ .value = 0,
+ .flags = CAP_FLAG_OUTPUT_PORT |
+ CAP_FLAG_DYNAMIC_ALLOWED,
+ .set = iris_set_ir_period,
+ },
};
static struct platform_inst_caps platform_inst_cap_sm8550 = {
--
2.43.0
^ permalink raw reply related [flat|nested] 14+ messages in thread* Re: [PATCH v1 0/4] media: qcom: iris: encoder feature enhancements
2025-10-15 9:27 [PATCH v1 0/4] media: qcom: iris: encoder feature enhancements Wangao Wang
` (3 preceding siblings ...)
2025-10-15 9:27 ` [PATCH v1 4/4] media: qcom: iris: Add intra refresh " Wangao Wang
@ 2025-10-17 9:55 ` Neil Armstrong
2025-10-27 7:40 ` Wangao Wang
4 siblings, 1 reply; 14+ messages in thread
From: Neil Armstrong @ 2025-10-17 9:55 UTC (permalink / raw)
To: Wangao Wang, vikash.garodia, dikshita.agarwal, abhinav.kumar, bod,
mchehab
Cc: linux-media, linux-arm-msm, linux-kernel, quic_qiweil,
quic_renjiang
On 10/15/25 11:27, Wangao Wang wrote:
> Hi All,
>
> This patch series introduces several enhancements to the Qualcomm Iris
> encoder driver, improving support for V4L2 controls and enabling more
> video encoding features.
>
> All patches have been tested with v4l2-compliance, v4l2-ctl and
> on QCS8300 for encoder.
Nice, but did you test those on any other device ? This patchset
affects all supported HW, so please test on all of them.
>
> Commands used for V4l2-ctl validation:
>
> Scale:
> v4l2-ctl --verbose -d /dev/video1 \
> --set-fmt-video-out=width=1920,height=1080,pixelformat=NV12 \
> --set-selection-output target=crop,width=1920,height=1080 \
> --set-fmt-video=width=1280,height=720,pixelformat=H264 \
> --stream-mmap --stream-out-mmap \
> --stream-from=input_nv12_1080p.yuv \
> --stream-to=output/scale_720p_output.h264
Please provide a way to generate/retrieve this `input_nv12_1080p.yuv` file aswell.
Thanks,
Neil>
> Flip:
> v4l2-ctl --verbose -d /dev/video1 \
> --set-fmt-video-out=width=1920,height=1080,pixelformat=NV12 \
> --set-selection-output target=crop,width=1920,height=1080 \
> --set-fmt-video=pixelformat=H264 --stream-mmap --stream-out-mmap \
> --stream-from=input_nv12_1080p.yuv \
> --stream-to=output/vertical_flip.h264 \
> --set-ctrl vertical_flip=1
>
> v4l2-ctl --verbose -d /dev/video1 \
> --set-fmt-video-out=width=1920,height=1080,pixelformat=NV12 \
> --set-selection-output target=crop,width=1920,height=1080 \
> --set-fmt-video=pixelformat=H264 --stream-mmap --stream-out-mmap \
> --stream-from=input_nv12_1080p.yuv \
> --stream-to=output/horizontal_flip.h264 \
> --set-ctrl horizontal_flip=1
>
> Rotate:
> v4l2-ctl --verbose -d /dev/video1 \
> --set-fmt-video-out=width=1920,height=1080,pixelformat=NV12 \
> --set-selection-output target=crop,width=1920,height=1080 \
> --set-fmt-video=pixelformat=H264 --stream-mmap --stream-out-mmap \
> --stream-from=input_nv12_1080p.yuv \
> --stream-to=output/rotate90.h264 \
> --set-ctrl rotate=90
>
> v4l2-ctl --verbose -d /dev/video1 \
> --set-fmt-video-out=width=1920,height=1080,pixelformat=NV12 \
> --set-selection-output target=crop,width=1920,height=1080 \
> --set-fmt-video=pixelformat=H264 --stream-mmap --stream-out-mmap \
> --stream-from=input_nv12_1080p.yuv \
> --stream-to=output/rotate180.h264 \
> --set-ctrl rotate=180
>
> v4l2-ctl --verbose -d /dev/video1 \
> --set-fmt-video-out=width=1920,height=1080,pixelformat=NV12 \
> --set-selection-output target=crop,width=1920,height=1080 \
> --set-fmt-video=pixelformat=H264 --stream-mmap --stream-out-mmap \
> --stream-from=input_nv12_1080p.yuv \
> --stream-to=output/rotate270.h264 \
> --set-ctrl rotate=270
>
> Intra Refresh:
> Testing of this feature requires the use of this application.
> https://github.com/quic/v4l-video-test-app
>
> The result of v4l2-compliance on QCS8300:
> v4l2-compliance 1.31.0-5378, 64 bits, 64-bit time_t
> v4l2-compliance SHA: 2ed8da243dd1 2025-06-30 08:18:40
>
> Compliance test for iris_driver device /dev/video1:
>
> Driver Info:
> Driver name : iris_driver
> Card type : Iris Encoder
> Bus info : platform:aa00000.video-codec
> Driver version : 6.17.0
> Capabilities : 0x84204000
> Video Memory-to-Memory Multiplanar
> Streaming
> Extended Pix Format
> Device Capabilities
> Device Caps : 0x04204000
> Video Memory-to-Memory Multiplanar
> Streaming
> Extended Pix Format
> Detected Stateful Encoder
>
> Required ioctls:
> test VIDIOC_QUERYCAP: OK
> test invalid ioctls: OK
>
> Allow for multiple opens:
> test second /dev/video1 open: OK
> test VIDIOC_QUERYCAP: OK
> test VIDIOC_G/S_PRIORITY: OK
> test for unlimited opens: OK
>
> Debug ioctls:
> test VIDIOC_DBG_G/S_REGISTER: OK (Not Supported)
> test VIDIOC_LOG_STATUS: OK (Not Supported)
>
> Input ioctls:
> test VIDIOC_G/S_TUNER/ENUM_FREQ_BANDS: OK (Not Supported)
> test VIDIOC_G/S_FREQUENCY: OK (Not Supported)
> test VIDIOC_S_HW_FREQ_SEEK: OK (Not Supported)
> test VIDIOC_ENUMAUDIO: OK (Not Supported)
> test VIDIOC_G/S/ENUMINPUT: OK (Not Supported)
> test VIDIOC_G/S_AUDIO: OK (Not Supported)
> Inputs: 0 Audio Inputs: 0 Tuners: 0
>
> Output ioctls:
> test VIDIOC_G/S_MODULATOR: OK (Not Supported)
> test VIDIOC_G/S_FREQUENCY: OK (Not Supported)
> test VIDIOC_ENUMAUDOUT: OK (Not Supported)
> test VIDIOC_G/S/ENUMOUTPUT: OK (Not Supported)
> test VIDIOC_G/S_AUDOUT: OK (Not Supported)
> Outputs: 0 Audio Outputs: 0 Modulators: 0
>
> Input/Output configuration ioctls:
> test VIDIOC_ENUM/G/S/QUERY_STD: OK (Not Supported)
> test VIDIOC_ENUM/G/S/QUERY_DV_TIMINGS: OK (Not Supported)
> test VIDIOC_DV_TIMINGS_CAP: OK (Not Supported)
> test VIDIOC_G/S_EDID: OK (Not Supported)
>
> Control ioctls:
> test VIDIOC_QUERY_EXT_CTRL/QUERYMENU: OK
> test VIDIOC_QUERYCTRL: OK
> test VIDIOC_G/S_CTRL: OK
> test VIDIOC_G/S/TRY_EXT_CTRLS: OK
> test VIDIOC_(UN)SUBSCRIBE_EVENT/DQEVENT: OK
> test VIDIOC_G/S_JPEGCOMP: OK (Not Supported)
> Standard Controls: 43 Private Controls: 0
>
> Format ioctls:
> test VIDIOC_ENUM_FMT/FRAMESIZES/FRAMEINTERVALS: OK
> test VIDIOC_G/S_PARM: OK
> test VIDIOC_G_FBUF: OK (Not Supported)
> test VIDIOC_G_FMT: OK
> test VIDIOC_TRY_FMT: OK
> test VIDIOC_S_FMT: OK
> test VIDIOC_G_SLICED_VBI_CAP: OK (Not Supported)
> test Cropping: OK
> test Composing: OK (Not Supported)
> test Scaling: OK (Not Supported)
>
> Codec ioctls:
> test VIDIOC_(TRY_)ENCODER_CMD: OK
> test VIDIOC_G_ENC_INDEX: OK (Not Supported)
> test VIDIOC_(TRY_)DECODER_CMD: OK (Not Supported)
>
> Buffer ioctls:
> test VIDIOC_REQBUFS/CREATE_BUFS/QUERYBUF: OK
> test CREATE_BUFS maximum buffers: OK
> test VIDIOC_REMOVE_BUFS: OK
> test VIDIOC_EXPBUF: OK
> test Requests: OK (Not Supported)
> test blocking wait: OK
>
> Test input 0:
>
> Streaming ioctls:
> test read/write: OK (Not Supported)
> Video Capture Multiplanar: Captured 61 buffers
> test MMAP (select, REQBUFS): OK
> Video Capture Multiplanar: Captured 61 buffers
> test MMAP (epoll, REQBUFS): OK
> Video Capture Multiplanar: Captured 61 buffers
> test MMAP (select, CREATE_BUFS): OK
> Video Capture Multiplanar: Captured 61 buffers
> test MMAP (epoll, CREATE_BUFS): OK
> test USERPTR (select): OK (Not Supported)
> test DMABUF: Cannot test, specify --expbuf-device
>
> Total for iris_driver device /dev/video1: 54, Succeeded: 54, Failed: 0, Warnings: 0
>
> Wangao Wang (4):
> media: qcom: iris: Add support for scale and improve format alignment
> media: qcom: iris: Add rotation support for encoder
> media: qcom: iris: Add flip support for encoder
> media: qcom: iris: Add intra refresh support for encoder
>
> drivers/media/platform/qcom/iris/iris_ctrls.c | 94 +++++++++++++++++++
> drivers/media/platform/qcom/iris/iris_ctrls.h | 3 +
> .../qcom/iris/iris_hfi_gen2_command.c | 26 +++--
> .../qcom/iris/iris_hfi_gen2_defines.h | 19 ++++
> .../qcom/iris/iris_hfi_gen2_response.c | 2 +
> .../media/platform/qcom/iris/iris_instance.h | 8 ++
> .../platform/qcom/iris/iris_platform_common.h | 5 +
> .../platform/qcom/iris/iris_platform_gen2.c | 61 ++++++++++++
> drivers/media/platform/qcom/iris/iris_utils.c | 6 ++
> drivers/media/platform/qcom/iris/iris_utils.h | 1 +
> drivers/media/platform/qcom/iris/iris_venc.c | 28 +++++-
> .../platform/qcom/iris/iris_vpu_buffer.c | 52 +++++-----
> 12 files changed, 273 insertions(+), 32 deletions(-)
>
^ permalink raw reply [flat|nested] 14+ messages in thread* Re: [PATCH v1 0/4] media: qcom: iris: encoder feature enhancements
2025-10-17 9:55 ` [PATCH v1 0/4] media: qcom: iris: encoder feature enhancements Neil Armstrong
@ 2025-10-27 7:40 ` Wangao Wang
0 siblings, 0 replies; 14+ messages in thread
From: Wangao Wang @ 2025-10-27 7:40 UTC (permalink / raw)
To: Neil Armstrong, vikash.garodia, dikshita.agarwal, abhinav.kumar,
bod, mchehab
Cc: linux-media, linux-arm-msm, linux-kernel, quic_qiweil,
quic_renjiang
On 10/17/2025 5:55 PM, Neil Armstrong wrote:
>> All patches have been tested with v4l2-compliance, v4l2-ctl and
>> on QCS8300 for encoder.
>
> Nice, but did you test those on any other device ? This patchset
> affects all supported HW, so please test on all of them.
>
Thanks for helping with the review. So far, we have conducted tests on
QCS8300, SA8775P, X1E80100, and QCS8550. However, I don’t have access to
an SM8650 device—could you help test it?
>
>>
>> Commands used for V4l2-ctl validation:
>>
>> Scale:
>> v4l2-ctl --verbose -d /dev/video1 \
>> --set-fmt-video-out=width=1920,height=1080,pixelformat=NV12 \
>> --set-selection-output target=crop,width=1920,height=1080 \
>> --set-fmt-video=width=1280,height=720,pixelformat=H264 \
>> --stream-mmap --stream-out-mmap \
>> --stream-from=input_nv12_1080p.yuv \
>> --stream-to=output/scale_720p_output.h264
>
> Please provide a way to generate/retrieve this `input_nv12_1080p.yuv`
> file aswell.
A 720p NV12 file is available here, which can be converted to 1080p
using ffmpeg.
file:
https://github.com/quic/v4l-video-test-app/blob/master/data/resource/simple_nv12_720p_90frms.yuv
cmd: ffmpeg -f rawvideo -pix_fmt nv12 -s 1280x720 \
-i simple_nv12_720p_90frms.yuv \
-vf "scale=1920:1080" -pix_fmt nv12 input_nv12_1080p.yuv
--
Best Regards,
Wangao
^ permalink raw reply [flat|nested] 14+ messages in thread