فهرست منبع

video: driver: inline preprocessing improvement

For VPSS, FW requests more bandwidth from HW.
In order to support inline processing, FW introduced
request preprcess property.

Enble this property only when following conditions are met:
- CAC-BRS is required
- don't have EVA stats.
- Upto 4k@60 fps, max( frame rate, operating rate) <= 60

Change-Id: I3cf83483d9320e5dfe20617b37a54b9d5fbcffd8
Signed-off-by: Mahesh Kumar Sharma <[email protected]>
Mahesh Kumar Sharma 3 سال پیش
والد
کامیت
508f4a0282

+ 15 - 2
driver/platform/kalama/src/msm_vidc_kalama.c

@@ -687,10 +687,23 @@ static struct msm_platform_inst_capability instance_data_kalama[] = {
 		HFI_PROP_CONTENT_ADAPTIVE_CODING,
 		CAP_FLAG_OUTPUT_PORT,
 		{BITRATE_MODE, LAYER_ENABLE, LAYER_TYPE},
-		{0},
+		{REQUEST_PREPROCESS},
 		msm_vidc_adjust_brs,
 		msm_vidc_set_vbr_related_properties},
 
+	{REQUEST_PREPROCESS, ENC, H264|HEVC,
+		MSM_VIDC_PREPROCESS_NONE,
+		MSM_VIDC_PREPROCESS_TYPE0,
+		BIT(MSM_VIDC_PREPROCESS_NONE) |
+		BIT(MSM_VIDC_PREPROCESS_TYPE0),
+		MSM_VIDC_PREPROCESS_NONE,
+		0, HFI_PROP_REQUEST_PREPROCESS,
+		CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU,
+		{CONTENT_ADAPTIVE_CODING, META_EVA_STATS},
+		{0},
+		msm_vidc_adjust_preprocess,
+		msm_vidc_set_preprocess},
+
 	{BITRATE_BOOST, ENC, H264|HEVC,
 		0, MAX_BITRATE_BOOST, 25, MAX_BITRATE_BOOST,
 		V4L2_CID_MPEG_VIDC_QUALITY_BITRATE_BOOST,
@@ -1824,7 +1837,7 @@ static struct msm_platform_inst_capability instance_data_kalama[] = {
 		HFI_PROP_EVA_STAT_INFO,
 		CAP_FLAG_BITMASK,
 		{0},
-		{ENH_LAYER_COUNT}},
+		{ENH_LAYER_COUNT, REQUEST_PREPROCESS}},
 
 	{META_BUF_TAG, ENC, CODECS_ALL,
 		V4L2_MPEG_VIDC_META_DISABLE,

+ 8 - 0
driver/platform/waipio/src/msm_vidc_waipio.c

@@ -643,6 +643,14 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
 		msm_vidc_adjust_brs,
 		msm_vidc_set_vbr_related_properties},
 
+	{REQUEST_PREPROCESS, ENC, H264|HEVC,
+		MSM_VIDC_PREPROCESS_NONE,
+		MSM_VIDC_PREPROCESS_NONE,
+		BIT(MSM_VIDC_PREPROCESS_NONE),
+		MSM_VIDC_PREPROCESS_NONE,
+		0, HFI_PROP_REQUEST_PREPROCESS,
+		CAP_FLAG_OUTPUT_PORT | CAP_FLAG_MENU},
+
 	{BITRATE_BOOST, ENC, H264|HEVC,
 		0, MAX_BITRATE_BOOST, 25, MAX_BITRATE_BOOST,
 		V4L2_CID_MPEG_VIDC_QUALITY_BITRATE_BOOST,

+ 2 - 0
driver/vidc/inc/hfi_property.h

@@ -553,6 +553,8 @@ enum hfi_saliency_type {
 
 #define HFI_PROP_FENCE                                          0x0300018B
 
+#define HFI_PROP_REQUEST_PREPROCESS                             0x0300018E
+
 #define HFI_PROP_END                                            0x03FFFFFF
 
 #define HFI_SESSION_ERROR_BEGIN                                 0x04000000

+ 4 - 1
driver/vidc/inc/msm_vidc_control.h

@@ -54,6 +54,7 @@ int msm_vidc_adjust_roi_info(void *instance, struct v4l2_ctrl *ctrl);
 int msm_vidc_adjust_all_intra(void *instance, struct v4l2_ctrl *ctrl);
 int msm_vidc_adjust_dec_frame_rate(void *instance, struct v4l2_ctrl *ctrl);
 int msm_vidc_adjust_dec_operating_rate(void *instance, struct v4l2_ctrl *ctrl);
+int msm_vidc_adjust_preprocess(void *instance, struct v4l2_ctrl *ctrl);
 
 int msm_vidc_set_header_mode(void *instance,
 	enum msm_vidc_inst_capability_type cap_id);
@@ -113,7 +114,9 @@ int msm_vidc_set_ir_period(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,
+int msm_vidc_set_preprocess(void *instance,
+	enum msm_vidc_inst_capability_type cap_id);
+int msm_vidc_set_u32_enum(void *instance,
 	enum msm_vidc_inst_capability_type cap_id);
 int msm_vidc_set_q16(void *instance,
 	enum msm_vidc_inst_capability_type cap_id);

+ 6 - 0
driver/vidc/inc/msm_vidc_internal.h

@@ -290,6 +290,11 @@ enum msm_vidc_matrix_coefficients {
 	MSM_VIDC_MATRIX_COEFF_BT2100                         = 14,
 };
 
+enum msm_vidc_preprocess_type {
+	MSM_VIDC_PREPROCESS_NONE = BIT(0),
+	MSM_VIDC_PREPROCESS_TYPE0 = BIT(1),
+};
+
 enum msm_vidc_core_capability_type {
 	CORE_CAP_NONE = 0,
 	ENC_CODECS,
@@ -492,6 +497,7 @@ enum msm_vidc_inst_capability_type {
 	MIN_QUALITY,
 	CONTENT_ADAPTIVE_CODING,
 	BLUR_TYPES,
+	REQUEST_PREPROCESS,
 	/* place all intermittent(having both parent and child) enums before this line */
 
 	MIN_FRAME_QP,

+ 69 - 0
driver/vidc/src/msm_vidc_control.c

@@ -2677,6 +2677,54 @@ update_and_exit:
 	return 0;
 }
 
+int msm_vidc_adjust_preprocess(void *instance, struct v4l2_ctrl *ctrl)
+{
+	s32 adjusted_value;
+	struct msm_vidc_inst *inst = (struct msm_vidc_inst *) instance;
+	s32 brs = -1, eva_status = -1;
+	u32 width, height, frame_rate, operating_rate, max_fps;
+	struct v4l2_format *f;
+
+	if (!inst || !inst->capabilities || !inst->core) {
+		d_vpr_e("%s: invalid params\n", __func__);
+		return -EINVAL;
+	}
+
+	adjusted_value = inst->capabilities->cap[REQUEST_PREPROCESS].value;
+
+	if (msm_vidc_get_parent_value(inst, REQUEST_PREPROCESS, CONTENT_ADAPTIVE_CODING,
+		&brs, __func__) ||
+		msm_vidc_get_parent_value(inst, REQUEST_PREPROCESS, META_EVA_STATS,
+                &eva_status, __func__))
+		return -EINVAL;
+
+	width = inst->crop.width;
+	height = inst->crop.height;
+	frame_rate = msm_vidc_get_frame_rate(inst);;
+	operating_rate = msm_vidc_get_operating_rate(inst);;
+
+	max_fps = max(frame_rate, operating_rate);
+	f= &inst->fmts[OUTPUT_PORT];
+
+	/*
+	 * enable preprocess if
+	 * client did not enable EVA metadata statistics and
+	 * BRS enabled and upto 4k @ 60 fps
+	 */
+	if (!is_meta_tx_inp_enabled(inst, META_EVA_STATS) &&
+		brs == V4L2_MPEG_MSM_VIDC_ENABLE &&
+		res_is_less_than_or_equal_to(width, height, 3840, 2160) &&
+		max_fps <= 60)
+		adjusted_value = 1;
+	else
+		adjusted_value = 0;
+
+	msm_vidc_update_cap_value(inst, REQUEST_PREPROCESS,
+		adjusted_value, __func__);
+
+	return 0;
+}
+
 int msm_vidc_adjust_lowlatency_mode(void *instance, struct v4l2_ctrl *ctrl)
 {
 	struct msm_vidc_inst_capability *capability;
@@ -3779,6 +3827,27 @@ int msm_vidc_set_flip(void *instance,
 	return rc;
 }
 
+int msm_vidc_set_preprocess(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;
+
+	d_vpr_e("%s: \n", __func__);
+	if (!inst || !inst->capabilities) {
+		d_vpr_e("%s: invalid params\n", __func__);
+		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_rotation(void *instance,
 	enum msm_vidc_inst_capability_type cap_id)
 {

+ 1 - 0
driver/vidc/src/msm_vidc_driver.c

@@ -194,6 +194,7 @@ static const struct msm_vidc_cap_name cap_name_arr[] = {
 	{MIN_QUALITY,                    "MIN_QUALITY"                },
 	{CONTENT_ADAPTIVE_CODING,        "CONTENT_ADAPTIVE_CODING"    },
 	{BLUR_TYPES,                     "BLUR_TYPES"                 },
+	{REQUEST_PREPROCESS,             "REQUEST_PREPROCESS"         },
 	{MIN_FRAME_QP,                   "MIN_FRAME_QP"               },
 	{MAX_FRAME_QP,                   "MAX_FRAME_QP"               },
 	{I_FRAME_QP,                     "I_FRAME_QP"                 },