Message ID | 1605682497-29273-4-git-send-email-dikshita@codeaurora.org |
---|---|
State | New |
Headers | show |
Series | Add new controls for QP and layer bitrate | expand |
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@codeaurora.org> > --- > 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
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;
Add support for frame type specific min and max qp controls for encoder. Signed-off-by: Dikshita Agarwal <dikshita@codeaurora.org> --- 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(-)