v4l2_driver: vin: Add skip frames for isp control.
authorKevin.xie <kevin.xie@starfivetech.com>
Tue, 15 Nov 2022 06:04:20 +0000 (14:04 +0800)
committerKevin.xie <kevin.xie@starfivetech.com>
Tue, 15 Nov 2022 08:37:20 +0000 (16:37 +0800)
The duration of extra isp control skip frames are fixed to 1 second.

Signed-off-by: Kevin.xie <kevin.xie@starfivetech.com>
drivers/media/platform/starfive/v4l2_driver/stf_vin.c

index f333371..8738076 100644 (file)
 #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);