diff --git a/driver/platform/waipio/src/msm_vidc_waipio.c b/driver/platform/waipio/src/msm_vidc_waipio.c index 88e0b97397..5bc96bb904 100644 --- a/driver/platform/waipio/src/msm_vidc_waipio.c +++ b/driver/platform/waipio/src/msm_vidc_waipio.c @@ -134,7 +134,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}}, + {PROFILE, MIN_FRAME_QP, MAX_FRAME_QP, I_FRAME_QP, META_ROI_INFO, + BLUR_TYPES}}, {PIX_FMTS, DEC, HEVC|HEIC, MSM_VIDC_FMT_NV12, @@ -236,7 +237,7 @@ static struct msm_platform_inst_capability instance_data_waipio[] = { CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_INPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED, {0}, - {0}, + {BLUR_TYPES}, NULL, msm_vidc_set_flip}, {VFLIP, ENC, CODECS_ALL, @@ -257,7 +258,7 @@ static struct msm_platform_inst_capability instance_data_waipio[] = { HFI_PROP_ROTATION, CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT, {0}, - {0}, + {BLUR_TYPES}, NULL, msm_vidc_set_rotation}, {SUPER_FRAME, ENC, H264|HEVC, @@ -350,7 +351,7 @@ static struct msm_platform_inst_capability instance_data_waipio[] = { {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}, + SLICE_MODE, META_ROI_INFO, BLUR_TYPES}, msm_vidc_adjust_bitrate_mode, msm_vidc_set_u32_enum}, {BITRATE_MODE, ENC, HEVC, @@ -368,7 +369,7 @@ static struct msm_platform_inst_capability instance_data_waipio[] = { CONSTANT_QUALITY, ENH_LAYER_COUNT, CONTENT_ADAPTIVE_CODING, BIT_RATE, BITRATE_BOOST, MIN_QUALITY, VBV_DELAY, - PEAK_BITRATE, SLICE_MODE, META_ROI_INFO}, + PEAK_BITRATE, SLICE_MODE, META_ROI_INFO, BLUR_TYPES}, msm_vidc_adjust_bitrate_mode, msm_vidc_set_u32_enum}, {LOSSLESS, ENC, HEVC|HEIC, @@ -427,18 +428,24 @@ static struct msm_platform_inst_capability instance_data_waipio[] = { msm_vidc_adjust_b_frame, msm_vidc_set_u32}, {BLUR_TYPES, ENC, CODECS_ALL, - VIDC_BLUR_NONE, VIDC_BLUR_ADAPTIVE, 1, VIDC_BLUR_NONE, + VIDC_BLUR_NONE, VIDC_BLUR_ADAPTIVE, 1, VIDC_BLUR_ADAPTIVE, V4L2_CID_MPEG_VIDC_VIDEO_BLUR_TYPES, HFI_PROP_BLUR_TYPES, - CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT, - {0}, {0}, - NULL, msm_vidc_set_u32_enum}, + CAP_FLAG_OUTPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED, + {PIX_FMTS, ROTATION, HFLIP, BITRATE_MODE, + CONTENT_ADAPTIVE_CODING}, + {BLUR_RESOLUTION}, + msm_vidc_adjust_blur_type, msm_vidc_set_blur_type}, {BLUR_RESOLUTION, ENC, CODECS_ALL, 0, S32_MAX, 1, 0, V4L2_CID_MPEG_VIDC_VIDEO_BLUR_RESOLUTION, HFI_PROP_BLUR_RESOLUTION, - CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT}, + CAP_FLAG_OUTPUT_PORT | CAP_FLAG_INPUT_PORT | + CAP_FLAG_DYNAMIC_ALLOWED, + {BLUR_TYPES}, + {0}, + msm_vidc_adjust_blur_resolution, msm_vidc_set_blur_resolution}, {CSC, ENC, CODECS_ALL, V4L2_MPEG_MSM_VIDC_DISABLE, @@ -530,7 +537,8 @@ static struct msm_platform_inst_capability instance_data_waipio[] = { V4L2_CID_MPEG_VIDC_CONTENT_ADAPTIVE_CODING, HFI_PROP_CONTENT_ADAPTIVE_CODING, CAP_FLAG_OUTPUT_PORT, - {BITRATE_MODE}, {0}, + {BITRATE_MODE}, + {BLUR_TYPES}, NULL, msm_vidc_set_vbr_related_properties}, {BITRATE_BOOST, ENC, H264|HEVC, diff --git a/driver/vidc/inc/msm_vidc_control.h b/driver/vidc/inc/msm_vidc_control.h index 7cc0635476..895cacf003 100644 --- a/driver/vidc/inc/msm_vidc_control.h +++ b/driver/vidc/inc/msm_vidc_control.h @@ -37,6 +37,8 @@ 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_blur_type(void *instance, struct v4l2_ctrl *ctrl); +int msm_vidc_adjust_blur_resolution(void *instance, struct v4l2_ctrl *ctrl); int msm_vidc_adjust_v4l2_properties(struct msm_vidc_inst *inst); int msm_vidc_adjust_session_priority(void *instance, struct v4l2_ctrl *ctrl); int msm_vidc_adjust_roi_info(void *instance, struct v4l2_ctrl *ctrl); @@ -83,6 +85,10 @@ int msm_vidc_set_flip(void *instance, enum msm_vidc_inst_capability_type cap_id); int msm_vidc_set_rotation(void *instance, enum msm_vidc_inst_capability_type cap_id); +int msm_vidc_set_blur_type(void *instance, + enum msm_vidc_inst_capability_type cap_id); +int msm_vidc_set_blur_resolution(void *instance, + enum msm_vidc_inst_capability_type cap_id); int msm_vidc_set_s32(void *instance, enum msm_vidc_inst_capability_type cap_id); int msm_vidc_set_q16(void *instance, diff --git a/driver/vidc/src/msm_vidc_control.c b/driver/vidc/src/msm_vidc_control.c index 14b783a9f4..b36e6f516b 100644 --- a/driver/vidc/src/msm_vidc_control.c +++ b/driver/vidc/src/msm_vidc_control.c @@ -1603,6 +1603,90 @@ int msm_vidc_adjust_hevc_frame_qp(void *instance, struct v4l2_ctrl *ctrl) return rc; } +int msm_vidc_adjust_blur_type(void *instance, struct v4l2_ctrl *ctrl) +{ + struct msm_vidc_inst_capability *capability; + s32 adjusted_value; + struct msm_vidc_inst *inst = (struct msm_vidc_inst *) instance; + s32 rc_type = -1, rotation = -1, hflip = -1, vflip = -1, cac = -1; + s32 pix_fmts = -1; + + if (!inst || !inst->capabilities) { + d_vpr_e("%s: invalid params\n", __func__); + return -EINVAL; + } + capability = inst->capabilities; + + if (inst->vb2q[OUTPUT_PORT].streaming) + return 0; + + adjusted_value = ctrl ? ctrl->val : + capability->cap[BLUR_TYPES].value; + + if (adjusted_value == VIDC_BLUR_NONE) + return 0; + + if (msm_vidc_get_parent_value(inst, BLUR_TYPES, BITRATE_MODE, + &rc_type, __func__) || + msm_vidc_get_parent_value(inst, BLUR_TYPES, ROTATION, + &rotation, __func__) || + msm_vidc_get_parent_value(inst, BLUR_TYPES, + CONTENT_ADAPTIVE_CODING, &cac, __func__) || + msm_vidc_get_parent_value(inst, BLUR_TYPES, HFLIP, + &hflip, __func__) || + msm_vidc_get_parent_value(inst, BLUR_TYPES, PIX_FMTS, + &pix_fmts, __func__)) + return -EINVAL; + + vflip = capability->cap[VFLIP].value; + + if (adjusted_value == VIDC_BLUR_EXTERNAL) { + if (rotation || hflip || vflip || is_scaling_enabled(inst)) { + adjusted_value = VIDC_BLUR_NONE; + } + } else if (adjusted_value == VIDC_BLUR_ADAPTIVE) { + if (rotation || hflip || vflip || is_scaling_enabled(inst) || + (rc_type != HFI_RC_VBR_CFR) || + !cac || is_10bit_colorformat(pix_fmts)) { + adjusted_value = VIDC_BLUR_NONE; + } + } + + msm_vidc_update_cap_value(inst, BLUR_TYPES, + adjusted_value, __func__); + + return 0; +} + +int msm_vidc_adjust_blur_resolution(void *instance, struct v4l2_ctrl *ctrl) +{ + struct msm_vidc_inst_capability *capability; + s32 adjusted_value; + struct msm_vidc_inst *inst = (struct msm_vidc_inst *) instance; + s32 blur_type = -1; + + if (!inst || !inst->capabilities) { + d_vpr_e("%s: invalid params\n", __func__); + return -EINVAL; + } + capability = inst->capabilities; + + adjusted_value = ctrl ? ctrl->val : + capability->cap[BLUR_RESOLUTION].value; + + if (msm_vidc_get_parent_value(inst, BLUR_RESOLUTION, BLUR_TYPES, + &blur_type, __func__)) + return -EINVAL; + + if (blur_type != VIDC_BLUR_EXTERNAL) + return 0; + + msm_vidc_update_cap_value(inst, BLUR_RESOLUTION, + adjusted_value, __func__); + + return 0; +} + int msm_vidc_adjust_session_priority(void *instance, struct v4l2_ctrl *ctrl) { int rc = 0; @@ -2423,8 +2507,19 @@ int msm_vidc_set_flip(void *instance, if (vflip) hfi_value |= HFI_VERTICAL_FLIP; + if (inst->vb2q[OUTPUT_PORT].streaming) { + if (hfi_value != HFI_DISABLE_FLIP) { + rc = msm_vidc_set_req_sync_frame(inst, + REQUEST_I_FRAME); + if (rc) + return rc; + } + } + rc = msm_vidc_packetize_control(inst, cap_id, HFI_PAYLOAD_U32_ENUM, &hfi_value, sizeof(u32), __func__); + if (rc) + return rc; return rc; } @@ -2453,6 +2548,75 @@ int msm_vidc_set_rotation(void *instance, return rc; } +int msm_vidc_set_blur_type(void *instance, + enum msm_vidc_inst_capability_type cap_id) +{ + int rc = 0; + struct msm_vidc_inst *inst = (struct msm_vidc_inst *)instance; + u32 hfi_value; + + if (!inst || !inst->capabilities) { + d_vpr_e("%s: invalid params\n", __func__); + return -EINVAL; + } + + if (inst->vb2q[OUTPUT_PORT].streaming) + return 0; + + rc = msm_vidc_v4l2_to_hfi_enum(inst, cap_id, &hfi_value); + if (rc) + return -EINVAL; + + rc = msm_vidc_packetize_control(inst, cap_id, HFI_PAYLOAD_U32_ENUM, + &hfi_value, sizeof(u32), __func__); + if (rc) + return rc; + + return rc; +} + +int msm_vidc_set_blur_resolution(void *instance, + enum msm_vidc_inst_capability_type cap_id) +{ + int rc = 0; + struct msm_vidc_inst *inst = (struct msm_vidc_inst *)instance; + s32 blur_type = -1; + u32 hfi_value, blur_width, blur_height; + + if (!inst || !inst->capabilities) { + d_vpr_e("%s: invalid params\n", __func__); + return -EINVAL; + } + + if (msm_vidc_get_parent_value(inst, cap_id, + BLUR_TYPES, &blur_type, __func__)) + return -EINVAL; + + if (blur_type != VIDC_BLUR_EXTERNAL) + return 0; + + hfi_value = inst->capabilities->cap[cap_id].value; + + blur_width = (hfi_value & 0xFFFF0000) >> 16; + blur_height = hfi_value & 0xFFFF; + + if (blur_width > inst->compose.width || + blur_height > inst->compose.height) { + i_vpr_e(inst, + "%s: blur wxh: %dx%d exceeds compose wxh: %dx%d\n", + __func__, blur_width, blur_height, + inst->compose.width, inst->compose.height); + hfi_value = (inst->compose.width << 16) | inst->compose.height; + } + + rc = msm_vidc_packetize_control(inst, cap_id, HFI_PAYLOAD_32_PACKED, + &hfi_value, sizeof(u32), __func__); + if (rc) + return rc; + + return rc; +} + int msm_vidc_set_q16(void *instance, enum msm_vidc_inst_capability_type cap_id) {