On Wed May 20 09:30:44 2026 +0200, Hans Verkuil wrote:
> Don't call vivid_update_format_cap() when switching to/from reduced fps
> for HDMI inputs: that will also reset the format, which is overkill for
> this.
> 
> Make a new vivid_update_reduced_fps() function that just updates the
> dev->timeperframe_vid_cap.
> 
> Reviewed-by: Nicolas Dufresne <[email protected]>
> Fixes: c79aa6aeadb0 ("[media] vivid-capture: add control for reduced frame 
> rate")
> Cc: [email protected]
> Signed-off-by: Hans Verkuil <[email protected]>

Patch committed.

Thanks,
Hans Verkuil

 drivers/media/test-drivers/vivid/vivid-ctrls.c   |  3 ++-
 drivers/media/test-drivers/vivid/vivid-vid-cap.c | 32 ++++++++++++++----------
 drivers/media/test-drivers/vivid/vivid-vid-cap.h |  1 +
 3 files changed, 22 insertions(+), 14 deletions(-)

---

diff --git a/drivers/media/test-drivers/vivid/vivid-ctrls.c 
b/drivers/media/test-drivers/vivid/vivid-ctrls.c
index f94c15ff84f7..1077445f5772 100644
--- a/drivers/media/test-drivers/vivid/vivid-ctrls.c
+++ b/drivers/media/test-drivers/vivid/vivid-ctrls.c
@@ -609,7 +609,8 @@ static int vivid_vid_cap_s_ctrl(struct v4l2_ctrl *ctrl)
                break;
        case VIVID_CID_REDUCED_FPS:
                dev->reduced_fps = ctrl->val;
-               vivid_update_format_cap(dev, true);
+               if (dev->input_type[dev->input] == HDMI)
+                       vivid_update_reduced_fps(dev);
                break;
        case VIVID_CID_HAS_CROP_CAP:
                dev->has_crop_cap = ctrl->val;
diff --git a/drivers/media/test-drivers/vivid/vivid-vid-cap.c 
b/drivers/media/test-drivers/vivid/vivid-vid-cap.c
index b95f06a9b5ae..76e0b161c049 100644
--- a/drivers/media/test-drivers/vivid/vivid-vid-cap.c
+++ b/drivers/media/test-drivers/vivid/vivid-vid-cap.c
@@ -364,6 +364,24 @@ static enum tpg_pixel_aspect vivid_get_pixel_aspect(const 
struct vivid_dev *dev)
        return TPG_PIXEL_ASPECT_SQUARE;
 }
 
+void vivid_update_reduced_fps(struct vivid_dev *dev)
+{
+       struct v4l2_bt_timings *bt = &dev->dv_timings_cap[dev->input].bt;
+       unsigned int size = V4L2_DV_BT_FRAME_WIDTH(bt) * 
V4L2_DV_BT_FRAME_HEIGHT(bt);
+       u64 pixelclock;
+
+       if (dev->reduced_fps && can_reduce_fps(bt)) {
+               pixelclock = div_u64(bt->pixelclock * 1000, 1001);
+               bt->flags |= V4L2_DV_FL_REDUCED_FPS;
+       } else {
+               pixelclock = bt->pixelclock;
+               bt->flags &= ~V4L2_DV_FL_REDUCED_FPS;
+       }
+       dev->timeperframe_vid_cap = (struct v4l2_fract) {
+               size / 100, (u32)pixelclock / 100
+       };
+}
+
 /*
  * Called whenever the format has to be reset which can occur when
  * changing inputs, standard, timings, etc.
@@ -372,8 +390,6 @@ void vivid_update_format_cap(struct vivid_dev *dev, bool 
keep_controls)
 {
        struct v4l2_bt_timings *bt = &dev->dv_timings_cap[dev->input].bt;
        u32 dims[V4L2_CTRL_MAX_DIMS] = {};
-       unsigned size;
-       u64 pixelclock;
 
        switch (dev->input_type[dev->input]) {
        case WEBCAM:
@@ -402,17 +418,7 @@ void vivid_update_format_cap(struct vivid_dev *dev, bool 
keep_controls)
        case HDMI:
                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 && can_reduce_fps(bt)) {
-                       pixelclock = div_u64(bt->pixelclock * 1000, 1001);
-                       bt->flags |= V4L2_DV_FL_REDUCED_FPS;
-               } else {
-                       pixelclock = bt->pixelclock;
-                       bt->flags &= ~V4L2_DV_FL_REDUCED_FPS;
-               }
-               dev->timeperframe_vid_cap = (struct v4l2_fract) {
-                       size / 100, (u32)pixelclock / 100
-               };
+               vivid_update_reduced_fps(dev);
                if (bt->interlaced)
                        dev->field_cap = V4L2_FIELD_ALTERNATE;
                else
diff --git a/drivers/media/test-drivers/vivid/vivid-vid-cap.h 
b/drivers/media/test-drivers/vivid/vivid-vid-cap.h
index 38a99f7e038e..d08a85927510 100644
--- a/drivers/media/test-drivers/vivid/vivid-vid-cap.h
+++ b/drivers/media/test-drivers/vivid/vivid-vid-cap.h
@@ -9,6 +9,7 @@
 #define _VIVID_VID_CAP_H_
 
 void vivid_update_quality(struct vivid_dev *dev);
+void vivid_update_reduced_fps(struct vivid_dev *dev);
 void vivid_update_format_cap(struct vivid_dev *dev, bool keep_controls);
 void vivid_update_outputs(struct vivid_dev *dev);
 void vivid_update_connected_outputs(struct vivid_dev *dev);
_______________________________________________
linuxtv-commits mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to