Browse Source

Merge "video: driver: adjust opb buffers min count"

qctecmdr 2 years ago
parent
commit
4da4f00863

+ 12 - 13
driver/variant/iris33/src/msm_vidc_buffer_iris33.c

@@ -74,9 +74,11 @@ static u32 msm_vidc_decoder_comv_size_iris33(struct msm_vidc_inst *inst)
 		 * achieve performance but save memory.
 		 */
 		if (res_is_greater_than(width, height, 4096, 2176))
-			num_comv = inst->buffers.output.min_count + 3;
+			num_comv = inst->fw_min_count ?
+				inst->fw_min_count + 3 : inst->buffers.output.min_count + 3;
 		else
-			num_comv = inst->buffers.output.min_count + 7;
+			num_comv = inst->fw_min_count ?
+				inst->fw_min_count + 7 : inst->buffers.output.min_count + 7;
 	} else {
 		num_comv = inst->buffers.output.min_count;
 	}
@@ -624,21 +626,18 @@ static int msm_vidc_input_min_count_iris33(struct msm_vidc_inst *inst)
 static int msm_buffer_dpb_count(struct msm_vidc_inst *inst)
 {
 	int count = 0;
-	u32 color_fmt;
 
-	/* decoder dpb buffer count */
-	if (is_decode_session(inst)) {
-		color_fmt = inst->capabilities[PIX_FMTS].value;
-		if (is_linear_colorformat(color_fmt) ||
-			(inst->codec == MSM_VIDC_AV1 &&
-			(inst->capabilities[FILM_GRAIN].value)))
-			count = inst->buffers.output.min_count;
+	/* encoder dpb buffer count */
+	if (is_encode_session(inst))
+		return msm_vidc_get_recon_buf_count(inst);
 
-		return count;
+	/* decoder dpb buffer count */
+	if (is_split_mode_enabled(inst)) {
+		count = inst->fw_min_count ?
+			inst->fw_min_count : inst->buffers.output.min_count;
 	}
 
-	/* encoder dpb buffer count */
-	return msm_vidc_get_recon_buf_count(inst);
+	return count;
 }
 
 static int msm_buffer_delivery_mode_based_min_count_iris33(struct msm_vidc_inst *inst,

+ 13 - 0
driver/vidc/inc/msm_vidc_driver.h

@@ -320,6 +320,19 @@ static inline bool is_rgba_colorformat(enum msm_vidc_colorformat_type colorforma
 		colorformat == MSM_VIDC_FMT_RGBA8888C;
 }
 
+static inline bool is_split_mode_enabled(struct msm_vidc_inst *inst)
+{
+	if (!is_decode_session(inst))
+		return false;
+
+	if (is_linear_colorformat(inst->capabilities[PIX_FMTS].value) ||
+		(inst->codec == MSM_VIDC_AV1 &&
+		inst->capabilities[FILM_GRAIN].value))
+		return true;
+
+	return false;
+}
+
 static inline bool is_thumbnail_session(struct msm_vidc_inst *inst)
 {
 	return !!(inst->capabilities[THUMBNAIL_MODE].value);

+ 16 - 17
driver/vidc/src/msm_vdec.c

@@ -615,15 +615,12 @@ static int msm_vdec_set_av1_superblock_enabled(struct msm_vidc_inst *inst,
 static int msm_vdec_set_opb_enable(struct msm_vidc_inst *inst)
 {
 	int rc = 0;
-	u32 color_fmt;
 	u32 opb_enable = 0;
 
 	if (inst->codec != MSM_VIDC_AV1)
 		return 0;
 
-	color_fmt = inst->capabilities[PIX_FMTS].value;
-	if (is_linear_colorformat(color_fmt) ||
-		inst->capabilities[FILM_GRAIN].value)
+	if (is_split_mode_enabled(inst))
 		opb_enable = 1;
 
 	i_vpr_h(inst, "%s: OPB enable: %d",  __func__, opb_enable);
@@ -1355,19 +1352,6 @@ static int msm_vdec_read_input_subcr_params(struct msm_vidc_inst *inst)
 	inst->fmts[INPUT_PORT].fmt.pix_mp.quantization =
 		inst->fmts[OUTPUT_PORT].fmt.pix_mp.quantization;
 
-	inst->buffers.output.min_count = subsc_params.fw_min_count;
-	inst->fw_min_count = subsc_params.fw_min_count;
-	inst->buffers.output.extra_count = call_session_op(core,
-		extra_count, inst, MSM_VIDC_BUF_OUTPUT);
-	inst->buffers.output_meta.min_count = inst->buffers.output.min_count;
-	inst->buffers.output_meta.extra_count = inst->buffers.output.extra_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_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 -
@@ -1402,6 +1386,21 @@ static int msm_vdec_read_input_subcr_params(struct msm_vidc_inst *inst)
 			MSM_VIDC_META_DISABLE, __func__);
 	}
 
+	inst->fw_min_count = subsc_params.fw_min_count;
+	inst->buffers.output.min_count = call_session_op(core,
+		min_count, inst, MSM_VIDC_BUF_OUTPUT);
+	inst->buffers.output.extra_count = call_session_op(core,
+		extra_count, inst, MSM_VIDC_BUF_OUTPUT);
+	inst->buffers.output_meta.min_count = inst->buffers.output.min_count;
+	inst->buffers.output_meta.extra_count = inst->buffers.output.extra_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_state(inst, MSM_VIDC_ERROR, __func__);
+		}
+	}
+
 	return 0;
 }
 

+ 36 - 22
driver/vidc/src/msm_vidc_buffer.c

@@ -54,30 +54,44 @@ u32 msm_vidc_output_min_count(struct msm_vidc_inst *inst)
 	if (is_thumbnail_session(inst))
 		return 1;
 
-	if (is_decode_session(inst)) {
-		if (inst->fw_min_count)
+	if (is_encode_session(inst))
+		return MIN_ENC_OUTPUT_BUFFERS;
+
+	/* decoder handling below */
+	/* fw_min_count > 0 indicates reconfig event has already arrived */
+	if (inst->fw_min_count) {
+		/* TODO: need to update condition to include AVC/HEVC as well */
+		if (is_split_mode_enabled(inst) &&
+			(inst->codec == MSM_VIDC_AV1 ||
+			inst->codec == MSM_VIDC_VP9)) {
+			/*
+			 * return opb min buffer count as min(4, fw_min_count)
+			 * fw min count is used for dpb min count
+			 */
+			return min_t(u32, 4, inst->fw_min_count);
+		} else {
 			return inst->fw_min_count;
-
-		switch (inst->codec) {
-		case MSM_VIDC_H264:
-		case MSM_VIDC_HEVC:
-			output_min_count = 4;
-			break;
-		case MSM_VIDC_VP9:
-			output_min_count = 9;
-			break;
-		case MSM_VIDC_AV1:
-			output_min_count = 11;
-			break;
-		case MSM_VIDC_HEIC:
-			output_min_count = 3;
-			break;
-		default:
-			output_min_count = 4;
 		}
-	} else {
-		output_min_count = MIN_ENC_OUTPUT_BUFFERS;
-		//todo: reduce heic count to 2, once HAL side cushion is added
+	}
+
+	/* initial handling before reconfig event arrived */
+	switch (inst->codec) {
+	case MSM_VIDC_H264:
+	case MSM_VIDC_HEVC:
+		output_min_count = 4;
+		break;
+	case MSM_VIDC_VP9:
+		output_min_count = 9;
+		break;
+	case MSM_VIDC_AV1:
+		output_min_count = 11;
+		break;
+	case MSM_VIDC_HEIC:
+		output_min_count = 3;
+		break;
+	default:
+		output_min_count = 4;
+		break;
 	}
 
 	return output_min_count;