Re: [RFC PATCH 2/2] vivid: add support for reduced fps in video capture

2015-09-04 Thread Hans Verkuil
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

2015-08-23 Thread Prashant Laddha
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