Re: [PATCH v7 4/6] media: qcom: iris: Add hierarchical coding support for encoder
From: Dmitry Baryshkov
Date: Wed May 13 2026 - 07:09:29 EST
On Tue, May 12, 2026 at 04:55:13PM +0800, Wangao Wang wrote:
> Add hierarchical coding support for both gen1 and gen2 encoders by enabling
> the following V4L2 controls:
> H264:
> V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING,
> V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING_TYPE,
> V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING_LAYER
> HEVC(gen2 only):
> V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_TYPE,
> V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_LAYER
>
> Reviewed-by: Vikash Garodia <vikash.garodia@xxxxxxxxxxxxxxxx>
> Signed-off-by: Wangao Wang <wangao.wang@xxxxxxxxxxxxxxxx>
> ---
> drivers/media/platform/qcom/iris/iris_ctrls.c | 288 ++++++++++++++++++++-
> drivers/media/platform/qcom/iris/iris_ctrls.h | 7 +-
> drivers/media/platform/qcom/iris/iris_hfi_gen1.c | 94 ++++++-
> .../platform/qcom/iris/iris_hfi_gen1_command.c | 21 +-
> .../platform/qcom/iris/iris_hfi_gen1_defines.h | 2 +
> drivers/media/platform/qcom/iris/iris_hfi_gen2.c | 184 ++++++++++++-
> .../platform/qcom/iris/iris_hfi_gen2_defines.h | 15 ++
> drivers/media/platform/qcom/iris/iris_instance.h | 4 +
> .../platform/qcom/iris/iris_platform_common.h | 23 ++
> drivers/media/platform/qcom/iris/iris_vpu_buffer.c | 28 ++
> 10 files changed, 658 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/media/platform/qcom/iris/iris_ctrls.c b/drivers/media/platform/qcom/iris/iris_ctrls.c
> index a6bd2eada52b68afd91032315c2701d8c74a9763..10e33b8a73f60759c4f1cb17b5c95897f0e1468f 100644
> --- a/drivers/media/platform/qcom/iris/iris_ctrls.c
> +++ b/drivers/media/platform/qcom/iris/iris_ctrls.c
> @@ -120,6 +120,40 @@ static enum platform_inst_fw_cap_type iris_get_cap_id(u32 id)
> return MARK_LTR;
> case V4L2_CID_MPEG_VIDEO_B_FRAMES:
> return B_FRAME;
> + case V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING:
> + return LAYER_ENABLE;
> + case V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING_TYPE:
> + return LAYER_TYPE_H264;
> + case V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_TYPE:
> + return LAYER_TYPE_HEVC;
> + case V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING_LAYER:
> + return LAYER_COUNT_H264;
> + case V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_LAYER:
> + return LAYER_COUNT_HEVC;
> + case V4L2_CID_MPEG_VIDEO_H264_HIER_CODING_L0_BR:
> + return LAYER0_BITRATE_H264;
> + case V4L2_CID_MPEG_VIDEO_H264_HIER_CODING_L1_BR:
> + return LAYER1_BITRATE_H264;
> + case V4L2_CID_MPEG_VIDEO_H264_HIER_CODING_L2_BR:
> + return LAYER2_BITRATE_H264;
> + case V4L2_CID_MPEG_VIDEO_H264_HIER_CODING_L3_BR:
> + return LAYER3_BITRATE_H264;
> + case V4L2_CID_MPEG_VIDEO_H264_HIER_CODING_L4_BR:
> + return LAYER4_BITRATE_H264;
> + case V4L2_CID_MPEG_VIDEO_H264_HIER_CODING_L5_BR:
> + return LAYER5_BITRATE_H264;
> + case V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L0_BR:
> + return LAYER0_BITRATE_HEVC;
> + case V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L1_BR:
> + return LAYER1_BITRATE_HEVC;
> + case V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L2_BR:
> + return LAYER2_BITRATE_HEVC;
> + case V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L3_BR:
> + return LAYER3_BITRATE_HEVC;
> + case V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L4_BR:
> + return LAYER4_BITRATE_HEVC;
> + case V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L5_BR:
> + return LAYER5_BITRATE_HEVC;
> default:
> return INST_FW_CAP_MAX;
> }
> @@ -229,6 +263,40 @@ static u32 iris_get_v4l2_id(enum platform_inst_fw_cap_type cap_id)
> return V4L2_CID_MPEG_VIDEO_FRAME_LTR_INDEX;
> case B_FRAME:
> return V4L2_CID_MPEG_VIDEO_B_FRAMES;
> + case LAYER_ENABLE:
> + return V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING;
> + case LAYER_TYPE_H264:
> + return V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING_TYPE;
> + case LAYER_TYPE_HEVC:
> + return V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_TYPE;
> + case LAYER_COUNT_H264:
> + return V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING_LAYER;
> + case LAYER_COUNT_HEVC:
> + return V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_LAYER;
> + case LAYER0_BITRATE_H264:
> + return V4L2_CID_MPEG_VIDEO_H264_HIER_CODING_L0_BR;
> + case LAYER1_BITRATE_H264:
> + return V4L2_CID_MPEG_VIDEO_H264_HIER_CODING_L1_BR;
> + case LAYER2_BITRATE_H264:
> + return V4L2_CID_MPEG_VIDEO_H264_HIER_CODING_L2_BR;
> + case LAYER3_BITRATE_H264:
> + return V4L2_CID_MPEG_VIDEO_H264_HIER_CODING_L3_BR;
> + case LAYER4_BITRATE_H264:
> + return V4L2_CID_MPEG_VIDEO_H264_HIER_CODING_L4_BR;
> + case LAYER5_BITRATE_H264:
> + return V4L2_CID_MPEG_VIDEO_H264_HIER_CODING_L5_BR;
> + case LAYER0_BITRATE_HEVC:
> + return V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L0_BR;
> + case LAYER1_BITRATE_HEVC:
> + return V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L1_BR;
> + case LAYER2_BITRATE_HEVC:
> + return V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L2_BR;
> + case LAYER3_BITRATE_HEVC:
> + return V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L3_BR;
> + case LAYER4_BITRATE_HEVC:
> + return V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L4_BR;
> + case LAYER5_BITRATE_HEVC:
> + return V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L5_BR;
> default:
> return 0;
> }
> @@ -575,7 +643,64 @@ int iris_set_header_mode_gen2(struct iris_inst *inst, enum platform_inst_fw_cap_
> &hfi_val, sizeof(u32));
> }
>
> -int iris_set_bitrate(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id)
> +int iris_set_bitrate_gen1(struct iris_inst *inst, enum platform_inst_fw_cap_type cap_id)
> +{
> + const struct iris_hfi_session_ops *hfi_ops = inst->hfi_session_ops;
> + u32 entropy_mode = inst->fw_caps[ENTROPY_MODE].value;
> + u32 bitrate = inst->fw_caps[cap_id].value;
> + u32 hfi_id = inst->fw_caps[cap_id].hfi_id;
> + struct hfi_bitrate hfi_val;
> + u32 max_bitrate;
> +
> + if (!(inst->fw_caps[cap_id].flags & CAP_FLAG_CLIENT_SET) && cap_id != BITRATE)
> + return -EINVAL;
Why do you need this check?
> +
> + if (inst->codec == V4L2_PIX_FMT_HEVC) {
> + max_bitrate = CABAC_MAX_BITRATE;
> + } else {
> + if (entropy_mode == V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CABAC)
> + max_bitrate = CABAC_MAX_BITRATE;
> + else
> + max_bitrate = CAVLC_MAX_BITRATE;
> + }
> +
Other than that LGTM.
--
With best wishes
Dmitry