Re: [RFC PATCH 2/2] vivid: add support for reduced fps in video capture
On 08/23/2015 04:09 PM, Prashant Laddha wrote: > 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> Signed-off-by: Prashant Laddha > --- > 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 { > boolvflip; > boolvbi_cap_interlaced; > boolloop_video; > + boolreduced_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(>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 = _vid_cap_ctrl_ops, > + .id = VIVID_CID_REDUCED_FPS, > + .name = "Reduced fps", I think "Reduced Framerate" is a better description. > + .type = V4L2_CTRL_TYPE_BOOLEAN, > + .max = 1, > + .step = 1, > +}; > + > static const struct v4l2_ctrl_config vivid_ctrl_has_crop_cap = { > .ops = _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, _ctrl_vflip, NULL); > v4l2_ctrl_new_custom(hdl_vid_cap, _ctrl_insert_sav, NULL); > v4l2_ctrl_new_custom(hdl_vid_cap, _ctrl_insert_eav, NULL); > + v4l2_ctrl_new_custom(hdl_vid_cap, _ctrl_reduced_fps, > NULL); > if (show_ccs_cap) { > dev->ctrl_has_crop_cap = > v4l2_ctrl_new_custom(hdl_vid_cap, > _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 = >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) This needs a check similar to reduce_fps() in patch 1/2. Except for the fact that the bt->flags & V4L2_DV_FL_REDUCED_FPS check is invalid for receivers. Perhaps that check should be moved out of reduce_fps() so that that function can be shared between capture and output. The reduced_fps flag should only be honored for timings that allow it. > + pixelclock = div_u64((bt->pixelclock * 1000), 1001); No parenthesis needed around bt->pixelclock * 1000. > + else > + pixelclock =
[RFC PATCH 2/2] vivid: add support for reduced fps in video capture
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 hans.verk...@cisco.com Signed-off-by: Prashant Laddha prlad...@cisco.com --- 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 { boolvflip; boolvbi_cap_interlaced; boolloop_video; + boolreduced_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 majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html