diff --git a/driver/platform/waipio/src/msm_vidc_waipio.c b/driver/platform/waipio/src/msm_vidc_waipio.c index 91f257e4ba..1aa927293e 100644 --- a/driver/platform/waipio/src/msm_vidc_waipio.c +++ b/driver/platform/waipio/src/msm_vidc_waipio.c @@ -1537,6 +1537,10 @@ static struct msm_platform_inst_capability instance_data_waipio[] = { 1, V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_CID_MPEG_VIDC_METADATA_SUBFRAME_OUTPUT, HFI_PROP_SUBFRAME_OUTPUT}, + {COMPLEXITY, ENC, H264 | HEVC, + 0, 100, + 1, 100, + V4L2_CID_MPEG_VIDC_VENC_COMPLEXITY}, }; /* diff --git a/driver/variant/iris2/src/msm_vidc_iris2.c b/driver/variant/iris2/src/msm_vidc_iris2.c index b462f9136e..a35e943298 100644 --- a/driver/variant/iris2/src/msm_vidc_iris2.c +++ b/driver/variant/iris2/src/msm_vidc_iris2.c @@ -1109,6 +1109,14 @@ int msm_vidc_decide_quality_mode_iris2(struct msm_vidc_inst* inst) max_hq_mbpf = core->capabilities[MAX_MBPF_HQ].value;; max_hq_mbps = core->capabilities[MAX_MBPS_HQ].value;; + /* NRT session to have max quality unless client configures least complexity */ + if (!is_realtime_session(inst) && mbpf <= max_hq_mbpf) { + mode = MSM_VIDC_MAX_QUALITY_MODE; + if (!capability->cap[COMPLEXITY].value) + mode = MSM_VIDC_POWER_SAVE_MODE; + goto exit; + } + /* Power saving always disabled for CQ and LOSSLESS RC modes. */ if (capability->cap[LOSSLESS].value || (mbpf <= max_hq_mbpf && mbps <= max_hq_mbps)) diff --git a/driver/vidc/inc/msm_vidc_internal.h b/driver/vidc/inc/msm_vidc_internal.h index 739755b98f..cd6afa2a69 100644 --- a/driver/vidc/inc/msm_vidc_internal.h +++ b/driver/vidc/inc/msm_vidc_internal.h @@ -463,6 +463,7 @@ enum msm_vidc_inst_capability_type { META_ENC_QP_METADATA, META_ROI_INFO, META_DEC_QP_METADATA, + COMPLEXITY, INST_CAP_MAX, }; diff --git a/driver/vidc/src/msm_vidc_driver.c b/driver/vidc/src/msm_vidc_driver.c index 083c901702..66ee0fb224 100644 --- a/driver/vidc/src/msm_vidc_driver.c +++ b/driver/vidc/src/msm_vidc_driver.c @@ -182,6 +182,7 @@ static const struct msm_vidc_cap_name cap_name_arr[] = { {META_ENC_QP_METADATA, "META_ENC_QP_METADATA" }, {META_ROI_INFO, "META_ROI_INFO" }, {META_DEC_QP_METADATA, "META_DEC_QP_METADATA" }, + {COMPLEXITY, "COMPLEXITY" }, {INST_CAP_MAX, "INST_CAP_MAX" }, }; diff --git a/include/uapi/vidc/media/v4l2_vidc_extensions.h b/include/uapi/vidc/media/v4l2_vidc_extensions.h index fa9bf8fc8f..68968375c7 100644 --- a/include/uapi/vidc/media/v4l2_vidc_extensions.h +++ b/include/uapi/vidc/media/v4l2_vidc_extensions.h @@ -134,6 +134,9 @@ enum v4l2_mpeg_vidc_blur_types { (V4L2_CID_MPEG_VIDC_BASE + 0x2D) #define V4L2_CID_MPEG_VIDC_METADATA_DEC_QP_METADATA \ (V4L2_CID_MPEG_VIDC_BASE + 0x2E) +/* Encoder Complexity control */ +#define V4L2_CID_MPEG_VIDC_VENC_COMPLEXITY \ + (V4L2_CID_MPEG_VIDC_BASE + 0x2F) /* Deprecate below controls once availble in gki and gsi bionic header */ #ifndef V4L2_CID_MPEG_VIDEO_BASELAYER_PRIORITY_ID