Sfoglia il codice sorgente

video: driver: amend frame/operating rate settings

Amend frame rate or operating rate settings for encoder
to preserve precision value if numerator is greater than 1.

Change-Id: Idc84b07f7a5558b564efaac21d663a0deda207c2
Signed-off-by: Maheshwar Ajja <[email protected]>
Deepa Guthyappa Madivalara 2 anni fa
parent
commit
1b94bd8174
1 ha cambiato i file con 25 aggiunte e 29 eliminazioni
  1. 25 29
      driver/vidc/src/msm_venc.c

+ 25 - 29
driver/vidc/src/msm_venc.c

@@ -1667,8 +1667,8 @@ int msm_venc_s_param(struct msm_vidc_inst *inst,
 {
 	int rc = 0;
 	struct v4l2_fract *timeperframe = NULL;
-	u32 q16_rate, max_rate, default_rate;
-	u64 us_per_frame = 0, input_rate = 0;
+	u32 input_rate_q16, max_rate_q16;
+	u32 input_rate, default_rate;
 	bool is_frame_rate = false;
 
 	if (!inst || !s_parm) {
@@ -1677,14 +1677,16 @@ int msm_venc_s_param(struct msm_vidc_inst *inst,
 	}
 
 	if (s_parm->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) {
+		/* operating rate */
 		timeperframe = &s_parm->parm.output.timeperframe;
-		max_rate = inst->capabilities[OPERATING_RATE].max >> 16;
+		max_rate_q16 = inst->capabilities[OPERATING_RATE].max;
 		default_rate = inst->capabilities[OPERATING_RATE].value >> 16;
 		s_parm->parm.output.capability = V4L2_CAP_TIMEPERFRAME;
 	} else {
+		/* frame rate */
 		timeperframe = &s_parm->parm.capture.timeperframe;
 		is_frame_rate = true;
-		max_rate = inst->capabilities[FRAME_RATE].max >> 16;
+		max_rate_q16 = inst->capabilities[FRAME_RATE].max;
 		default_rate = inst->capabilities[FRAME_RATE].value >> 16;
 		s_parm->parm.capture.capability = V4L2_CAP_TIMEPERFRAME;
 	}
@@ -1698,25 +1700,26 @@ int msm_venc_s_param(struct msm_vidc_inst *inst,
 			timeperframe->denominator = default_rate;
 	}
 
-	us_per_frame = timeperframe->numerator * (u64)USEC_PER_SEC;
-	do_div(us_per_frame, timeperframe->denominator);
+	input_rate = (timeperframe->denominator / timeperframe->numerator);
+	if (input_rate > (max_rate_q16 >> 16)) {
+		input_rate_q16 = max_rate_q16;
+		i_vpr_h(inst, "%s: type %s, %s value %u limited to %u\n",
+			__func__, v4l2_type_name(s_parm->type),
+			is_frame_rate ? "frame rate" : "operating rate",
+			input_rate_q16, max_rate_q16);
+	} else {
+		input_rate_q16 = input_rate << 16;
+		input_rate_q16 |=
+			(timeperframe->denominator % timeperframe->numerator);
 
-	if (!us_per_frame) {
-		i_vpr_e(inst, "%s: us_per_frame is zero\n", __func__);
-		rc = -EINVAL;
-		goto exit;
 	}
-
-	input_rate = (u64)USEC_PER_SEC;
-	do_div(input_rate, us_per_frame);
-
-	i_vpr_h(inst, "%s: type %s, %s value %llu\n",
+	i_vpr_h(inst, "%s: type %s, %s value %u\n",
 		__func__, v4l2_type_name(s_parm->type),
-		is_frame_rate ? "frame rate" : "operating rate", input_rate);
+		is_frame_rate ? "frame rate" : "operating rate",
+		input_rate_q16 >> 16);
 
-	q16_rate = (u32)input_rate << 16;
 	msm_vidc_update_cap_value(inst, is_frame_rate ? FRAME_RATE : OPERATING_RATE,
-		q16_rate, __func__);
+		input_rate_q16, __func__);
 	if (is_realtime_session(inst) &&
 		((s_parm->type == INPUT_MPLANE && inst->bufq[INPUT_PORT].vb2q->streaming) ||
 		(s_parm->type == OUTPUT_MPLANE && inst->bufq[OUTPUT_PORT].vb2q->streaming))) {
@@ -1725,13 +1728,6 @@ int msm_venc_s_param(struct msm_vidc_inst *inst,
 			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 %llu, max %u\n", __func__,
-				input_rate, max_rate);
-			rc = -ENOMEM;
-			goto reset_rate;
-		}
 	}
 
 	if (is_frame_rate)
@@ -1750,22 +1746,22 @@ int msm_venc_s_param(struct msm_vidc_inst *inst,
 			HFI_HOST_FLAGS_NONE,
 			HFI_PORT_BITSTREAM,
 			HFI_PAYLOAD_Q16,
-			&q16_rate,
+			&input_rate_q16,
 			sizeof(u32));
 		if (rc) {
 			i_vpr_e(inst,
 				"%s: failed to set frame rate to fw\n", __func__);
 			goto exit;
 		}
-		inst->auto_framerate = q16_rate;
+		inst->auto_framerate = input_rate_q16;
 	}
 
 	return 0;
 
 reset_rate:
 	if (rc) {
-		i_vpr_e(inst, "%s: setting rate %llu failed, reset to %u\n", __func__,
-			input_rate, default_rate);
+		i_vpr_e(inst, "%s: setting rate %u failed, reset to %u\n", __func__,
+			input_rate_q16 >> 16, default_rate);
 		msm_vidc_update_cap_value(inst, is_frame_rate ? FRAME_RATE : OPERATING_RATE,
 			default_rate << 16, __func__);
 	}