Browse Source

video: driver: limit vp9 max spec to 4K@60

Added change to limit VP9 decode max spec is upto 4K@60.

Change-Id: I5939a8cf6cd227d2cced5adb3628b36493b7b1fc
Signed-off-by: Govindaraj Rajagopal <[email protected]>
Govindaraj Rajagopal 4 years ago
parent
commit
2c0d2faefa

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

@@ -107,11 +107,13 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
 	 */
 
 	{FRAME_WIDTH, DEC, CODECS_ALL, 96, 8192, 1, 1920},
+	{FRAME_WIDTH, DEC, VP9, 96, 4096, 1, 1920},
 	{FRAME_WIDTH, ENC, CODECS_ALL, 128, 8192, 1, 1920},
 	{LOSSLESS_FRAME_WIDTH, ENC, H264|HEVC, 128, 4096, 1, 1920},
 	{SECURE_FRAME_WIDTH, DEC, H264|HEVC|VP9, 96, 4096, 1, 1920},
 	{SECURE_FRAME_WIDTH, ENC, H264|HEVC, 128, 4096, 1, 1920},
 	{FRAME_HEIGHT, DEC, CODECS_ALL, 96, 8192, 1, 1080},
+	{FRAME_HEIGHT, DEC, VP9, 96, 4096, 1, 1080},
 	{FRAME_HEIGHT, ENC, CODECS_ALL, 128, 8192, 1, 1080},
 	{LOSSLESS_FRAME_HEIGHT, ENC, H264|HEVC, 128, 4096, 1, 1080},
 	{SECURE_FRAME_HEIGHT, DEC, H264|HEVC|VP9, 96, 4096, 1, 1080},
@@ -175,6 +177,8 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
 	{MBPF, ENC, CODECS_ALL, 64, 138240, 1, 138240},
 	{MBPF, DEC, CODECS_ALL, 36, 138240, 1, 138240},
 	/* (4096 * 2304) / 256 */
+	{MBPF, DEC, VP9, 36, 36864, 1, 36864},
+	/* (4096 * 2304) / 256 */
 	{LOSSLESS_MBPF, ENC, H264|HEVC, 64, 36864, 1, 36864},
 	/* Batch Mode Decode */
 	/* TODO: update with new values based on updated voltage corner */
@@ -186,6 +190,8 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
 	{MBPS, ENC, CODECS_ALL, 64, 3916800, 1, 3916800},
 	/* ((1920 * 1088) / 256) * 960 fps */
 	{MBPS, DEC, CODECS_ALL, 64, 7833600, 1, 7833600},
+	/* ((4096 * 2304) / 256) * 60 */
+	{MBPS, DEC, VP9, 36, 2211840, 1, 2211840},
 	/* ((4096 * 2304) / 256) * 60 fps */
 	{POWER_SAVE_MBPS, ENC, CODECS_ALL, 0, 2211840, 1, 2211840},
 
@@ -202,8 +208,17 @@ static struct msm_platform_inst_capability instance_data_waipio[] = {
 		(MINIMUM_FPS << 16), (MAXIMUM_FPS << 16),
 		1, (DEFAULT_FPS << 16)},
 
+	{FRAME_RATE, DEC, VP9,
+		(MINIMUM_FPS << 16), (MAXIMUM_VP9_FPS << 16),
+		1, (DEFAULT_FPS << 16)},
+
 	{OPERATING_RATE, ENC|DEC, CODECS_ALL,
-		1, INT_MAX, 1, (DEFAULT_FPS << 16)},
+		(MINIMUM_FPS << 16), (MAXIMUM_FPS << 16),
+		1, (DEFAULT_FPS << 16)},
+
+	{OPERATING_RATE, DEC, VP9,
+		(MINIMUM_FPS << 16), (MAXIMUM_VP9_FPS << 16),
+		1, (DEFAULT_FPS << 16)},
 
 	{SCALE_FACTOR, ENC, H264|HEVC, 1, 8, 1, 8},
 

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

@@ -32,6 +32,7 @@
 #define DEFAULT_FPS       30
 #define MINIMUM_FPS       1
 #define MAXIMUM_FPS       960
+#define MAXIMUM_VP9_FPS   60
 #define SINGLE_INPUT_BUFFER   1
 #define SINGLE_OUTPUT_BUFFER  1
 #define MAX_NUM_INPUT_BUFFERS    VIDEO_MAX_FRAME // same as VB2_MAX_FRAME

+ 32 - 25
driver/vidc/src/msm_vdec.c

@@ -2296,14 +2296,13 @@ int msm_vdec_s_param(struct msm_vidc_inst *inst,
 		is_frame_rate = true;
 	} else {
 		timeperframe = &s_parm->parm.capture.timeperframe;
-		max_rate = capability->cap[OPERATING_RATE].max;
+		max_rate = capability->cap[OPERATING_RATE].max >> 16;
 		default_rate = capability->cap[OPERATING_RATE].value >> 16;
 	}
 
 	if (!timeperframe->denominator || !timeperframe->numerator) {
-		i_vpr_e(inst,
-			"%s: invalid rate for type %u\n",
-			__func__, s_parm->type);
+		i_vpr_e(inst, "%s: type %s, invalid rate\n", __func__,
+			v4l2_type_name(s_parm->type));
 		input_rate = default_rate;
 		goto set_default;
 	}
@@ -2312,8 +2311,7 @@ int msm_vdec_s_param(struct msm_vidc_inst *inst,
 	do_div(us_per_frame, timeperframe->denominator);
 
 	if (!us_per_frame) {
-		i_vpr_e(inst, "%s: us_per_frame is zero\n",
-			__func__);
+		i_vpr_e(inst, "%s: us_per_frame is zero\n", __func__);
 		rc = -EINVAL;
 		goto exit;
 	}
@@ -2322,29 +2320,29 @@ int msm_vdec_s_param(struct msm_vidc_inst *inst,
 	do_div(input_rate, us_per_frame);
 
 set_default:
-	q16_rate = (u32)input_rate << 16;
-	i_vpr_h(inst, "%s: %s value %d\n",
-		__func__, is_frame_rate ? "frame rate" : "operating rate", input_rate);
+	i_vpr_h(inst, "%s: type %s, %s value %d\n",
+		__func__, v4l2_type_name(s_parm->type),
+		is_frame_rate ? "frame rate" : "operating rate", input_rate);
 
-	msm_vidc_update_cap_value(inst,
-		is_frame_rate ? FRAME_RATE : OPERATING_RATE,
+	q16_rate = (u32)input_rate << 16;
+	msm_vidc_update_cap_value(inst, is_frame_rate ? FRAME_RATE : OPERATING_RATE,
 		q16_rate, __func__);
-
-	if ((s_parm->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE &&
-		inst->vb2q[INPUT_PORT].streaming) ||
-		(s_parm->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE &&
-			inst->vb2q[OUTPUT_PORT].streaming)) {
-		if (msm_vidc_check_core_mbps(inst)) {
-			i_vpr_e(inst,
-				"%s: Unsupported load with rate %d, setting default rate %d\n",
-				__func__, input_rate, default_rate);
-			msm_vidc_update_cap_value(inst,
-				is_frame_rate ? FRAME_RATE : OPERATING_RATE,
-				default_rate << 16, __func__);
-			return -ENOMEM;
+	if (is_realtime_session(inst) &&
+		((s_parm->type == INPUT_MPLANE && inst->vb2q[INPUT_PORT].streaming) ||
+		(s_parm->type == OUTPUT_MPLANE && inst->vb2q[OUTPUT_PORT].streaming))) {
+		rc = msm_vidc_check_core_mbps(inst);
+		if (rc) {
+			i_vpr_e(inst, "%s: unsupported load\n", __func__);
+			goto reset_rate;
+		}
+		rc = input_rate > max_rate;
+		if (rc) {
+			i_vpr_e(inst, "%s: unsupported rate %u, max %u\n", __func__,
+				input_rate, max_rate);
+			rc = -ENOMEM;
+			goto reset_rate;
 		}
 	}
-
 	inst->priority_level = MSM_VIDC_PRIORITY_HIGH;
 
 	if (is_frame_rate)
@@ -2352,6 +2350,15 @@ set_default:
 	else
 		capability->cap[OPERATING_RATE].flags |= CAP_FLAG_CLIENT_SET;
 
+	return 0;
+
+reset_rate:
+	if (rc) {
+		i_vpr_e(inst, "%s: setting rate %u failed, reset to %u\n", __func__,
+			input_rate, default_rate);
+		msm_vidc_update_cap_value(inst, is_frame_rate ? FRAME_RATE : OPERATING_RATE,
+			default_rate << 16, __func__);
+	}
 exit:
 	return rc;
 }

+ 33 - 36
driver/vidc/src/msm_venc.c

@@ -1527,7 +1527,7 @@ int msm_venc_s_param(struct msm_vidc_inst *inst,
 
 	if (s_parm->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) {
 		timeperframe = &s_parm->parm.output.timeperframe;
-		max_rate = capability->cap[OPERATING_RATE].max;
+		max_rate = capability->cap[OPERATING_RATE].max >> 16;
 		default_rate = capability->cap[OPERATING_RATE].value >> 16;
 	} else {
 		timeperframe = &s_parm->parm.capture.timeperframe;
@@ -1537,9 +1537,8 @@ int msm_venc_s_param(struct msm_vidc_inst *inst,
 	}
 
 	if (!timeperframe->denominator || !timeperframe->numerator) {
-		i_vpr_e(inst,
-			"%s: invalid rate for type %u\n",
-			__func__, s_parm->type);
+		i_vpr_e(inst, "%s: type %s, invalid rate\n", __func__,
+			v4l2_type_name(s_parm->type));
 		input_rate = default_rate;
 		goto set_default;
 	}
@@ -1548,8 +1547,7 @@ int msm_venc_s_param(struct msm_vidc_inst *inst,
 	do_div(us_per_frame, timeperframe->denominator);
 
 	if (!us_per_frame) {
-		i_vpr_e(inst, "%s: us_per_frame is zero\n",
-			__func__);
+		i_vpr_e(inst, "%s: us_per_frame is zero\n", __func__);
 		rc = -EINVAL;
 		goto exit;
 	}
@@ -1557,39 +1555,30 @@ int msm_venc_s_param(struct msm_vidc_inst *inst,
 	input_rate = (u64)USEC_PER_SEC;
 	do_div(input_rate, us_per_frame);
 
-	/* Check max allowed rate */
-	if (input_rate > max_rate) {
-		i_vpr_e(inst,
-			"%s: Unsupported rate %llu, max_fps %u, type: %u\n",
-			__func__, input_rate, max_rate, s_parm->type);
-		rc = -ENOTSUPP;
-		goto exit;
-	}
-
 set_default:
-	q16_rate = (u32)input_rate << 16;
-	i_vpr_h(inst, "%s: type %s, value %#x\n",
-		__func__, v4l2_type_name(s_parm->type), q16_rate);
+	i_vpr_h(inst, "%s: type %s, %s value %d\n",
+		__func__, v4l2_type_name(s_parm->type),
+		is_frame_rate ? "frame rate" : "operating rate", input_rate);
 
-	msm_vidc_update_cap_value(inst,
-		is_frame_rate ? FRAME_RATE : OPERATING_RATE,
+	q16_rate = (u32)input_rate << 16;
+	msm_vidc_update_cap_value(inst, is_frame_rate ? FRAME_RATE : OPERATING_RATE,
 		q16_rate, __func__);
-
-	if ((s_parm->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE &&
-		inst->vb2q[INPUT_PORT].streaming) ||
-		(s_parm->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE &&
-		inst->vb2q[OUTPUT_PORT].streaming)) {
-		if (msm_vidc_check_core_mbps(inst)) {
-			i_vpr_e(inst,
-				"%s: Unsupported load with rate %d, setting default rate %d\n",
-				__func__, input_rate, default_rate);
-			msm_vidc_update_cap_value(inst,
-				is_frame_rate ? FRAME_RATE : OPERATING_RATE,
-				default_rate << 16, __func__);
-			return -ENOMEM;
+	if (is_realtime_session(inst) &&
+		((s_parm->type == INPUT_MPLANE && inst->vb2q[INPUT_PORT].streaming) ||
+		(s_parm->type == OUTPUT_MPLANE && inst->vb2q[OUTPUT_PORT].streaming))) {
+		rc = msm_vidc_check_core_mbps(inst);
+		if (rc) {
+			i_vpr_e(inst, "%s: unsupported load\n", __func__);
+			goto reset_rate;
+		}
+		rc = input_rate > max_rate;
+		if (rc) {
+			i_vpr_e(inst, "%s: unsupported rate %u, max %u\n", __func__,
+				input_rate, max_rate);
+			rc = -ENOMEM;
+			goto reset_rate;
 		}
 	}
-
 	inst->priority_level = MSM_VIDC_PRIORITY_HIGH;
 
 	if (is_frame_rate)
@@ -1612,12 +1601,20 @@ set_default:
 			sizeof(u32));
 		if (rc) {
 			i_vpr_e(inst,
-				"%s: failed to set frame rate to fw\n",
-				__func__);
+				"%s: failed to set frame rate to fw\n", __func__);
 			goto exit;
 		}
 	}
 
+	return 0;
+
+reset_rate:
+	if (rc) {
+		i_vpr_e(inst, "%s: setting rate %u failed, reset to %u\n", __func__,
+			input_rate, default_rate);
+		msm_vidc_update_cap_value(inst, is_frame_rate ? FRAME_RATE : OPERATING_RATE,
+			default_rate << 16, __func__);
+	}
 exit:
 	return rc;
 }

+ 19 - 2
driver/vidc/src/msm_vidc_control.c

@@ -1924,8 +1924,24 @@ int msm_vidc_adjust_session_priority(void *instance, struct v4l2_ctrl *ctrl)
 	if (adjusted_value == 0 && rate_by_client) {
 		rc = msm_vidc_check_core_mbps(inst);
 		if (rc) {
-			d_vpr_e("%s: priority 0 not feasible due to resource\n", __func__);
-			return rc;
+			i_vpr_e(inst, "%s: unsupported load\n", __func__);
+			goto exit;
+		}
+		rc = capability->cap[FRAME_RATE].value > capability->cap[FRAME_RATE].max;
+		if (rc) {
+			i_vpr_e(inst, "%s: unsupported FRAME_RATE %u, max %u\n", __func__,
+				capability->cap[FRAME_RATE].value >> 16,
+				capability->cap[FRAME_RATE].max >> 16);
+			rc = -ENOMEM;
+			goto exit;
+		}
+		rc = capability->cap[OPERATING_RATE].value > capability->cap[OPERATING_RATE].max;
+		if (rc) {
+			i_vpr_e(inst, "%s: unsupported OPERATING_RATE %u, max %u\n", __func__,
+				capability->cap[OPERATING_RATE].value >> 16,
+				capability->cap[OPERATING_RATE].max >> 16);
+			rc = -ENOMEM;
+			goto exit;
 		}
 	}
 
@@ -1934,6 +1950,7 @@ int msm_vidc_adjust_session_priority(void *instance, struct v4l2_ctrl *ctrl)
 
 	msm_vidc_update_cap_value(inst, PRIORITY, adjusted_value, __func__);
 
+exit:
 	return rc;
 }