On 18/11/2020 07:54, Dikshita Agarwal wrote: > Add support for frame type specific min and max qp controls > for encoder. > > Signed-off-by: Dikshita Agarwal <dikshita@xxxxxxxxxxxxxx> > --- > drivers/media/platform/qcom/venus/core.h | 18 +++++++++ > drivers/media/platform/qcom/venus/venc.c | 21 ++++++++--- > drivers/media/platform/qcom/venus/venc_ctrls.c | 51 ++++++++++++++++++++++++++ > 3 files changed, 85 insertions(+), 5 deletions(-) > > diff --git a/drivers/media/platform/qcom/venus/core.h b/drivers/media/platform/qcom/venus/core.h > index 3bc129a..6a764c9 100644 > --- a/drivers/media/platform/qcom/venus/core.h > +++ b/drivers/media/platform/qcom/venus/core.h > @@ -230,10 +230,28 @@ struct venc_controls { > u32 h264_b_qp; > u32 h264_min_qp; > u32 h264_max_qp; > + u32 h264_i_min_qp; > + u32 h264_i_max_qp; > + u32 h264_p_min_qp; > + u32 h264_p_max_qp; > + u32 h264_b_min_qp; > + u32 h264_b_max_qp; > u32 h264_loop_filter_mode; > s32 h264_loop_filter_alpha; > s32 h264_loop_filter_beta; > > + u32 hevc_i_qp; > + u32 hevc_p_qp; > + u32 hevc_b_qp; > + u32 hevc_min_qp; > + u32 hevc_max_qp; > + u32 hevc_i_min_qp; > + u32 hevc_i_max_qp; > + u32 hevc_p_min_qp; > + u32 hevc_p_max_qp; > + u32 hevc_b_min_qp; > + u32 hevc_b_max_qp; > + > u32 vp8_min_qp; > u32 vp8_max_qp; > > diff --git a/drivers/media/platform/qcom/venus/venc.c b/drivers/media/platform/qcom/venus/venc.c > index 0bf92cc..f2f5a85 100644 > --- a/drivers/media/platform/qcom/venus/venc.c > +++ b/drivers/media/platform/qcom/venus/venc.c > @@ -668,17 +668,28 @@ static int venc_set_properties(struct venus_inst *inst) > return ret; > > ptype = HFI_PROPERTY_PARAM_VENC_SESSION_QP; > - quant.qp_i = ctr->h264_i_qp; > - quant.qp_p = ctr->h264_p_qp; > - quant.qp_b = ctr->h264_b_qp; > + if (inst->fmt_cap->pixfmt == V4L2_PIX_FMT_HEVC) { > + quant.qp_i = ctr->hevc_i_qp; > + quant.qp_p = ctr->hevc_p_qp; > + quant.qp_b = ctr->hevc_b_qp; > + } else { > + quant.qp_i = ctr->h264_i_qp; > + quant.qp_p = ctr->h264_p_qp; > + quant.qp_b = ctr->h264_b_qp; > + } > quant.layer_id = 0; > ret = hfi_session_set_property(inst, ptype, &quant); > if (ret) > return ret; > > ptype = HFI_PROPERTY_PARAM_VENC_SESSION_QP_RANGE; > - quant_range.min_qp = ctr->h264_min_qp; > - quant_range.max_qp = ctr->h264_max_qp; > + if (inst->fmt_cap->pixfmt == V4L2_PIX_FMT_HEVC) { > + quant_range.min_qp = ctr->hevc_min_qp; > + quant_range.max_qp = ctr->hevc_max_qp; > + } else { > + quant_range.min_qp = ctr->h264_min_qp; > + quant_range.max_qp = ctr->h264_max_qp; > + } > quant_range.layer_id = 0; > ret = hfi_session_set_property(inst, ptype, &quant_range); > if (ret) > diff --git a/drivers/media/platform/qcom/venus/venc_ctrls.c b/drivers/media/platform/qcom/venus/venc_ctrls.c > index 0708b3b..cd131e3 100644 > --- a/drivers/media/platform/qcom/venus/venc_ctrls.c > +++ b/drivers/media/platform/qcom/venus/venc_ctrls.c > @@ -125,9 +125,60 @@ static int venc_op_s_ctrl(struct v4l2_ctrl *ctrl) > case V4L2_CID_MPEG_VIDEO_H264_MIN_QP: > ctr->h264_min_qp = ctrl->val; > break; > + case V4L2_CID_MPEG_VIDEO_H264_I_FRAME_MIN_QP: > + ctr->h264_i_min_qp = ctrl->val; > + break; > + case V4L2_CID_MPEG_VIDEO_H264_P_FRAME_MIN_QP: > + ctr->h264_p_min_qp = ctrl->val; > + break; > + case V4L2_CID_MPEG_VIDEO_H264_B_FRAME_MIN_QP: > + ctr->h264_b_min_qp = ctrl->val; > + break; > case V4L2_CID_MPEG_VIDEO_H264_MAX_QP: > ctr->h264_max_qp = ctrl->val; > break; > + case V4L2_CID_MPEG_VIDEO_H264_I_FRAME_MAX_QP: > + ctr->h264_i_max_qp = ctrl->val; > + break; > + case V4L2_CID_MPEG_VIDEO_H264_P_FRAME_MAX_QP: > + ctr->h264_p_max_qp = ctrl->val; > + break; > + case V4L2_CID_MPEG_VIDEO_H264_B_FRAME_MAX_QP: > + ctr->h264_b_max_qp = ctrl->val; > + break; > + case V4L2_CID_MPEG_VIDEO_HEVC_I_FRAME_QP: > + ctr->hevc_i_qp = ctrl->val; > + break; > + case V4L2_CID_MPEG_VIDEO_HEVC_P_FRAME_QP: > + ctr->hevc_p_qp = ctrl->val; > + break; > + case V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_QP: > + ctr->hevc_b_qp = ctrl->val; > + break; > + case V4L2_CID_MPEG_VIDEO_HEVC_MIN_QP: > + ctr->hevc_min_qp = ctrl->val; > + break; > + case V4L2_CID_MPEG_VIDEO_HEVC_I_FRAME_MIN_QP: > + ctr->hevc_i_min_qp = ctrl->val; > + break; > + case V4L2_CID_MPEG_VIDEO_HEVC_P_FRAME_MIN_QP: > + ctr->hevc_p_min_qp = ctrl->val; > + break; > + case V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_MIN_QP: > + ctr->hevc_b_min_qp = ctrl->val; > + break; > + case V4L2_CID_MPEG_VIDEO_HEVC_MAX_QP: > + ctr->hevc_max_qp = ctrl->val; > + break; > + case V4L2_CID_MPEG_VIDEO_HEVC_I_FRAME_MAX_QP: > + ctr->hevc_i_max_qp = ctrl->val; > + break; > + case V4L2_CID_MPEG_VIDEO_HEVC_P_FRAME_MAX_QP: > + ctr->hevc_p_max_qp = ctrl->val; > + break; > + case V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_MAX_QP: > + ctr->hevc_b_max_qp = ctrl->val; > + break; > case V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE: > ctr->multi_slice_mode = ctrl->val; > break; > This looks incomplete: the new controls aren't actually added to the driver with v4l2_ctrl_new_std(). Did you test this? Regards, Hans