Procházet zdrojové kódy

video: driver: add thumbnail and priority support

- add thumbnail mode and priority in database.
- modify output min count for thumbnail session
- deprecate is_turbo_session.
- deprecate flags variable in instance structure and
  use database entries.

Change-Id: I04a3386f1e2eb9fb97bd550d6f169f9510f462c8
Signed-off-by: Darshana Patil <[email protected]>
Darshana Patil před 4 roky
rodič
revize
596ca194de

+ 9 - 1
driver/platform/waipio/src/msm_vidc_waipio.c

@@ -1059,7 +1059,7 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
 	{THUMBNAIL_MODE, DEC, CODECS_ALL,
 		V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
 		1, V4L2_MPEG_MSM_VIDC_DISABLE,
-		0,
+		V4L2_CID_MPEG_VIDC_THUMBNAIL_MODE,
 		HFI_PROP_THUMBNAIL_MODE},
 
 	{DEFAULT_HEADER, DEC, CODECS_ALL,
@@ -1083,6 +1083,14 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
 		HFI_PROP_SEQ_CHANGE_AT_SYNC_FRAME,
 		CAP_FLAG_INPUT_PORT | CAP_FLAG_DYNAMIC_ALLOWED},
 
+	{PRIORITY, DEC|ENC, CODECS_ALL,
+		0, 2, 1, 1,
+		V4L2_CID_MPEG_VIDC_PRIORITY,
+		HFI_PROP_REALTIME,
+		CAP_FLAG_ROOT,
+		{0}, {0},
+		NULL, NULL},
+
 	{META_LTR_MARK_USE, ENC, CODECS_ALL,
 		V4L2_MPEG_MSM_VIDC_DISABLE, V4L2_MPEG_MSM_VIDC_ENABLE,
 		1, V4L2_MPEG_MSM_VIDC_DISABLE,

+ 1 - 4
driver/variant/iris2/src/msm_vidc_iris2.c

@@ -639,13 +639,10 @@ int msm_vidc_decide_quality_mode_iris2(struct msm_vidc_inst* inst)
 	max_hq_mbps = core->capabilities[MAX_MBPS_HQ].value;;
 
 	/* Power saving always disabled for CQ and LOSSLESS RC modes. */
-	if (inst->capabilities->cap[LOSSLESS].value ||
+	if (capability->cap[LOSSLESS].value ||
 		(mbpf <= max_hq_mbpf && mbps <= max_hq_mbps))
 		mode = MSM_VIDC_MAX_QUALITY_MODE;
 
-	inst->flags = mode == MSM_VIDC_POWER_SAVE_MODE ?
-		inst->flags | VIDC_LOW_POWER :
-		inst->flags & ~VIDC_LOW_POWER;
 	capability->cap[QUALITY_MODE].value = mode;
 
 	return 0;

+ 1 - 1
driver/variant/iris2/src/msm_vidc_power_iris2.c

@@ -41,7 +41,7 @@ u64 msm_vidc_calc_freq_iris2(struct msm_vidc_inst *inst, u32 data_size)
 	fw_vpp_cycles = fps * core->capabilities[MB_CYCLES_FW_VPP].value;
 
 	if (inst->domain == MSM_VIDC_ENCODER) {
-		vpp_cycles_per_mb = inst->flags & VIDC_LOW_POWER ?
+		vpp_cycles_per_mb = is_low_power_session(inst) ?
 			core->capabilities[MB_CYCLES_LP].value :
 			core->capabilities[MB_CYCLES_VPP].value;
 

+ 6 - 9
driver/vidc/inc/msm_vidc_driver.h

@@ -26,7 +26,7 @@ static inline is_encode_session(struct msm_vidc_inst *inst)
 
 static inline is_secure_session(struct msm_vidc_inst *inst)
 {
-	return false;
+	return !!(inst->capabilities->cap[SECURE_MODE].value);
 }
 
 static inline is_input_buffer(enum msm_vidc_buffer_type buffer_type)
@@ -145,24 +145,21 @@ static inline bool is_secondary_output_mode(struct msm_vidc_inst *inst)
 	return false; // TODO: inst->stream_output_mode == HAL_VIDEO_DECODER_SECONDARY;
 }
 
-static inline bool is_turbo_session(struct msm_vidc_inst *inst)
-{
-	return !!(inst->flags & VIDC_TURBO);
-}
-
 static inline bool is_thumbnail_session(struct msm_vidc_inst *inst)
 {
-	return !!(inst->flags & VIDC_THUMBNAIL);
+	return false;
+	// todo: return !!(inst->capabilities->cap[THUMBNAIL_MODE].value);
 }
 
 static inline bool is_low_power_session(struct msm_vidc_inst *inst)
 {
-	return !!(inst->flags & VIDC_LOW_POWER);
+	return (inst->capabilities->cap[QUALITY_MODE].value ==
+		MSM_VIDC_POWER_SAVE_MODE);
 }
 
 static inline bool is_realtime_session(struct msm_vidc_inst *inst)
 {
-	return false; // TODO: fix it
+	return !inst->capabilities->cap[PRIORITY].value;
 }
 
 static inline bool is_active_session(u64 prev, u64 curr)

+ 0 - 1
driver/vidc/inc/msm_vidc_inst.h

@@ -108,7 +108,6 @@ struct msm_vidc_inst {
 	struct msm_vidc_rectangle          crop;
 	struct msm_vidc_rectangle          compose;
 	struct msm_vidc_power              power;
-	enum msm_vidc_modes                flags;
 	struct vidc_bus_vote_data          bus_data;
 	struct msm_vidc_buffers_info       buffers;
 	struct msm_vidc_mappings_info      mappings;

+ 1 - 7
driver/vidc/inc/msm_vidc_internal.h

@@ -413,6 +413,7 @@ enum msm_vidc_inst_capability_type {
 	DEFAULT_HEADER,
 	RAP_FRAME,
 	SEQ_CHANGE_AT_SYNC_FRAME,
+	PRIORITY,
 	META_LTR_MARK_USE,
 	META_DPB_MISR,
 	META_OPB_MISR,
@@ -680,13 +681,6 @@ struct msm_vidc_decode_batch {
 	struct delayed_work    work;
 };
 
-enum msm_vidc_modes {
-	VIDC_SECURE            = BIT(0),
-	VIDC_TURBO             = BIT(1),
-	VIDC_THUMBNAIL         = BIT(2),
-	VIDC_LOW_POWER         = BIT(3),
-};
-
 enum load_calc_quirks {
 	LOAD_POWER = 0,
 	LOAD_ADMISSION_CONTROL = 1,

+ 8 - 1
driver/vidc/src/msm_vdec.c

@@ -669,6 +669,7 @@ static int msm_vdec_set_realtime(struct msm_vidc_inst *inst,
 		return -EINVAL;
 	}
 
+	realtime = inst->capabilities->cap[PRIORITY].value;
 	i_vpr_h(inst, "%s: priority: %d", __func__, realtime);
 	rc = venus_hfi_session_property(inst,
 			HFI_PROP_REALTIME,
@@ -1378,7 +1379,13 @@ static int msm_vdec_read_input_subcr_params(struct msm_vidc_inst *inst)
 	}
 
 	inst->buffers.output.min_count = subsc_params.fw_min_count;
-
+	if (is_thumbnail_session(inst) && inst->codec != MSM_VIDC_VP9) {
+		if (inst->buffers.output.min_count != 1) {
+			i_vpr_e(inst, "%s: invalid min count %d in thumbnail case\n",
+				__func__, inst->buffers.output.min_count);
+			msm_vidc_change_inst_state(inst, MSM_VIDC_ERROR, __func__);
+		}
+	}
 	inst->crop.top = subsc_params.crop_offsets[0] & 0xFFFF;
 	inst->crop.left = (subsc_params.crop_offsets[0] >> 16) & 0xFFFF;
 	inst->crop.height = inst->fmts[INPUT_PORT].fmt.pix_mp.height -

+ 1 - 1
driver/vidc/src/msm_vidc_buffer.c

@@ -59,7 +59,7 @@ u32 msm_vidc_output_min_count(struct msm_vidc_inst *inst)
 		return 0;
 
 	if (is_thumbnail_session(inst))
-		return inst->codec == MSM_VIDC_VP9 ? 8 : 1;
+		return 1;
 
 	if (is_decode_session(inst)) {
 		switch (inst->codec) {

+ 76 - 43
driver/vidc/src/msm_vidc_control.c

@@ -119,7 +119,57 @@ static const char * const * msm_vidc_get_qmenu_type(
 	}
 }
 
-static const char *msm_vidc_get_priv_ctrl_name(struct msm_vidc_inst *inst, u32 control_id)
+static const char *msm_vidc_get_priv_ctrl_name_list2(struct msm_vidc_inst *inst,
+	u32 control_id)
+{
+	switch (control_id) {
+	case V4L2_CID_MPEG_VIDC_HEVC_I_FRAME_MIN_QP:
+		return "HEVC I Frame Min QP";
+	case V4L2_CID_MPEG_VIDC_HEVC_P_FRAME_MIN_QP:
+		return "HEVC P Frame Min QP";
+	case V4L2_CID_MPEG_VIDC_HEVC_I_FRAME_MAX_QP:
+		return "HEVC I Frame Max QP";
+	case V4L2_CID_MPEG_VIDC_HEVC_P_FRAME_MAX_QP:
+		return "HEVC P Frame Max QP";
+	case V4L2_CID_MPEG_VIDC_METADATA_LTR_MARK_USE_DETAILS:
+		return "LTR Mark Use Details Metadata";
+	case V4L2_CID_MPEG_VIDC_METADATA_SEQ_HEADER_NAL:
+		return "Seq Header NAL Metadata";
+	case V4L2_CID_MPEG_VIDC_METADATA_DPB_LUMA_CHROMA_MISR:
+		return "DPB Luma-Chroma MISR Metadata";
+	case V4L2_CID_MPEG_VIDC_METADATA_OPB_LUMA_CHROMA_MISR:
+		return "OPB Luma-Chroma MISR Metadata";
+	case V4L2_CID_MPEG_VIDC_METADATA_INTERLACE:
+		return "Interlace Metadata";
+	case V4L2_CID_MPEG_VIDC_METADATA_CONCEALED_MB_COUNT:
+		return "Concealed MB Count Metadata";
+	case V4L2_CID_MPEG_VIDC_METADATA_HISTOGRAM_INFO:
+		return "Historgram Info Metadata";
+	case V4L2_CID_MPEG_VIDC_METADATA_SEI_MASTERING_DISPLAY_COLOUR:
+		return "SEI Mastering Display Color Metadata";
+	case V4L2_CID_MPEG_VIDC_METADATA_SEI_CONTENT_LIGHT_LEVEL:
+		return "SEI Content Lighting Level Metadata";
+	case V4L2_CID_MPEG_VIDC_METADATA_HDR10PLUS:
+		return "HDR10PLUS Metadata";
+	case V4L2_CID_MPEG_VIDC_METADATA_EVA_STATS:
+		return "EVA Stats Metadata";
+	case V4L2_CID_MPEG_VIDC_METADATA_BUFFER_TAG:
+		return "Buffer Tag Metadata";
+	case V4L2_CID_MPEG_VIDC_METADATA_SUBFRAME_OUTPUT:
+		return "Subframe Output Metadata";
+	case V4L2_CID_MPEG_VIDC_METADATA_ROI_INFO:
+		return "ROI Info Metadata";
+	case V4L2_CID_MPEG_VIDC_METADATA_TIMESTAMP:
+		return "Timestamp Metadata";
+	case V4L2_CID_MPEG_VIDC_METADATA_ENC_QP_METADATA:
+		return "Encoder QP Metadata";
+	default:
+		return NULL;
+	}
+}
+
+static const char *msm_vidc_get_priv_ctrl_name_list1(struct msm_vidc_inst *inst,
+	u32 control_id)
 {
 	switch (control_id) {
 	case V4L2_CID_MPEG_VIDC_SECURE:
@@ -162,56 +212,39 @@ static const char *msm_vidc_get_priv_ctrl_name(struct msm_vidc_inst *inst, u32 c
 		return "H264 Display Delay";
 	case V4L2_CID_MPEG_MFC51_VIDEO_DECODER_H264_DISPLAY_DELAY_ENABLE:
 		return "H264 Display Delay Enable";
-	case V4L2_CID_MPEG_VIDC_METADATA_LTR_MARK_USE_DETAILS:
-		return "LTR Mark Use Details Metadata";
-	case V4L2_CID_MPEG_VIDC_METADATA_SEQ_HEADER_NAL:
-		return "Seq Header NAL Metadata";
-	case V4L2_CID_MPEG_VIDC_METADATA_DPB_LUMA_CHROMA_MISR:
-		return "DPB Luma-Chroma MISR Metadata";
-	case V4L2_CID_MPEG_VIDC_METADATA_OPB_LUMA_CHROMA_MISR:
-		return "OPB Luma-Chroma MISR Metadata";
-	case V4L2_CID_MPEG_VIDC_METADATA_INTERLACE:
-		return "Interlace Metadata";
-	case V4L2_CID_MPEG_VIDC_METADATA_CONCEALED_MB_COUNT:
-		return "Concealed MB Count Metadata";
-	case V4L2_CID_MPEG_VIDC_METADATA_HISTOGRAM_INFO:
-		return "Historgram Info Metadata";
-	case V4L2_CID_MPEG_VIDC_METADATA_SEI_MASTERING_DISPLAY_COLOUR:
-		return "SEI Mastering Display Color Metadata";
-	case V4L2_CID_MPEG_VIDC_METADATA_SEI_CONTENT_LIGHT_LEVEL:
-		return "SEI Content Lighting Level Metadata";
-	case V4L2_CID_MPEG_VIDC_METADATA_HDR10PLUS:
-		return "HDR10PLUS Metadata";
-	case V4L2_CID_MPEG_VIDC_METADATA_EVA_STATS:
-		return "EVA Stats Metadata";
-	case V4L2_CID_MPEG_VIDC_METADATA_BUFFER_TAG:
-		return "Buffer Tag Metadata";
-	case V4L2_CID_MPEG_VIDC_METADATA_SUBFRAME_OUTPUT:
-		return "Subframe Output Metadata";
-	case V4L2_CID_MPEG_VIDC_METADATA_ROI_INFO:
-		return "ROI Info Metadata";
-	case V4L2_CID_MPEG_VIDC_METADATA_TIMESTAMP:
-		return "Timestamp Metadata";
-	case V4L2_CID_MPEG_VIDC_METADATA_ENC_QP_METADATA:
-		return "Encoder QP Metadata";
 	case V4L2_CID_MPEG_VIDC_MIN_BITSTREAM_SIZE_OVERWRITE:
 		return "Bitstream Size Overwrite";
-	case V4L2_CID_MPEG_VIDC_HEVC_I_FRAME_MIN_QP:
-		return "HEVC I Frame Min QP";
-	case V4L2_CID_MPEG_VIDC_HEVC_P_FRAME_MIN_QP:
-		return "HEVC P Frame Min QP";
-	case V4L2_CID_MPEG_VIDC_HEVC_I_FRAME_MAX_QP:
-		return "HEVC I Frame Max QP";
-	case V4L2_CID_MPEG_VIDC_HEVC_P_FRAME_MAX_QP:
-		return "HEVC P Frame Max QP";
 	case V4L2_CID_MPEG_VIDC_SUPERFRAME:
 		return "Encoder Batching Superframe";
+	case V4L2_CID_MPEG_VIDC_THUMBNAIL_MODE:
+		return "Thumbnail Mode";
+	case V4L2_CID_MPEG_VIDC_PRIORITY:
+		return "Priority";
 	default:
-		i_vpr_e(inst, "%s: ctrl name not available for ctrl id %#x\n",
-			__func__, control_id);
 		return NULL;
 	}
 }
+/*
+ * Due to a long switch case function, ccn failure was observed. Hence the
+ * below function is split into msm_vidc_get_priv_ctrl_name_list1() and
+ * msm_vidc_get_priv_ctrl_name_list2()
+ */
+static const char *msm_vidc_get_priv_ctrl_name(struct msm_vidc_inst *inst,
+	u32 control_id)
+{
+	const char *ctrl_name;
+
+	ctrl_name = msm_vidc_get_priv_ctrl_name_list1(inst, control_id);
+	if (ctrl_name)
+		return ctrl_name;
+	ctrl_name = msm_vidc_get_priv_ctrl_name_list2(inst, control_id);
+	if (ctrl_name)
+		return ctrl_name;
+
+	i_vpr_e(inst, "%s: ctrl name not available for ctrl id %#x\n",
+		__func__, control_id);
+	return NULL;
+}
 
 static int msm_vidc_packetize_control(struct msm_vidc_inst *inst,
 	enum msm_vidc_inst_capability_type cap_id, u32 payload_type,

+ 1 - 1
driver/vidc/src/msm_vidc_debug.c

@@ -320,7 +320,7 @@ static ssize_t inst_info_read(struct file *file, char __user *buf,
 			inst->capabilities->cap[FRAME_RATE].value >> 16);
 	cur += write_str(cur, end - cur, "state: %d\n", inst->state);
 	cur += write_str(cur, end - cur, "secure: %d\n",
-		!!(inst->flags & VIDC_SECURE));
+		is_secure_session(inst));
 	cur += write_str(cur, end - cur, "-----------Formats-------------\n");
 	for (i = 0; i < MAX_PORT; i++) {
 		if (i != INPUT_PORT && i != OUTPUT_PORT)

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

@@ -2964,7 +2964,7 @@ int msm_vidc_print_inst_info(struct msm_vidc_inst *inst)
 		return -EINVAL;
 	}
 
-	is_secure = !!(inst->flags & VIDC_SECURE);
+	is_secure = is_secure_session(inst);
 	is_decode = inst->domain == MSM_VIDC_DECODER;
 	port = is_decode ? INPUT_PORT : OUTPUT_PORT;
 	width = inst->fmts[port].fmt.pix_mp.width;

+ 2 - 2
driver/vidc/src/msm_vidc_power.c

@@ -494,8 +494,8 @@ int msm_vidc_scale_clocks(struct msm_vidc_inst *inst)
 	if (!data_size)
 		return 0;
 
-	if (inst->power.buffer_counter < DCVS_FTB_WINDOW ||
-		is_turbo_session(inst)) {
+	//todo: add turbo session check
+	if (inst->power.buffer_counter < DCVS_FTB_WINDOW) {
 		inst->power.min_freq = msm_vidc_max_freq(inst);
 		inst->power.dcvs_flags = 0;
 	} else if (msm_vidc_clock_voting) {