diff --git a/driver/platform/waipio/src/msm_vidc_waipio.c b/driver/platform/waipio/src/msm_vidc_waipio.c index 5dbb14ae26..952ddeb521 100644 --- a/driver/platform/waipio/src/msm_vidc_waipio.c +++ b/driver/platform/waipio/src/msm_vidc_waipio.c @@ -138,8 +138,8 @@ static struct msm_platform_inst_capability instance_data_waipio[] = { 0, 0, CAP_FLAG_ROOT, {0}, - {PROFILE, MIN_FRAME_QP, MAX_FRAME_QP, I_FRAME_QP, META_ROI_INFO, - BLUR_TYPES, MIN_QUALITY}}, + {PROFILE, MIN_FRAME_QP, MAX_FRAME_QP, I_FRAME_QP, P_FRAME_QP, + B_FRAME_QP, META_ROI_INFO, BLUR_TYPES, MIN_QUALITY}}, {PIX_FMTS, DEC, HEVC|HEIC, MSM_VIDC_FMT_NV12, @@ -363,10 +363,10 @@ static struct msm_platform_inst_capability instance_data_waipio[] = { CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU, {0}, {LTR_COUNT, IR_RANDOM, TIME_DELTA_BASED_RC, I_FRAME_QP, - ENH_LAYER_COUNT, BIT_RATE, CONTENT_ADAPTIVE_CODING, - BITRATE_BOOST, MIN_QUALITY, VBV_DELAY, PEAK_BITRATE, - SLICE_MODE, META_ROI_INFO, BLUR_TYPES, - LOWLATENCY_MODE}, + P_FRAME_QP, B_FRAME_QP, ENH_LAYER_COUNT, BIT_RATE, + CONTENT_ADAPTIVE_CODING, BITRATE_BOOST, MIN_QUALITY, + VBV_DELAY, PEAK_BITRATE,SLICE_MODE, META_ROI_INFO, + BLUR_TYPES, LOWLATENCY_MODE}, msm_vidc_adjust_bitrate_mode, msm_vidc_set_u32_enum}, {BITRATE_MODE, ENC, HEVC, @@ -381,7 +381,7 @@ static struct msm_platform_inst_capability instance_data_waipio[] = { CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU, {0}, {LTR_COUNT, IR_RANDOM, TIME_DELTA_BASED_RC, I_FRAME_QP, - CONSTANT_QUALITY, ENH_LAYER_COUNT, + P_FRAME_QP, B_FRAME_QP, CONSTANT_QUALITY, ENH_LAYER_COUNT, CONTENT_ADAPTIVE_CODING, BIT_RATE, BITRATE_BOOST, MIN_QUALITY, VBV_DELAY, PEAK_BITRATE, SLICE_MODE, META_ROI_INFO, BLUR_TYPES, @@ -711,14 +711,14 @@ static struct msm_platform_inst_capability instance_data_waipio[] = { MIN_QP_10BIT, MAX_QP, 1, MAX_QP, V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_MAX_QP}, - {I_FRAME_QP, ENC, HEVC|HEIC, + {I_FRAME_QP, ENC, HEVC, MIN_QP_10BIT, MAX_QP, 1, DEFAULT_QP, V4L2_CID_MPEG_VIDEO_HEVC_I_FRAME_QP, HFI_PROP_QP_PACKED, CAP_FLAG_OUTPUT_PORT | CAP_FLAG_INPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED, {PIX_FMTS, BITRATE_MODE}, {0}, - msm_vidc_adjust_hevc_frame_qp, msm_vidc_set_frame_qp}, + msm_vidc_adjust_hevc_i_frame_qp, msm_vidc_set_frame_qp}, {I_FRAME_QP, ENC, H264, MIN_QP_8BIT, MAX_QP, 1, DEFAULT_QP, @@ -729,21 +729,41 @@ static struct msm_platform_inst_capability instance_data_waipio[] = { {BITRATE_MODE}, {0}, NULL, msm_vidc_set_frame_qp}, - {P_FRAME_QP, ENC, HEVC|HEIC, + {P_FRAME_QP, ENC, HEVC, MIN_QP_10BIT, MAX_QP, 1, DEFAULT_QP, - V4L2_CID_MPEG_VIDEO_HEVC_P_FRAME_QP}, + V4L2_CID_MPEG_VIDEO_HEVC_P_FRAME_QP, + HFI_PROP_QP_PACKED, + CAP_FLAG_OUTPUT_PORT | CAP_FLAG_INPUT_PORT | + CAP_FLAG_DYNAMIC_ALLOWED, + {PIX_FMTS, BITRATE_MODE}, {0}, + msm_vidc_adjust_hevc_p_frame_qp, msm_vidc_set_frame_qp}, {P_FRAME_QP, ENC, H264, MIN_QP_8BIT, MAX_QP, 1, DEFAULT_QP, - V4L2_CID_MPEG_VIDEO_H264_P_FRAME_QP}, + V4L2_CID_MPEG_VIDEO_H264_P_FRAME_QP, + HFI_PROP_QP_PACKED, + CAP_FLAG_OUTPUT_PORT | CAP_FLAG_INPUT_PORT | + CAP_FLAG_DYNAMIC_ALLOWED, + {BITRATE_MODE}, {0}, + NULL, msm_vidc_set_frame_qp}, - {B_FRAME_QP, ENC, HEVC|HEIC, + {B_FRAME_QP, ENC, HEVC, MIN_QP_10BIT, MAX_QP, 1, DEFAULT_QP, - V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_QP}, + V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_QP, + HFI_PROP_QP_PACKED, + CAP_FLAG_OUTPUT_PORT | CAP_FLAG_INPUT_PORT | + CAP_FLAG_DYNAMIC_ALLOWED, + {PIX_FMTS, BITRATE_MODE}, {0}, + msm_vidc_adjust_hevc_b_frame_qp, msm_vidc_set_frame_qp}, {B_FRAME_QP, ENC, H264, MIN_QP_8BIT, MAX_QP, 1, DEFAULT_QP, - V4L2_CID_MPEG_VIDEO_H264_B_FRAME_QP}, + V4L2_CID_MPEG_VIDEO_H264_B_FRAME_QP, + HFI_PROP_QP_PACKED, + CAP_FLAG_OUTPUT_PORT | CAP_FLAG_INPUT_PORT | + CAP_FLAG_DYNAMIC_ALLOWED, + {BITRATE_MODE}, {0}, + NULL, msm_vidc_set_frame_qp}, {LAYER_TYPE, ENC, HEVC, V4L2_MPEG_VIDEO_HEVC_HIERARCHICAL_CODING_B, diff --git a/driver/vidc/inc/msm_vidc_control.h b/driver/vidc/inc/msm_vidc_control.h index 72c283e226..dd35e7534d 100644 --- a/driver/vidc/inc/msm_vidc_control.h +++ b/driver/vidc/inc/msm_vidc_control.h @@ -31,7 +31,9 @@ int msm_vidc_adjust_b_frame(void *instance, struct v4l2_ctrl *ctrl); int msm_vidc_adjust_peak_bitrate(void *instance, struct v4l2_ctrl *ctrl); int msm_vidc_adjust_hevc_min_qp(void *instance, struct v4l2_ctrl *ctrl); int msm_vidc_adjust_hevc_max_qp(void *instance, struct v4l2_ctrl *ctrl); -int msm_vidc_adjust_hevc_frame_qp(void *instance, struct v4l2_ctrl *ctrl); +int msm_vidc_adjust_hevc_i_frame_qp(void *instance, struct v4l2_ctrl *ctrl); +int msm_vidc_adjust_hevc_p_frame_qp(void *instance, struct v4l2_ctrl *ctrl); +int msm_vidc_adjust_hevc_b_frame_qp(void *instance, struct v4l2_ctrl *ctrl); int msm_vidc_adjust_blur_type(void *instance, struct v4l2_ctrl *ctrl); int msm_vidc_adjust_blur_resolution(void *instance, struct v4l2_ctrl *ctrl); int msm_vidc_adjust_cac(void *instance, struct v4l2_ctrl *ctrl); diff --git a/driver/vidc/inc/msm_vidc_internal.h b/driver/vidc/inc/msm_vidc_internal.h index 36e7addf28..c7305719e8 100644 --- a/driver/vidc/inc/msm_vidc_internal.h +++ b/driver/vidc/inc/msm_vidc_internal.h @@ -40,8 +40,8 @@ #define MAX_SUPPORTED_INSTANCES 16 #define MAX_BSE_VPP_DELAY 6 #define DEFAULT_BSE_VPP_DELAY 2 -#define MAX_CAP_PARENTS 16 -#define MAX_CAP_CHILDREN 16 +#define MAX_CAP_PARENTS 20 +#define MAX_CAP_CHILDREN 20 #define DEFAULT_BITSTREM_ALIGNMENT 16 #define H265_BITSTREM_ALIGNMENT 32 #define DEFAULT_MAX_HOST_BUF_COUNT 64 diff --git a/driver/vidc/src/msm_vidc_control.c b/driver/vidc/src/msm_vidc_control.c index 6d1a010f22..de343daf9c 100644 --- a/driver/vidc/src/msm_vidc_control.c +++ b/driver/vidc/src/msm_vidc_control.c @@ -363,9 +363,6 @@ static int msm_vidc_adjust_hevc_qp(struct msm_vidc_inst *inst, CAP_TO_8BIT_QP(capability->cap[I_FRAME_MAX_QP].value); CAP_TO_8BIT_QP(capability->cap[P_FRAME_MAX_QP].value); CAP_TO_8BIT_QP(capability->cap[B_FRAME_MAX_QP].value); - } else if (cap_id == I_FRAME_QP) { - CAP_TO_8BIT_QP(capability->cap[P_FRAME_QP].value); - CAP_TO_8BIT_QP(capability->cap[B_FRAME_QP].value); } exit: @@ -1751,7 +1748,7 @@ int msm_vidc_adjust_hevc_max_qp(void *instance, struct v4l2_ctrl *ctrl) return rc; } -int msm_vidc_adjust_hevc_frame_qp(void *instance, struct v4l2_ctrl *ctrl) +int msm_vidc_adjust_hevc_i_frame_qp(void *instance, struct v4l2_ctrl *ctrl) { int rc = 0; struct msm_vidc_inst_capability *capability; @@ -1768,6 +1765,54 @@ int msm_vidc_adjust_hevc_frame_qp(void *instance, struct v4l2_ctrl *ctrl) ctrl->val, __func__); rc = msm_vidc_adjust_hevc_qp(inst, I_FRAME_QP); + if (rc) + return rc; + + return rc; +} + +int msm_vidc_adjust_hevc_p_frame_qp(void *instance, struct v4l2_ctrl *ctrl) +{ + int rc = 0; + struct msm_vidc_inst_capability *capability; + struct msm_vidc_inst *inst = (struct msm_vidc_inst *) instance; + + if (!inst || !inst->capabilities) { + d_vpr_e("%s: invalid params\n", __func__); + return -EINVAL; + } + capability = inst->capabilities; + + if (ctrl) + msm_vidc_update_cap_value(inst, P_FRAME_QP, + ctrl->val, __func__); + + rc = msm_vidc_adjust_hevc_qp(inst, P_FRAME_QP); + if (rc) + return rc; + + return rc; +} + +int msm_vidc_adjust_hevc_b_frame_qp(void *instance, struct v4l2_ctrl *ctrl) +{ + int rc = 0; + struct msm_vidc_inst_capability *capability; + struct msm_vidc_inst *inst = (struct msm_vidc_inst *) instance; + + if (!inst || !inst->capabilities) { + d_vpr_e("%s: invalid params\n", __func__); + return -EINVAL; + } + capability = inst->capabilities; + + if (ctrl) + msm_vidc_update_cap_value(inst, B_FRAME_QP, + ctrl->val, __func__); + + rc = msm_vidc_adjust_hevc_qp(inst, B_FRAME_QP); + if (rc) + return rc; return rc; } @@ -2578,10 +2623,19 @@ int msm_vidc_set_frame_qp(void *instance, } capab = inst->capabilities; - if (msm_vidc_get_parent_value(inst, I_FRAME_QP, + if (msm_vidc_get_parent_value(inst, cap_id, BITRATE_MODE, &rc_type, __func__)) return -EINVAL; + if (inst->vb2q[OUTPUT_PORT].streaming) { + if (rc_type != HFI_RC_OFF) { + i_vpr_h(inst, + "%s: dynamic qp not allowed for rc type %d\n", + __func__, rc_type); + return 0; + } + } + if (rc_type == HFI_RC_OFF) { /* Mandatorily set for rc off case */ i_qp_enable = p_qp_enable = b_qp_enable = 1; diff --git a/driver/vidc/src/msm_vidc_driver.c b/driver/vidc/src/msm_vidc_driver.c index 66ee0fb224..38d275657e 100644 --- a/driver/vidc/src/msm_vidc_driver.c +++ b/driver/vidc/src/msm_vidc_driver.c @@ -1222,6 +1222,11 @@ bool msm_vidc_allow_s_ctrl(struct msm_vidc_inst *inst, u32 id) case V4L2_CID_HFLIP: case V4L2_CID_VFLIP: case V4L2_CID_MPEG_VIDEO_HEVC_I_FRAME_QP: + case V4L2_CID_MPEG_VIDEO_HEVC_P_FRAME_QP: + case V4L2_CID_MPEG_VIDEO_HEVC_B_FRAME_QP: + case V4L2_CID_MPEG_VIDEO_H264_I_FRAME_QP: + case V4L2_CID_MPEG_VIDEO_H264_P_FRAME_QP: + case V4L2_CID_MPEG_VIDEO_H264_B_FRAME_QP: case V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_LAYER: case V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING_LAYER: case V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_L0_BR: @@ -1255,7 +1260,7 @@ bool msm_vidc_allow_s_ctrl(struct msm_vidc_inst *inst, u32 id) exit: if (!allow) - i_vpr_e(inst, "%s: id %d not allowed in state %s\n", + i_vpr_e(inst, "%s: id %#x not allowed in state %s\n", __func__, id, state_name(inst->state)); return allow; }