diff --git a/driver/platform/waipio/src/msm_vidc_waipio.c b/driver/platform/waipio/src/msm_vidc_waipio.c index b331acc744..92da0bfcca 100644 --- a/driver/platform/waipio/src/msm_vidc_waipio.c +++ b/driver/platform/waipio/src/msm_vidc_waipio.c @@ -962,7 +962,7 @@ static struct msm_platform_inst_capability instance_data_waipio[] = { {0}, NULL, msm_vidc_set_u32_enum}, - {LEVEL, ENC|DEC, H264, + {LEVEL, DEC, H264, V4L2_MPEG_VIDEO_H264_LEVEL_1_0, V4L2_MPEG_VIDEO_H264_LEVEL_6_2, BIT(V4L2_MPEG_VIDEO_H264_LEVEL_1_0) | @@ -993,7 +993,36 @@ static struct msm_platform_inst_capability instance_data_waipio[] = { {0}, NULL, msm_vidc_set_u32_enum}, - {LEVEL, ENC|DEC, HEVC|HEIC, + {LEVEL, ENC, H264, + V4L2_MPEG_VIDEO_H264_LEVEL_1_0, + V4L2_MPEG_VIDEO_H264_LEVEL_6_0, + BIT(V4L2_MPEG_VIDEO_H264_LEVEL_1_0) | + BIT(V4L2_MPEG_VIDEO_H264_LEVEL_1B) | + BIT(V4L2_MPEG_VIDEO_H264_LEVEL_1_1) | + BIT(V4L2_MPEG_VIDEO_H264_LEVEL_1_2) | + BIT(V4L2_MPEG_VIDEO_H264_LEVEL_1_3) | + BIT(V4L2_MPEG_VIDEO_H264_LEVEL_2_0) | + BIT(V4L2_MPEG_VIDEO_H264_LEVEL_2_1) | + BIT(V4L2_MPEG_VIDEO_H264_LEVEL_2_2) | + BIT(V4L2_MPEG_VIDEO_H264_LEVEL_3_0) | + BIT(V4L2_MPEG_VIDEO_H264_LEVEL_3_1) | + BIT(V4L2_MPEG_VIDEO_H264_LEVEL_3_2) | + BIT(V4L2_MPEG_VIDEO_H264_LEVEL_4_0) | + BIT(V4L2_MPEG_VIDEO_H264_LEVEL_4_1) | + BIT(V4L2_MPEG_VIDEO_H264_LEVEL_4_2) | + BIT(V4L2_MPEG_VIDEO_H264_LEVEL_5_0) | + BIT(V4L2_MPEG_VIDEO_H264_LEVEL_5_1) | + BIT(V4L2_MPEG_VIDEO_H264_LEVEL_5_2) | + BIT(V4L2_MPEG_VIDEO_H264_LEVEL_6_0), + V4L2_MPEG_VIDEO_H264_LEVEL_5_0, + V4L2_CID_MPEG_VIDEO_H264_LEVEL, + HFI_PROP_LEVEL, + CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU, + {0}, + {0}, + NULL, msm_vidc_set_u32_enum}, + + {LEVEL, DEC, HEVC|HEIC, V4L2_MPEG_VIDEO_HEVC_LEVEL_1, V4L2_MPEG_VIDEO_HEVC_LEVEL_6_2, BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_1) | @@ -1017,6 +1046,28 @@ static struct msm_platform_inst_capability instance_data_waipio[] = { {0}, NULL, msm_vidc_set_u32_enum}, + {LEVEL, ENC, HEVC|HEIC, + V4L2_MPEG_VIDEO_HEVC_LEVEL_1, + V4L2_MPEG_VIDEO_HEVC_LEVEL_6, + BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_1) | + BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_2) | + BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_2_1) | + BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_3) | + BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_3_1) | + BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_4) | + BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_4_1) | + BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_5) | + BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_5_1) | + BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_5_2) | + BIT(V4L2_MPEG_VIDEO_HEVC_LEVEL_6), + V4L2_MPEG_VIDEO_HEVC_LEVEL_5, + V4L2_CID_MPEG_VIDEO_HEVC_LEVEL, + HFI_PROP_LEVEL, + CAP_FLAG_ROOT | CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU, + {0}, + {0}, + NULL, msm_vidc_set_u32_enum}, + /* TODO: Bring the VP9 Level upstream GKI change, and level cap here: * go/videogki */ diff --git a/driver/vidc/inc/msm_vidc_control.h b/driver/vidc/inc/msm_vidc_control.h index f0aebcc2de..b09c884165 100644 --- a/driver/vidc/inc/msm_vidc_control.h +++ b/driver/vidc/inc/msm_vidc_control.h @@ -97,6 +97,8 @@ int msm_vidc_set_session_priority(void* instance, enum msm_vidc_inst_capability_type cap_id); int msm_vidc_set_seq_change_at_sync_frame(void* instance, enum msm_vidc_inst_capability_type cap_id); +int msm_vidc_set_level(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 a36de94ad2..35e67a7ce4 100644 --- a/driver/vidc/src/msm_vidc_control.c +++ b/driver/vidc/src/msm_vidc_control.c @@ -2249,15 +2249,18 @@ int msm_vidc_set_min_qp(void *instance, } capability = inst->capabilities; - min_qp_enable = - capability->cap[MIN_FRAME_QP].flags & CAP_FLAG_CLIENT_SET; + if (capability->cap[MIN_FRAME_QP].flags & CAP_FLAG_CLIENT_SET) + min_qp_enable = 1; - i_qp_enable = min_qp_enable || - capability->cap[I_FRAME_MIN_QP].flags & CAP_FLAG_CLIENT_SET; - p_qp_enable = min_qp_enable || - capability->cap[P_FRAME_MIN_QP].flags & CAP_FLAG_CLIENT_SET; - b_qp_enable = min_qp_enable || - capability->cap[B_FRAME_MIN_QP].flags & CAP_FLAG_CLIENT_SET; + if (min_qp_enable || + (capability->cap[I_FRAME_MIN_QP].flags & CAP_FLAG_CLIENT_SET)) + i_qp_enable = 1; + if (min_qp_enable || + (capability->cap[P_FRAME_MIN_QP].flags & CAP_FLAG_CLIENT_SET)) + p_qp_enable = 1; + if (min_qp_enable || + (capability->cap[B_FRAME_MIN_QP].flags & CAP_FLAG_CLIENT_SET)) + b_qp_enable = 1; client_qp_enable = i_qp_enable | p_qp_enable << 1 | b_qp_enable << 2; if (!client_qp_enable) { @@ -2311,15 +2314,18 @@ int msm_vidc_set_max_qp(void *instance, } capability = inst->capabilities; - max_qp_enable = - capability->cap[MAX_FRAME_QP].flags & CAP_FLAG_CLIENT_SET; + if (capability->cap[MAX_FRAME_QP].flags & CAP_FLAG_CLIENT_SET) + max_qp_enable = 1; - i_qp_enable = max_qp_enable || - capability->cap[I_FRAME_MAX_QP].flags & CAP_FLAG_CLIENT_SET; - p_qp_enable = max_qp_enable || - capability->cap[P_FRAME_MAX_QP].flags & CAP_FLAG_CLIENT_SET; - b_qp_enable = max_qp_enable || - capability->cap[B_FRAME_MAX_QP].flags & CAP_FLAG_CLIENT_SET; + if (max_qp_enable || + (capability->cap[I_FRAME_MAX_QP].flags & CAP_FLAG_CLIENT_SET)) + i_qp_enable = 1; + if (max_qp_enable || + (capability->cap[P_FRAME_MAX_QP].flags & CAP_FLAG_CLIENT_SET)) + p_qp_enable = 1; + if (max_qp_enable || + (capability->cap[B_FRAME_MAX_QP].flags & CAP_FLAG_CLIENT_SET)) + b_qp_enable = 1; client_qp_enable = i_qp_enable | p_qp_enable << 1 | b_qp_enable << 2; if (!client_qp_enable) { @@ -2383,12 +2389,12 @@ int msm_vidc_set_frame_qp(void *instance, i_qp_enable = p_qp_enable = b_qp_enable = 1; } else { /* Set only if client has set for NON rc off case */ - i_qp_enable = - capab->cap[I_FRAME_QP].flags & CAP_FLAG_CLIENT_SET; - p_qp_enable = - capab->cap[P_FRAME_QP].flags & CAP_FLAG_CLIENT_SET; - b_qp_enable = - capab->cap[B_FRAME_QP].flags & CAP_FLAG_CLIENT_SET; + if (capab->cap[I_FRAME_QP].flags & CAP_FLAG_CLIENT_SET) + i_qp_enable = 1; + if (capab->cap[P_FRAME_QP].flags & CAP_FLAG_CLIENT_SET) + p_qp_enable = 1; + if (capab->cap[B_FRAME_QP].flags & CAP_FLAG_CLIENT_SET) + b_qp_enable = 1; } client_qp_enable = i_qp_enable | p_qp_enable << 1 | b_qp_enable << 2; @@ -3030,6 +3036,35 @@ int msm_vidc_set_csc_custom_matrix(void *instance, return rc; } +/* + * TODO: currently fw does not accept HFI_LEVEL_NONE. + * Use this function for encoder level setting once + * fw issue is fixed. + */ +int msm_vidc_set_level(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 = 0; + + if (!inst || !inst->capabilities) { + d_vpr_e("%s: invalid params\n", __func__); + return -EINVAL; + } + + hfi_value = inst->capabilities->cap[cap_id].value; + if (!(inst->capabilities->cap[cap_id].flags & CAP_FLAG_CLIENT_SET)) + hfi_value = HFI_LEVEL_NONE; + + 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_q16(void *instance, enum msm_vidc_inst_capability_type cap_id) {