From: Kevin.xie Date: Tue, 15 Nov 2022 06:04:20 +0000 (+0800) Subject: v4l2_driver: vin: Add skip frames for isp control. X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=e997d0ed2df944b7e794ff5de4760600335dc614;p=platform%2Fkernel%2Flinux-starfive.git v4l2_driver: vin: Add skip frames for isp control. The duration of extra isp control skip frames are fixed to 1 second. Signed-off-by: Kevin.xie --- diff --git a/drivers/media/platform/starfive/v4l2_driver/stf_vin.c b/drivers/media/platform/starfive/v4l2_driver/stf_vin.c index f333371..87380768 100644 --- a/drivers/media/platform/starfive/v4l2_driver/stf_vin.c +++ b/drivers/media/platform/starfive/v4l2_driver/stf_vin.c @@ -16,8 +16,13 @@ #define line_to_vin2_dev(ptr_line) \ container_of(vin_line_array(ptr_line), struct stf_vin2_dev, line) -#define VIN_FRAME_DROP_MAX_VAL 30 +#define VIN_FRAME_DROP_MAX_VAL 90 #define VIN_FRAME_DROP_MIN_VAL 4 +#define VIN_FRAME_PER_SEC_MAX_VAL 90 + +/* ISP ctrl need 1 sec to let frames become stable. */ +#define VIN_FRAME_DROP_SEC_FOR_ISP_CTRL 1 + // #define VIN_TWO_BUFFER @@ -312,15 +317,33 @@ exit: static unsigned int get_frame_skip(struct vin_line *line) { unsigned int frame_skip = 0; + unsigned int isp_ctrl_skip_frames = 0; struct media_entity *sensor; + struct v4l2_subdev_frame_interval fi; sensor = stfcamss_find_sensor(&line->subdev.entity); if (sensor) { + int fps = 0; struct v4l2_subdev *subdev = media_entity_to_v4l2_subdev(sensor); + if (subdev->ops->video->g_frame_interval) { + if (!subdev->ops->video->g_frame_interval(subdev, &fi)) + fps = fi.interval.denominator; + + if (fps > 0 && fps <= 90) + isp_ctrl_skip_frames = fps * VIN_FRAME_DROP_SEC_FOR_ISP_CTRL; + } + if (!fps) + st_debug(ST_VIN, "%s, Failed to get sensor fps !\n", __func__); + + if (isp_ctrl_skip_frames <= VIN_FRAME_DROP_MIN_VAL) + isp_ctrl_skip_frames = VIN_FRAME_DROP_MIN_VAL; + v4l2_subdev_call(subdev, sensor, g_skip_frames, &frame_skip); - frame_skip += VIN_FRAME_DROP_MIN_VAL; + + frame_skip += isp_ctrl_skip_frames; + if (frame_skip > VIN_FRAME_DROP_MAX_VAL) frame_skip = VIN_FRAME_DROP_MAX_VAL; st_debug(ST_VIN, "%s, frame_skip %d\n", __func__, frame_skip);