With this patch, vivid capture thread can now generate reduced
fps by factor of 1000 / 1001. This is controlled using a boolean
VIVID_CID_REDUCED_FPS added in vivid control. For reduced fps,
capture time is controlled by scaling down timeperframe_vid_cap
with a factor of 1000 / 1001 if VIVID_CID_REDUCED_FPS is true.

Cc: Hans Verkuil <[email protected]>
Signed-off-by: Prashant Laddha <[email protected]>
---
 drivers/media/platform/vivid/vivid-core.h    |  1 +
 drivers/media/platform/vivid/vivid-ctrls.c   | 15 +++++++++++++++
 drivers/media/platform/vivid/vivid-vid-cap.c |  7 ++++++-
 3 files changed, 22 insertions(+), 1 deletion(-)

diff --git a/drivers/media/platform/vivid/vivid-core.h 
b/drivers/media/platform/vivid/vivid-core.h
index c72349c..4a2c8b7 100644
--- a/drivers/media/platform/vivid/vivid-core.h
+++ b/drivers/media/platform/vivid/vivid-core.h
@@ -263,6 +263,7 @@ struct vivid_dev {
        bool                            vflip;
        bool                            vbi_cap_interlaced;
        bool                            loop_video;
+       bool                            reduced_fps;
 
        /* Framebuffer */
        unsigned long                   video_pbase;
diff --git a/drivers/media/platform/vivid/vivid-ctrls.c 
b/drivers/media/platform/vivid/vivid-ctrls.c
index 339c8b7..6becdfe 100644
--- a/drivers/media/platform/vivid/vivid-ctrls.c
+++ b/drivers/media/platform/vivid/vivid-ctrls.c
@@ -78,6 +78,7 @@
 #define VIVID_CID_TIME_WRAP            (VIVID_CID_VIVID_BASE + 39)
 #define VIVID_CID_MAX_EDID_BLOCKS      (VIVID_CID_VIVID_BASE + 40)
 #define VIVID_CID_PERCENTAGE_FILL      (VIVID_CID_VIVID_BASE + 41)
+#define VIVID_CID_REDUCED_FPS          (VIVID_CID_VIVID_BASE + 42)
 
 #define VIVID_CID_STD_SIGNAL_MODE      (VIVID_CID_VIVID_BASE + 60)
 #define VIVID_CID_STANDARD             (VIVID_CID_VIVID_BASE + 61)
@@ -422,6 +423,10 @@ static int vivid_vid_cap_s_ctrl(struct v4l2_ctrl *ctrl)
                dev->sensor_vflip = ctrl->val;
                tpg_s_vflip(&dev->tpg, dev->sensor_vflip ^ dev->vflip);
                break;
+       case VIVID_CID_REDUCED_FPS:
+               dev->reduced_fps = ctrl->val;
+               vivid_update_format_cap(dev, true);
+               break;
        case VIVID_CID_HAS_CROP_CAP:
                dev->has_crop_cap = ctrl->val;
                vivid_update_format_cap(dev, true);
@@ -599,6 +604,15 @@ static const struct v4l2_ctrl_config vivid_ctrl_vflip = {
        .step = 1,
 };
 
+static const struct v4l2_ctrl_config vivid_ctrl_reduced_fps = {
+       .ops = &vivid_vid_cap_ctrl_ops,
+       .id = VIVID_CID_REDUCED_FPS,
+       .name = "Reduced fps",
+       .type = V4L2_CTRL_TYPE_BOOLEAN,
+       .max = 1,
+       .step = 1,
+};
+
 static const struct v4l2_ctrl_config vivid_ctrl_has_crop_cap = {
        .ops = &vivid_vid_cap_ctrl_ops,
        .id = VIVID_CID_HAS_CROP_CAP,
@@ -1379,6 +1393,7 @@ int vivid_create_controls(struct vivid_dev *dev, bool 
show_ccs_cap,
                v4l2_ctrl_new_custom(hdl_vid_cap, &vivid_ctrl_vflip, NULL);
                v4l2_ctrl_new_custom(hdl_vid_cap, &vivid_ctrl_insert_sav, NULL);
                v4l2_ctrl_new_custom(hdl_vid_cap, &vivid_ctrl_insert_eav, NULL);
+               v4l2_ctrl_new_custom(hdl_vid_cap, &vivid_ctrl_reduced_fps, 
NULL);
                if (show_ccs_cap) {
                        dev->ctrl_has_crop_cap = 
v4l2_ctrl_new_custom(hdl_vid_cap,
                                &vivid_ctrl_has_crop_cap, NULL);
diff --git a/drivers/media/platform/vivid/vivid-vid-cap.c 
b/drivers/media/platform/vivid/vivid-vid-cap.c
index ed0b878..2b26059 100644
--- a/drivers/media/platform/vivid/vivid-vid-cap.c
+++ b/drivers/media/platform/vivid/vivid-vid-cap.c
@@ -401,6 +401,7 @@ void vivid_update_format_cap(struct vivid_dev *dev, bool 
keep_controls)
 {
        struct v4l2_bt_timings *bt = &dev->dv_timings_cap.bt;
        unsigned size;
+       u64 pixelclock;
 
        switch (dev->input_type[dev->input]) {
        case WEBCAM:
@@ -430,8 +431,12 @@ void vivid_update_format_cap(struct vivid_dev *dev, bool 
keep_controls)
                dev->src_rect.width = bt->width;
                dev->src_rect.height = bt->height;
                size = V4L2_DV_BT_FRAME_WIDTH(bt) * V4L2_DV_BT_FRAME_HEIGHT(bt);
+               if (dev->reduced_fps)
+                       pixelclock = div_u64((bt->pixelclock * 1000), 1001);
+               else
+                       pixelclock = bt->pixelclock;
                dev->timeperframe_vid_cap = (struct v4l2_fract) {
-                       size / 100, (u32)bt->pixelclock / 100
+                       size / 100, (u32)pixelclock / 100
                };
                if (bt->interlaced)
                        dev->field_cap = V4L2_FIELD_ALTERNATE;
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to