Re: [PATCH v6 3/6] media: qcom: iris: Add scale support for encoder
From: Dmitry Baryshkov
Date: Tue May 12 2026 - 13:41:19 EST
On Fri, Nov 14, 2025 at 11:09:00AM +0800, Wangao Wang wrote:
> Add members enc_scale_width, enc_scale_height to the struct iris_inst to
> support scale requirements.
>
> Add output width and height settings in iris_venc_s_fmt_output to
> enable scaling functionality.
>
> Add VPSS buffer to platform data, which the scale function requires.
>
> Reviewed-by: Bryan O'Donoghue <bryan.odonoghue@xxxxxxxxxx>
> Reviewed-by: Dikshita Agarwal <dikshita.agarwal@xxxxxxxxxxxxxxxx>
> Tested-by: Neil Armstrong <neil.armstrong@xxxxxxxxxx> # on SM8650-HDK
> Signed-off-by: Wangao Wang <wangao.wang@xxxxxxxxxxxxxxxx>
> ---
> .../platform/qcom/iris/iris_hfi_gen2_command.c | 12 +++++------
> .../platform/qcom/iris/iris_hfi_gen2_response.c | 2 ++
> drivers/media/platform/qcom/iris/iris_instance.h | 4 ++++
> .../media/platform/qcom/iris/iris_platform_gen2.c | 12 +++++++++++
> drivers/media/platform/qcom/iris/iris_venc.c | 23 +++++++++++++++++++++-
> drivers/media/platform/qcom/iris/iris_vpu_buffer.c | 9 +++++----
> 6 files changed, 51 insertions(+), 11 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 8250e0d6f0a8916f3389be60dba762f3b4f3c690..94c996c6eeceb36d5e63e3ddb0d402d7138f94c4 100644
> --- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c
> +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c
> @@ -194,8 +194,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_scale_width, codec_align) << 16 |
> + ALIGN(inst->enc_scale_height, codec_align);
> inst_hfi_gen2->dst_subcr_params.bitstream_resolution = resolution;
> payload_type = HFI_PAYLOAD_32_PACKED;
> }
> @@ -237,10 +237,10 @@ static int iris_hfi_gen2_set_crop_offsets(struct iris_inst *inst, u32 plane)
> left_offset = inst->crop.left;
> top_offset = inst->crop.top;
> } else {
> - bottom_offset = (ALIGN(inst->fmt_dst->fmt.pix_mp.height, codec_align) -
> - inst->fmt_dst->fmt.pix_mp.height);
> - right_offset = (ALIGN(inst->fmt_dst->fmt.pix_mp.width, codec_align) -
> - inst->fmt_dst->fmt.pix_mp.width);
> + bottom_offset = (ALIGN(inst->enc_scale_height, codec_align) -
> + inst->enc_scale_height);
> + right_offset = (ALIGN(inst->enc_scale_width, codec_align) -
> + inst->enc_scale_width);
> left_offset = 0;
> top_offset = 0;
> }
> 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 2f1f118eae4f6462ab1aa1d16844b34e6e699f1e..dc3e606b6ab429a1d15536fa8316afb1e384d674 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_instance.h b/drivers/media/platform/qcom/iris/iris_instance.h
> index a95244cf6d30cd81199b9f1e51bf64c991be1790..0a0d4ace0bb6bee6ab11bd47fddb27432cd524f7 100644
> --- a/drivers/media/platform/qcom/iris/iris_instance.h
> +++ b/drivers/media/platform/qcom/iris/iris_instance.h
> @@ -71,6 +71,8 @@ struct iris_fmt {
> * @hfi_rc_type: rate control type
> * @enc_raw_width: source image width for encoder instance
> * @enc_raw_height: source image height for encoder instance
> + * @enc_scale_width: scale width for encoder instance
> + * @enc_scale_height: scale height for encoder instance
> */
>
> struct iris_inst {
> @@ -111,6 +113,8 @@ struct iris_inst {
> u32 hfi_rc_type;
> u32 enc_raw_width;
> u32 enc_raw_height;
> + u32 enc_scale_width;
> + u32 enc_scale_height;
> };
>
> #endif
> diff --git a/drivers/media/platform/qcom/iris/iris_platform_gen2.c b/drivers/media/platform/qcom/iris/iris_platform_gen2.c
> index c1989240c248601c34b84f508f1b72d72f81260a..f1f9ee8a93560c0875a396f6197d4b42e3d2612c 100644
> --- a/drivers/media/platform/qcom/iris/iris_platform_gen2.c
> +++ b/drivers/media/platform/qcom/iris/iris_platform_gen2.c
> @@ -728,6 +728,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,
> @@ -815,6 +819,8 @@ const 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),
> };
> @@ -907,6 +913,8 @@ const 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),
> };
> @@ -988,6 +996,8 @@ const 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),
> };
> @@ -1075,6 +1085,8 @@ const struct iris_platform_data qcs8300_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),
> };
What about Gen1 platforms?
> diff --git a/drivers/media/platform/qcom/iris/iris_venc.c b/drivers/media/platform/qcom/iris/iris_venc.c
> index 71f4263ada898ce8333086db59e386e91b34ed60..51162690168e6e6db923e635fe17932ad509d782 100644
> --- a/drivers/media/platform/qcom/iris/iris_venc.c
> +++ b/drivers/media/platform/qcom/iris/iris_venc.c
> @@ -70,6 +70,8 @@ int iris_venc_inst_init(struct iris_inst *inst)
>
> inst->enc_raw_width = DEFAULT_WIDTH;
> inst->enc_raw_height = DEFAULT_HEIGHT;
> + inst->enc_scale_width = DEFAULT_WIDTH;
> + inst->enc_scale_height = DEFAULT_HEIGHT;
>
> memcpy(&inst->fw_caps[0], &core->inst_fw_caps_enc[0],
> INST_FW_CAP_MAX * sizeof(struct platform_inst_fw_cap));
> @@ -226,15 +228,32 @@ 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 output format size != input format size,
> + * it is considered a scaling case,
> + * and the scaled size needs to be saved.
> + */
Why do we need to save it? Don't we have access to input and output
formats directly in the code which sends the properties?
> + if (f->fmt.pix_mp.width != inst->fmt_src->fmt.pix_mp.width ||
> + f->fmt.pix_mp.height != inst->fmt_src->fmt.pix_mp.height) {
> + inst->enc_scale_width = f->fmt.pix_mp.width;
> + inst->enc_scale_height = f->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);
> + }
> 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);
> @@ -292,6 +311,8 @@ static int iris_venc_s_fmt_input(struct iris_inst *inst, struct v4l2_format *f)
>
> inst->enc_raw_width = f->fmt.pix_mp.width;
> inst->enc_raw_height = f->fmt.pix_mp.height;
> + inst->enc_scale_width = f->fmt.pix_mp.width;
> + inst->enc_scale_height = f->fmt.pix_mp.height;
>
> if (f->fmt.pix_mp.width != inst->crop.width ||
> f->fmt.pix_mp.height != inst->crop.height) {
> diff --git a/drivers/media/platform/qcom/iris/iris_vpu_buffer.c b/drivers/media/platform/qcom/iris/iris_vpu_buffer.c
> index 4463be05ce165adef6b152eb0c155d2e6a7b3c36..db5adadd1b39c06bc41ae6f1b3d2f924b3ebf150 100644
> --- a/drivers/media/platform/qcom/iris/iris_vpu_buffer.c
> +++ b/drivers/media/platform/qcom/iris/iris_vpu_buffer.c
> @@ -1131,10 +1131,11 @@ 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;
> + struct v4l2_pix_format_mplane *dst_fmt = &inst->fmt_dst->fmt.pix_mp;
> + struct v4l2_pix_format_mplane *src_fmt = &inst->fmt_src->fmt.pix_mp;
> +
> + return dst_fmt->width != src_fmt->width ||
> + dst_fmt->height != src_fmt->height;
> }
>
> static inline
>
> --
> 2.43.0
>
--
With best wishes
Dmitry