2020-06-26 12:28:23

by Kaaira Gupta

[permalink] [raw]
Subject: [PATCH v6 0/3] media: Add colors' order and other info over test image

This patchset aims to add a method to display the correct order of
colors for a test image generated. It does so by adding a function
which returns a string of correct order of the colors for a test
pattern. It then adds a control in vimc which displays the string
over test image. It also displays some other information like saturation,
hue, contrast brightness and time since the stream started over test
image generated by vimc.

Changes since v5:
In patch 2:
- Add missing EXPORT_SYMBOL_GPL()
In patch 3:
- Renamed varaibles.
- use u64 instead of int for getting current time in
nanoseconds.
- Use enum instead of numbers to describe the state of osd_mode
control in code.

Changes since v4:
- Add another patch which changes char argument to const char
in function tpg_gen_text()
- Return const char * from function tpg_g_color_order() in patch
2
In 3rd patch:
- Check font in probe() instead of s_stream()
- Use dev_err instead of pr_err
- Fix errors in commit message.
- Base VIMC_CID_SHOW_INFO on VIVID_CID_OSD_TEXT_MODE

Changes since v3:
In 1st patch:
-Improved formatting of returned string.

In 2nd patch:
- Add CID prefix in control name and change it to a more
generic name.
- Rename bool variable to a generic name.
- Disable text rendering instead of stopping stream if no
font found.
- Display more info like VIVID in VIMC.

Changes since v2:
In 1st patch:
- Create a 'define' to prevent repetition of the common color
sequence string.
- Use 'fallthrough' on case statement to prevent repetition of
code.

Changes since v1:
- Divided the patch into two patches.
- Returned NULL for patterns whose color order cannot be
defined. (Reported-by: kernel test robot <[email protected]>)
- Made separate switch cases for separate test patterns
(Reported-by: kernel test robot <[email protected]>)
- Renamed variables from camelcase to use '_'
- prefixed 'media' to the patches.

Kaaira Gupta (3):
media: tpg: change char argument to const char
media: tpg: Add function to return colors' order of test image
media: vimc: Add a control to display info on test image

drivers/media/common/v4l2-tpg/v4l2-tpg-core.c | 40 ++++++++++---
drivers/media/test-drivers/vimc/Kconfig | 2 +
drivers/media/test-drivers/vimc/vimc-common.h | 1 +
drivers/media/test-drivers/vimc/vimc-core.c | 10 ++++
drivers/media/test-drivers/vimc/vimc-sensor.c | 60 +++++++++++++++++++
include/media/tpg/v4l2-tpg.h | 3 +-
6 files changed, 108 insertions(+), 8 deletions(-)

--
2.17.1


2020-06-26 12:28:57

by Kaaira Gupta

[permalink] [raw]
Subject: [PATCH v6 2/3] media: tpg: Add function to return colors' order of test image

Currently there is no method to know the correct order of the colors for
a test image generated by tpg. Write a function that returns a string of
colors' order given a tpg. It returns a NULL pointer in case of test
patterns which do not have a well defined colors' order. Hence add a
NULL check for text in tpg_gen_text().

Signed-off-by: Kaaira Gupta <[email protected]>
Reviewed-by: Kieran Bingham <[email protected]>
---
drivers/media/common/v4l2-tpg/v4l2-tpg-core.c | 30 +++++++++++++++++--
include/media/tpg/v4l2-tpg.h | 1 +
2 files changed, 29 insertions(+), 2 deletions(-)

diff --git a/drivers/media/common/v4l2-tpg/v4l2-tpg-core.c b/drivers/media/common/v4l2-tpg/v4l2-tpg-core.c
index dde22a4cbd6c..c46ddd902675 100644
--- a/drivers/media/common/v4l2-tpg/v4l2-tpg-core.c
+++ b/drivers/media/common/v4l2-tpg/v4l2-tpg-core.c
@@ -1959,12 +1959,14 @@ void tpg_gen_text(const struct tpg_data *tpg, u8 *basep[TPG_MAX_PLANES][2],
unsigned step = V4L2_FIELD_HAS_T_OR_B(tpg->field) ? 2 : 1;
unsigned div = step;
unsigned first = 0;
- unsigned len = strlen(text);
+ unsigned len;
unsigned p;

- if (font8x16 == NULL || basep == NULL)
+ if (font8x16 == NULL || basep == NULL || text == NULL)
return;

+ len = strlen(text);
+
/* Checks if it is possible to show string */
if (y + 16 >= tpg->compose.height || x + 8 >= tpg->compose.width)
return;
@@ -2006,6 +2008,30 @@ void tpg_gen_text(const struct tpg_data *tpg, u8 *basep[TPG_MAX_PLANES][2],
}
EXPORT_SYMBOL_GPL(tpg_gen_text);

+const char *tpg_g_color_order(const struct tpg_data *tpg)
+{
+ switch (tpg->pattern) {
+ case TPG_PAT_75_COLORBAR:
+ case TPG_PAT_100_COLORBAR:
+ case TPG_PAT_CSC_COLORBAR:
+ case TPG_PAT_100_HCOLORBAR:
+ return "white, yellow, cyan, green, magenta, red, blue, black";
+ case TPG_PAT_BLACK:
+ return "Black";
+ case TPG_PAT_WHITE:
+ return "White";
+ case TPG_PAT_RED:
+ return "Red";
+ case TPG_PAT_GREEN:
+ return "Green";
+ case TPG_PAT_BLUE:
+ return "Blue";
+ default:
+ return NULL;
+ }
+}
+EXPORT_SYMBOL_GPL(tpg_g_color_order);
+
void tpg_update_mv_step(struct tpg_data *tpg)
{
int factor = tpg->mv_hor_mode > TPG_MOVE_NONE ? -1 : 1;
diff --git a/include/media/tpg/v4l2-tpg.h b/include/media/tpg/v4l2-tpg.h
index 9749ed409856..0b0ddb87380e 100644
--- a/include/media/tpg/v4l2-tpg.h
+++ b/include/media/tpg/v4l2-tpg.h
@@ -252,6 +252,7 @@ void tpg_fillbuffer(struct tpg_data *tpg, v4l2_std_id std,
bool tpg_s_fourcc(struct tpg_data *tpg, u32 fourcc);
void tpg_s_crop_compose(struct tpg_data *tpg, const struct v4l2_rect *crop,
const struct v4l2_rect *compose);
+const char *tpg_g_color_order(const struct tpg_data *tpg);

static inline void tpg_s_pattern(struct tpg_data *tpg, enum tpg_pattern pattern)
{
--
2.17.1

2020-06-26 12:30:48

by Kaaira Gupta

[permalink] [raw]
Subject: [PATCH v6 3/3] media: vimc: Add a control to display info on test image

Add a control in VIMC to display information such as the correct order of
colors for a given test pattern, brightness, hue, saturation, contrast,
width and height at sensor, and time since streaming started over test image.

Signed-off-by: Kaaira Gupta <[email protected]>
---
drivers/media/test-drivers/vimc/Kconfig | 2 +
drivers/media/test-drivers/vimc/vimc-common.h | 1 +
drivers/media/test-drivers/vimc/vimc-core.c | 10 ++++
drivers/media/test-drivers/vimc/vimc-sensor.c | 60 +++++++++++++++++++
4 files changed, 73 insertions(+)

diff --git a/drivers/media/test-drivers/vimc/Kconfig b/drivers/media/test-drivers/vimc/Kconfig
index 4068a67585f9..da4b2ad6e40c 100644
--- a/drivers/media/test-drivers/vimc/Kconfig
+++ b/drivers/media/test-drivers/vimc/Kconfig
@@ -2,6 +2,8 @@
config VIDEO_VIMC
tristate "Virtual Media Controller Driver (VIMC)"
depends on VIDEO_DEV && VIDEO_V4L2
+ select FONT_SUPPORT
+ select FONT_8x16
select MEDIA_CONTROLLER
select VIDEO_V4L2_SUBDEV_API
select VIDEOBUF2_VMALLOC
diff --git a/drivers/media/test-drivers/vimc/vimc-common.h b/drivers/media/test-drivers/vimc/vimc-common.h
index ae163dec2459..a289434e75ba 100644
--- a/drivers/media/test-drivers/vimc/vimc-common.h
+++ b/drivers/media/test-drivers/vimc/vimc-common.h
@@ -20,6 +20,7 @@
#define VIMC_CID_VIMC_CLASS (0x00f00000 | 1)
#define VIMC_CID_TEST_PATTERN (VIMC_CID_VIMC_BASE + 0)
#define VIMC_CID_MEAN_WIN_SIZE (VIMC_CID_VIMC_BASE + 1)
+#define VIMC_CID_OSD_TEXT_MODE (VIMC_CID_VIMC_BASE + 2)

#define VIMC_FRAME_MAX_WIDTH 4096
#define VIMC_FRAME_MAX_HEIGHT 2160
diff --git a/drivers/media/test-drivers/vimc/vimc-core.c b/drivers/media/test-drivers/vimc/vimc-core.c
index 11210aaa2551..8337e1276bba 100644
--- a/drivers/media/test-drivers/vimc/vimc-core.c
+++ b/drivers/media/test-drivers/vimc/vimc-core.c
@@ -5,10 +5,12 @@
* Copyright (C) 2015-2017 Helen Koike <[email protected]>
*/

+#include <linux/font.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/platform_device.h>
#include <media/media-device.h>
+#include <media/tpg/v4l2-tpg.h>
#include <media/v4l2-device.h>

#include "vimc-common.h"
@@ -263,11 +265,19 @@ static int vimc_register_devices(struct vimc_device *vimc)

static int vimc_probe(struct platform_device *pdev)
{
+ const struct font_desc *font = find_font("VGA8x16");
struct vimc_device *vimc;
int ret;

dev_dbg(&pdev->dev, "probe");

+ if (!font) {
+ dev_err(&pdev->dev, "vimc: could not find font\n");
+ return -ENODEV;
+ }
+
+ tpg_set_font(font->data);
+
vimc = kzalloc(sizeof(*vimc), GFP_KERNEL);
if (!vimc)
return -ENOMEM;
diff --git a/drivers/media/test-drivers/vimc/vimc-sensor.c b/drivers/media/test-drivers/vimc/vimc-sensor.c
index a2f09ac9a360..ce438cdabb73 100644
--- a/drivers/media/test-drivers/vimc/vimc-sensor.c
+++ b/drivers/media/test-drivers/vimc/vimc-sensor.c
@@ -19,6 +19,8 @@ struct vimc_sen_device {
struct v4l2_subdev sd;
struct tpg_data tpg;
u8 *frame;
+ unsigned int osd_mode;
+ u64 start_stream_ts;
/* The active format */
struct v4l2_mbus_framefmt mbus_format;
struct v4l2_ctrl_handler hdl;
@@ -185,10 +187,46 @@ static const struct v4l2_subdev_pad_ops vimc_sen_pad_ops = {
static void *vimc_sen_process_frame(struct vimc_ent_device *ved,
const void *sink_frame)
{
+ enum osd_mode {OSD_SHOW_ALL = 0, OSD_SHOW_COUNTERS = 1};
+ u8 *basep[TPG_MAX_PLANES][2];
+ char str[100];
+ int line = 1;
+ const unsigned int line_height = 16;
struct vimc_sen_device *vsen = container_of(ved, struct vimc_sen_device,
ved);

tpg_fill_plane_buffer(&vsen->tpg, 0, 0, vsen->frame);
+ tpg_calc_text_basep(&vsen->tpg, basep, 0, vsen->frame);
+
+ if (vsen->osd_mode <= OSD_SHOW_COUNTERS) {
+ unsigned int ms;
+
+ ms = (ktime_get_ns() - vsen->start_stream_ts) / 1000000;
+ snprintf(str, sizeof(str), "%02d:%02d:%02d:%03d",
+ (ms / (60 * 60 * 1000)) % 24,
+ (ms / (60 * 1000)) % 60,
+ (ms / 1000) % 60,
+ ms % 1000);
+ tpg_gen_text(&vsen->tpg, basep, line++ * line_height, 16, str);
+ }
+
+ if (vsen->osd_mode == OSD_SHOW_ALL) {
+ const char *order = tpg_g_color_order(&vsen->tpg);
+
+ tpg_gen_text(&vsen->tpg, basep,
+ line++ * line_height, 16, order);
+ snprintf(str, sizeof(str),
+ "brightness %3d, contrast %3d, saturation %3d, hue %d ",
+ vsen->tpg.brightness,
+ vsen->tpg.contrast,
+ vsen->tpg.saturation,
+ vsen->tpg.hue);
+ tpg_gen_text(&vsen->tpg, basep, line++ * line_height, 16, str);
+ snprintf(str, sizeof(str), "sensor size: %dx%d",
+ vsen->mbus_format.width, vsen->mbus_format.height);
+ tpg_gen_text(&vsen->tpg, basep, line++ * line_height, 16, str);
+ }
+
return vsen->frame;
}

@@ -201,6 +239,8 @@ static int vimc_sen_s_stream(struct v4l2_subdev *sd, int enable)
const struct vimc_pix_map *vpix;
unsigned int frame_size;

+ vsen->start_stream_ts = ktime_get_ns();
+
/* Calculate the frame size */
vpix = vimc_pix_map_by_code(vsen->mbus_format.code);
frame_size = vsen->mbus_format.width * vpix->bpp *
@@ -269,6 +309,9 @@ static int vimc_sen_s_ctrl(struct v4l2_ctrl *ctrl)
case V4L2_CID_SATURATION:
tpg_s_saturation(&vsen->tpg, ctrl->val);
break;
+ case VIMC_CID_OSD_TEXT_MODE:
+ vsen->osd_mode = ctrl->val;
+ break;
default:
return -EINVAL;
}
@@ -307,6 +350,22 @@ static const struct v4l2_ctrl_config vimc_sen_ctrl_test_pattern = {
.qmenu = tpg_pattern_strings,
};

+static const char * const vimc_ctrl_osd_mode_strings[] = {
+ "All",
+ "Counters Only",
+ "None",
+ NULL,
+};
+
+static const struct v4l2_ctrl_config vimc_sen_ctrl_osd_mode = {
+ .ops = &vimc_sen_ctrl_ops,
+ .id = VIMC_CID_OSD_TEXT_MODE,
+ .name = "Show Information",
+ .type = V4L2_CTRL_TYPE_MENU,
+ .max = ARRAY_SIZE(vimc_ctrl_osd_mode_strings) - 2,
+ .qmenu = vimc_ctrl_osd_mode_strings,
+};
+
static struct vimc_ent_device *vimc_sen_add(struct vimc_device *vimc,
const char *vcfg_name)
{
@@ -323,6 +382,7 @@ static struct vimc_ent_device *vimc_sen_add(struct vimc_device *vimc,

v4l2_ctrl_new_custom(&vsen->hdl, &vimc_sen_ctrl_class, NULL);
v4l2_ctrl_new_custom(&vsen->hdl, &vimc_sen_ctrl_test_pattern, NULL);
+ v4l2_ctrl_new_custom(&vsen->hdl, &vimc_sen_ctrl_osd_mode, NULL);
v4l2_ctrl_new_std(&vsen->hdl, &vimc_sen_ctrl_ops,
V4L2_CID_VFLIP, 0, 1, 1, 0);
v4l2_ctrl_new_std(&vsen->hdl, &vimc_sen_ctrl_ops,
--
2.17.1

2020-06-26 12:41:22

by Helen Koike

[permalink] [raw]
Subject: Re: [PATCH v6 3/3] media: vimc: Add a control to display info on test image

Hi Kaaira,

Thanks for the patch,

On 6/26/20 8:36 AM, Kaaira Gupta wrote:
> Add a control in VIMC to display information such as the correct order of
> colors for a given test pattern, brightness, hue, saturation, contrast,
> width and height at sensor, and time since streaming started over test image.
>
> Signed-off-by: Kaaira Gupta <[email protected]>
> ---
> drivers/media/test-drivers/vimc/Kconfig | 2 +
> drivers/media/test-drivers/vimc/vimc-common.h | 1 +
> drivers/media/test-drivers/vimc/vimc-core.c | 10 ++++
> drivers/media/test-drivers/vimc/vimc-sensor.c | 60 +++++++++++++++++++
> 4 files changed, 73 insertions(+)
>
> diff --git a/drivers/media/test-drivers/vimc/Kconfig b/drivers/media/test-drivers/vimc/Kconfig
> index 4068a67585f9..da4b2ad6e40c 100644
> --- a/drivers/media/test-drivers/vimc/Kconfig
> +++ b/drivers/media/test-drivers/vimc/Kconfig
> @@ -2,6 +2,8 @@
> config VIDEO_VIMC
> tristate "Virtual Media Controller Driver (VIMC)"
> depends on VIDEO_DEV && VIDEO_V4L2
> + select FONT_SUPPORT
> + select FONT_8x16
> select MEDIA_CONTROLLER
> select VIDEO_V4L2_SUBDEV_API
> select VIDEOBUF2_VMALLOC
> diff --git a/drivers/media/test-drivers/vimc/vimc-common.h b/drivers/media/test-drivers/vimc/vimc-common.h
> index ae163dec2459..a289434e75ba 100644
> --- a/drivers/media/test-drivers/vimc/vimc-common.h
> +++ b/drivers/media/test-drivers/vimc/vimc-common.h
> @@ -20,6 +20,7 @@
> #define VIMC_CID_VIMC_CLASS (0x00f00000 | 1)
> #define VIMC_CID_TEST_PATTERN (VIMC_CID_VIMC_BASE + 0)
> #define VIMC_CID_MEAN_WIN_SIZE (VIMC_CID_VIMC_BASE + 1)
> +#define VIMC_CID_OSD_TEXT_MODE (VIMC_CID_VIMC_BASE + 2)
>
> #define VIMC_FRAME_MAX_WIDTH 4096
> #define VIMC_FRAME_MAX_HEIGHT 2160
> diff --git a/drivers/media/test-drivers/vimc/vimc-core.c b/drivers/media/test-drivers/vimc/vimc-core.c
> index 11210aaa2551..8337e1276bba 100644
> --- a/drivers/media/test-drivers/vimc/vimc-core.c
> +++ b/drivers/media/test-drivers/vimc/vimc-core.c
> @@ -5,10 +5,12 @@
> * Copyright (C) 2015-2017 Helen Koike <[email protected]>
> */
>
> +#include <linux/font.h>
> #include <linux/init.h>
> #include <linux/module.h>
> #include <linux/platform_device.h>
> #include <media/media-device.h>
> +#include <media/tpg/v4l2-tpg.h>
> #include <media/v4l2-device.h>
>
> #include "vimc-common.h"
> @@ -263,11 +265,19 @@ static int vimc_register_devices(struct vimc_device *vimc)
>
> static int vimc_probe(struct platform_device *pdev)
> {
> + const struct font_desc *font = find_font("VGA8x16");
> struct vimc_device *vimc;
> int ret;
>
> dev_dbg(&pdev->dev, "probe");
>
> + if (!font) {
> + dev_err(&pdev->dev, "vimc: could not find font\n");

You don't need the "vimc: " prefix if you are using dev_err(), it already gets the name from pdev->dev

> + return -ENODEV;
> + }
> +
> + tpg_set_font(font->data);
> +
> vimc = kzalloc(sizeof(*vimc), GFP_KERNEL);
> if (!vimc)
> return -ENOMEM;
> diff --git a/drivers/media/test-drivers/vimc/vimc-sensor.c b/drivers/media/test-drivers/vimc/vimc-sensor.c
> index a2f09ac9a360..ce438cdabb73 100644
> --- a/drivers/media/test-drivers/vimc/vimc-sensor.c
> +++ b/drivers/media/test-drivers/vimc/vimc-sensor.c
> @@ -19,6 +19,8 @@ struct vimc_sen_device {
> struct v4l2_subdev sd;
> struct tpg_data tpg;
> u8 *frame;
> + unsigned int osd_mode;
> + u64 start_stream_ts;
> /* The active format */
> struct v4l2_mbus_framefmt mbus_format;
> struct v4l2_ctrl_handler hdl;
> @@ -185,10 +187,46 @@ static const struct v4l2_subdev_pad_ops vimc_sen_pad_ops = {
> static void *vimc_sen_process_frame(struct vimc_ent_device *ved,
> const void *sink_frame)
> {
> + enum osd_mode {OSD_SHOW_ALL = 0, OSD_SHOW_COUNTERS = 1};
> + u8 *basep[TPG_MAX_PLANES][2];
> + char str[100];
> + int line = 1;

unsigned int

> + const unsigned int line_height = 16;
> struct vimc_sen_device *vsen = container_of(ved, struct vimc_sen_device,
> ved);

I would just re-order the declaration vars to have the longest lines first.

>
> tpg_fill_plane_buffer(&vsen->tpg, 0, 0, vsen->frame);
> + tpg_calc_text_basep(&vsen->tpg, basep, 0, vsen->frame);
> +
> + if (vsen->osd_mode <= OSD_SHOW_COUNTERS) {
> + unsigned int ms;
> +
> + ms = (ktime_get_ns() - vsen->start_stream_ts) / 1000000;
> + snprintf(str, sizeof(str), "%02d:%02d:%02d:%03d",
> + (ms / (60 * 60 * 1000)) % 24,
> + (ms / (60 * 1000)) % 60,
> + (ms / 1000) % 60,
> + ms % 1000);
> + tpg_gen_text(&vsen->tpg, basep, line++ * line_height, 16, str);
> + }
> +
> + if (vsen->osd_mode == OSD_SHOW_ALL) {
> + const char *order = tpg_g_color_order(&vsen->tpg);
> +
> + tpg_gen_text(&vsen->tpg, basep,
> + line++ * line_height, 16, order);
> + snprintf(str, sizeof(str),
> + "brightness %3d, contrast %3d, saturation %3d, hue %d ",
> + vsen->tpg.brightness,
> + vsen->tpg.contrast,
> + vsen->tpg.saturation,
> + vsen->tpg.hue);
> + tpg_gen_text(&vsen->tpg, basep, line++ * line_height, 16, str);
> + snprintf(str, sizeof(str), "sensor size: %dx%d",
> + vsen->mbus_format.width, vsen->mbus_format.height);
> + tpg_gen_text(&vsen->tpg, basep, line++ * line_height, 16, str);
> + }

How about the nice case-switch statement proposed by Kieram in the last version?

Thanks,
Helen

> +
> return vsen->frame;
> }
>
> @@ -201,6 +239,8 @@ static int vimc_sen_s_stream(struct v4l2_subdev *sd, int enable)
> const struct vimc_pix_map *vpix;
> unsigned int frame_size;
>
> + vsen->start_stream_ts = ktime_get_ns();
> +
> /* Calculate the frame size */
> vpix = vimc_pix_map_by_code(vsen->mbus_format.code);
> frame_size = vsen->mbus_format.width * vpix->bpp *
> @@ -269,6 +309,9 @@ static int vimc_sen_s_ctrl(struct v4l2_ctrl *ctrl)
> case V4L2_CID_SATURATION:
> tpg_s_saturation(&vsen->tpg, ctrl->val);
> break;
> + case VIMC_CID_OSD_TEXT_MODE:
> + vsen->osd_mode = ctrl->val;
> + break;
> default:
> return -EINVAL;
> }
> @@ -307,6 +350,22 @@ static const struct v4l2_ctrl_config vimc_sen_ctrl_test_pattern = {
> .qmenu = tpg_pattern_strings,
> };
>
> +static const char * const vimc_ctrl_osd_mode_strings[] = {
> + "All",
> + "Counters Only",
> + "None",
> + NULL,
> +};
> +
> +static const struct v4l2_ctrl_config vimc_sen_ctrl_osd_mode = {
> + .ops = &vimc_sen_ctrl_ops,
> + .id = VIMC_CID_OSD_TEXT_MODE,
> + .name = "Show Information",
> + .type = V4L2_CTRL_TYPE_MENU,
> + .max = ARRAY_SIZE(vimc_ctrl_osd_mode_strings) - 2,
> + .qmenu = vimc_ctrl_osd_mode_strings,
> +};
> +
> static struct vimc_ent_device *vimc_sen_add(struct vimc_device *vimc,
> const char *vcfg_name)
> {
> @@ -323,6 +382,7 @@ static struct vimc_ent_device *vimc_sen_add(struct vimc_device *vimc,
>
> v4l2_ctrl_new_custom(&vsen->hdl, &vimc_sen_ctrl_class, NULL);
> v4l2_ctrl_new_custom(&vsen->hdl, &vimc_sen_ctrl_test_pattern, NULL);
> + v4l2_ctrl_new_custom(&vsen->hdl, &vimc_sen_ctrl_osd_mode, NULL);
> v4l2_ctrl_new_std(&vsen->hdl, &vimc_sen_ctrl_ops,
> V4L2_CID_VFLIP, 0, 1, 1, 0);
> v4l2_ctrl_new_std(&vsen->hdl, &vimc_sen_ctrl_ops,
>

2020-06-26 12:41:38

by Helen Koike

[permalink] [raw]
Subject: Re: [PATCH v6 3/3] media: vimc: Add a control to display info on test image

Hi Kaaira,

Thanks for the patch,

On 6/26/20 8:36 AM, Kaaira Gupta wrote:
> Add a control in VIMC to display information such as the correct order of
> colors for a given test pattern, brightness, hue, saturation, contrast,
> width and height at sensor, and time since streaming started over test image.
>
> Signed-off-by: Kaaira Gupta <[email protected]>
> ---
> drivers/media/test-drivers/vimc/Kconfig | 2 +
> drivers/media/test-drivers/vimc/vimc-common.h | 1 +
> drivers/media/test-drivers/vimc/vimc-core.c | 10 ++++
> drivers/media/test-drivers/vimc/vimc-sensor.c | 60 +++++++++++++++++++
> 4 files changed, 73 insertions(+)
>
> diff --git a/drivers/media/test-drivers/vimc/Kconfig b/drivers/media/test-drivers/vimc/Kconfig
> index 4068a67585f9..da4b2ad6e40c 100644
> --- a/drivers/media/test-drivers/vimc/Kconfig
> +++ b/drivers/media/test-drivers/vimc/Kconfig
> @@ -2,6 +2,8 @@
> config VIDEO_VIMC
> tristate "Virtual Media Controller Driver (VIMC)"
> depends on VIDEO_DEV && VIDEO_V4L2
> + select FONT_SUPPORT
> + select FONT_8x16
> select MEDIA_CONTROLLER
> select VIDEO_V4L2_SUBDEV_API
> select VIDEOBUF2_VMALLOC
> diff --git a/drivers/media/test-drivers/vimc/vimc-common.h b/drivers/media/test-drivers/vimc/vimc-common.h
> index ae163dec2459..a289434e75ba 100644
> --- a/drivers/media/test-drivers/vimc/vimc-common.h
> +++ b/drivers/media/test-drivers/vimc/vimc-common.h
> @@ -20,6 +20,7 @@
> #define VIMC_CID_VIMC_CLASS (0x00f00000 | 1)
> #define VIMC_CID_TEST_PATTERN (VIMC_CID_VIMC_BASE + 0)
> #define VIMC_CID_MEAN_WIN_SIZE (VIMC_CID_VIMC_BASE + 1)
> +#define VIMC_CID_OSD_TEXT_MODE (VIMC_CID_VIMC_BASE + 2)
>
> #define VIMC_FRAME_MAX_WIDTH 4096
> #define VIMC_FRAME_MAX_HEIGHT 2160
> diff --git a/drivers/media/test-drivers/vimc/vimc-core.c b/drivers/media/test-drivers/vimc/vimc-core.c
> index 11210aaa2551..8337e1276bba 100644
> --- a/drivers/media/test-drivers/vimc/vimc-core.c
> +++ b/drivers/media/test-drivers/vimc/vimc-core.c
> @@ -5,10 +5,12 @@
> * Copyright (C) 2015-2017 Helen Koike <[email protected]>
> */
>
> +#include <linux/font.h>
> #include <linux/init.h>
> #include <linux/module.h>
> #include <linux/platform_device.h>
> #include <media/media-device.h>
> +#include <media/tpg/v4l2-tpg.h>
> #include <media/v4l2-device.h>
>
> #include "vimc-common.h"
> @@ -263,11 +265,19 @@ static int vimc_register_devices(struct vimc_device *vimc)
>
> static int vimc_probe(struct platform_device *pdev)
> {
> + const struct font_desc *font = find_font("VGA8x16");
> struct vimc_device *vimc;
> int ret;
>
> dev_dbg(&pdev->dev, "probe");
>
> + if (!font) {
> + dev_err(&pdev->dev, "vimc: could not find font\n");

You don't need the "vimc: " prefix if you are using dev_err(), it already gets the name from pdev->dev

> + return -ENODEV;
> + }
> +
> + tpg_set_font(font->data);
> +
> vimc = kzalloc(sizeof(*vimc), GFP_KERNEL);
> if (!vimc)
> return -ENOMEM;
> diff --git a/drivers/media/test-drivers/vimc/vimc-sensor.c b/drivers/media/test-drivers/vimc/vimc-sensor.c
> index a2f09ac9a360..ce438cdabb73 100644
> --- a/drivers/media/test-drivers/vimc/vimc-sensor.c
> +++ b/drivers/media/test-drivers/vimc/vimc-sensor.c
> @@ -19,6 +19,8 @@ struct vimc_sen_device {
> struct v4l2_subdev sd;
> struct tpg_data tpg;
> u8 *frame;
> + unsigned int osd_mode;
> + u64 start_stream_ts;
> /* The active format */
> struct v4l2_mbus_framefmt mbus_format;
> struct v4l2_ctrl_handler hdl;
> @@ -185,10 +187,46 @@ static const struct v4l2_subdev_pad_ops vimc_sen_pad_ops = {
> static void *vimc_sen_process_frame(struct vimc_ent_device *ved,
> const void *sink_frame)
> {
> + enum osd_mode {OSD_SHOW_ALL = 0, OSD_SHOW_COUNTERS = 1};
> + u8 *basep[TPG_MAX_PLANES][2];
> + char str[100];
> + int line = 1;

unsigned int

> + const unsigned int line_height = 16;
> struct vimc_sen_device *vsen = container_of(ved, struct vimc_sen_device,
> ved);

I would just re-order the declaration vars to have the longest lines first.

>
> tpg_fill_plane_buffer(&vsen->tpg, 0, 0, vsen->frame);
> + tpg_calc_text_basep(&vsen->tpg, basep, 0, vsen->frame);
> +
> + if (vsen->osd_mode <= OSD_SHOW_COUNTERS) {
> + unsigned int ms;
> +
> + ms = (ktime_get_ns() - vsen->start_stream_ts) / 1000000;
> + snprintf(str, sizeof(str), "%02d:%02d:%02d:%03d",
> + (ms / (60 * 60 * 1000)) % 24,
> + (ms / (60 * 1000)) % 60,
> + (ms / 1000) % 60,
> + ms % 1000);
> + tpg_gen_text(&vsen->tpg, basep, line++ * line_height, 16, str);
> + }
> +
> + if (vsen->osd_mode == OSD_SHOW_ALL) {
> + const char *order = tpg_g_color_order(&vsen->tpg);
> +
> + tpg_gen_text(&vsen->tpg, basep,
> + line++ * line_height, 16, order);
> + snprintf(str, sizeof(str),
> + "brightness %3d, contrast %3d, saturation %3d, hue %d ",
> + vsen->tpg.brightness,
> + vsen->tpg.contrast,
> + vsen->tpg.saturation,
> + vsen->tpg.hue);
> + tpg_gen_text(&vsen->tpg, basep, line++ * line_height, 16, str);
> + snprintf(str, sizeof(str), "sensor size: %dx%d",
> + vsen->mbus_format.width, vsen->mbus_format.height);
> + tpg_gen_text(&vsen->tpg, basep, line++ * line_height, 16, str);
> + }

How about the nice case-switch statement proposed by Kieran in the last version?

Thanks,
Helen

> +
> return vsen->frame;
> }
>
> @@ -201,6 +239,8 @@ static int vimc_sen_s_stream(struct v4l2_subdev *sd, int enable)
> const struct vimc_pix_map *vpix;
> unsigned int frame_size;
>
> + vsen->start_stream_ts = ktime_get_ns();
> +
> /* Calculate the frame size */
> vpix = vimc_pix_map_by_code(vsen->mbus_format.code);
> frame_size = vsen->mbus_format.width * vpix->bpp *
> @@ -269,6 +309,9 @@ static int vimc_sen_s_ctrl(struct v4l2_ctrl *ctrl)
> case V4L2_CID_SATURATION:
> tpg_s_saturation(&vsen->tpg, ctrl->val);
> break;
> + case VIMC_CID_OSD_TEXT_MODE:
> + vsen->osd_mode = ctrl->val;
> + break;
> default:
> return -EINVAL;
> }
> @@ -307,6 +350,22 @@ static const struct v4l2_ctrl_config vimc_sen_ctrl_test_pattern = {
> .qmenu = tpg_pattern_strings,
> };
>
> +static const char * const vimc_ctrl_osd_mode_strings[] = {
> + "All",
> + "Counters Only",
> + "None",
> + NULL,
> +};
> +
> +static const struct v4l2_ctrl_config vimc_sen_ctrl_osd_mode = {
> + .ops = &vimc_sen_ctrl_ops,
> + .id = VIMC_CID_OSD_TEXT_MODE,
> + .name = "Show Information",
> + .type = V4L2_CTRL_TYPE_MENU,
> + .max = ARRAY_SIZE(vimc_ctrl_osd_mode_strings) - 2,
> + .qmenu = vimc_ctrl_osd_mode_strings,
> +};
> +
> static struct vimc_ent_device *vimc_sen_add(struct vimc_device *vimc,
> const char *vcfg_name)
> {
> @@ -323,6 +382,7 @@ static struct vimc_ent_device *vimc_sen_add(struct vimc_device *vimc,
>
> v4l2_ctrl_new_custom(&vsen->hdl, &vimc_sen_ctrl_class, NULL);
> v4l2_ctrl_new_custom(&vsen->hdl, &vimc_sen_ctrl_test_pattern, NULL);
> + v4l2_ctrl_new_custom(&vsen->hdl, &vimc_sen_ctrl_osd_mode, NULL);
> v4l2_ctrl_new_std(&vsen->hdl, &vimc_sen_ctrl_ops,
> V4L2_CID_VFLIP, 0, 1, 1, 0);
> v4l2_ctrl_new_std(&vsen->hdl, &vimc_sen_ctrl_ops,
>

2020-06-26 12:47:32

by Kaaira Gupta

[permalink] [raw]
Subject: Re: [PATCH v6 3/3] media: vimc: Add a control to display info on test image

On Fri, Jun 26, 2020 at 08:59:19AM -0300, Helen Koike wrote:
> Hi Kaaira,
>
> Thanks for the patch,
>
> On 6/26/20 8:36 AM, Kaaira Gupta wrote:
> > Add a control in VIMC to display information such as the correct order of
> > colors for a given test pattern, brightness, hue, saturation, contrast,
> > width and height at sensor, and time since streaming started over test image.
> >
> > Signed-off-by: Kaaira Gupta <[email protected]>
> > ---
> > drivers/media/test-drivers/vimc/Kconfig | 2 +
> > drivers/media/test-drivers/vimc/vimc-common.h | 1 +
> > drivers/media/test-drivers/vimc/vimc-core.c | 10 ++++
> > drivers/media/test-drivers/vimc/vimc-sensor.c | 60 +++++++++++++++++++
> > 4 files changed, 73 insertions(+)
> >
> > diff --git a/drivers/media/test-drivers/vimc/Kconfig b/drivers/media/test-drivers/vimc/Kconfig
> > index 4068a67585f9..da4b2ad6e40c 100644
> > --- a/drivers/media/test-drivers/vimc/Kconfig
> > +++ b/drivers/media/test-drivers/vimc/Kconfig
> > @@ -2,6 +2,8 @@
> > config VIDEO_VIMC
> > tristate "Virtual Media Controller Driver (VIMC)"
> > depends on VIDEO_DEV && VIDEO_V4L2
> > + select FONT_SUPPORT
> > + select FONT_8x16
> > select MEDIA_CONTROLLER
> > select VIDEO_V4L2_SUBDEV_API
> > select VIDEOBUF2_VMALLOC
> > diff --git a/drivers/media/test-drivers/vimc/vimc-common.h b/drivers/media/test-drivers/vimc/vimc-common.h
> > index ae163dec2459..a289434e75ba 100644
> > --- a/drivers/media/test-drivers/vimc/vimc-common.h
> > +++ b/drivers/media/test-drivers/vimc/vimc-common.h
> > @@ -20,6 +20,7 @@
> > #define VIMC_CID_VIMC_CLASS (0x00f00000 | 1)
> > #define VIMC_CID_TEST_PATTERN (VIMC_CID_VIMC_BASE + 0)
> > #define VIMC_CID_MEAN_WIN_SIZE (VIMC_CID_VIMC_BASE + 1)
> > +#define VIMC_CID_OSD_TEXT_MODE (VIMC_CID_VIMC_BASE + 2)
> >
> > #define VIMC_FRAME_MAX_WIDTH 4096
> > #define VIMC_FRAME_MAX_HEIGHT 2160
> > diff --git a/drivers/media/test-drivers/vimc/vimc-core.c b/drivers/media/test-drivers/vimc/vimc-core.c
> > index 11210aaa2551..8337e1276bba 100644
> > --- a/drivers/media/test-drivers/vimc/vimc-core.c
> > +++ b/drivers/media/test-drivers/vimc/vimc-core.c
> > @@ -5,10 +5,12 @@
> > * Copyright (C) 2015-2017 Helen Koike <[email protected]>
> > */
> >
> > +#include <linux/font.h>
> > #include <linux/init.h>
> > #include <linux/module.h>
> > #include <linux/platform_device.h>
> > #include <media/media-device.h>
> > +#include <media/tpg/v4l2-tpg.h>
> > #include <media/v4l2-device.h>
> >
> > #include "vimc-common.h"
> > @@ -263,11 +265,19 @@ static int vimc_register_devices(struct vimc_device *vimc)
> >
> > static int vimc_probe(struct platform_device *pdev)
> > {
> > + const struct font_desc *font = find_font("VGA8x16");
> > struct vimc_device *vimc;
> > int ret;
> >
> > dev_dbg(&pdev->dev, "probe");
> >
> > + if (!font) {
> > + dev_err(&pdev->dev, "vimc: could not find font\n");
>
> You don't need the "vimc: " prefix if you are using dev_err(), it already gets the name from pdev->dev
>
> > + return -ENODEV;
> > + }
> > +
> > + tpg_set_font(font->data);
> > +
> > vimc = kzalloc(sizeof(*vimc), GFP_KERNEL);
> > if (!vimc)
> > return -ENOMEM;
> > diff --git a/drivers/media/test-drivers/vimc/vimc-sensor.c b/drivers/media/test-drivers/vimc/vimc-sensor.c
> > index a2f09ac9a360..ce438cdabb73 100644
> > --- a/drivers/media/test-drivers/vimc/vimc-sensor.c
> > +++ b/drivers/media/test-drivers/vimc/vimc-sensor.c
> > @@ -19,6 +19,8 @@ struct vimc_sen_device {
> > struct v4l2_subdev sd;
> > struct tpg_data tpg;
> > u8 *frame;
> > + unsigned int osd_mode;
> > + u64 start_stream_ts;
> > /* The active format */
> > struct v4l2_mbus_framefmt mbus_format;
> > struct v4l2_ctrl_handler hdl;
> > @@ -185,10 +187,46 @@ static const struct v4l2_subdev_pad_ops vimc_sen_pad_ops = {
> > static void *vimc_sen_process_frame(struct vimc_ent_device *ved,
> > const void *sink_frame)
> > {
> > + enum osd_mode {OSD_SHOW_ALL = 0, OSD_SHOW_COUNTERS = 1};
> > + u8 *basep[TPG_MAX_PLANES][2];
> > + char str[100];
> > + int line = 1;
>
> unsigned int
>
> > + const unsigned int line_height = 16;
> > struct vimc_sen_device *vsen = container_of(ved, struct vimc_sen_device,
> > ved);
>
> I would just re-order the declaration vars to have the longest lines first.
>
> >
> > tpg_fill_plane_buffer(&vsen->tpg, 0, 0, vsen->frame);
> > + tpg_calc_text_basep(&vsen->tpg, basep, 0, vsen->frame);
> > +
> > + if (vsen->osd_mode <= OSD_SHOW_COUNTERS) {
> > + unsigned int ms;
> > +
> > + ms = (ktime_get_ns() - vsen->start_stream_ts) / 1000000;
> > + snprintf(str, sizeof(str), "%02d:%02d:%02d:%03d",
> > + (ms / (60 * 60 * 1000)) % 24,
> > + (ms / (60 * 1000)) % 60,
> > + (ms / 1000) % 60,
> > + ms % 1000);
> > + tpg_gen_text(&vsen->tpg, basep, line++ * line_height, 16, str);
> > + }
> > +
> > + if (vsen->osd_mode == OSD_SHOW_ALL) {
> > + const char *order = tpg_g_color_order(&vsen->tpg);
> > +
> > + tpg_gen_text(&vsen->tpg, basep,
> > + line++ * line_height, 16, order);
> > + snprintf(str, sizeof(str),
> > + "brightness %3d, contrast %3d, saturation %3d, hue %d ",
> > + vsen->tpg.brightness,
> > + vsen->tpg.contrast,
> > + vsen->tpg.saturation,
> > + vsen->tpg.hue);
> > + tpg_gen_text(&vsen->tpg, basep, line++ * line_height, 16, str);
> > + snprintf(str, sizeof(str), "sensor size: %dx%d",
> > + vsen->mbus_format.width, vsen->mbus_format.height);
> > + tpg_gen_text(&vsen->tpg, basep, line++ * line_height, 16, str);
> > + }
>
> How about the nice case-switch statement proposed by Kieran in the last version?

If I use switch-case, I can then not declare const char * order, which
gives order of colors, /inside/ the case when it needs to be printed. I
can declare it outside, with all other initialisations if that is fine
but that would mean calling the function unnecessarily if its not to be
printed..which case should I go with?

>
> Thanks,
> Helen
>
> > +
> > return vsen->frame;
> > }
> >
> > @@ -201,6 +239,8 @@ static int vimc_sen_s_stream(struct v4l2_subdev *sd, int enable)
> > const struct vimc_pix_map *vpix;
> > unsigned int frame_size;
> >
> > + vsen->start_stream_ts = ktime_get_ns();
> > +
> > /* Calculate the frame size */
> > vpix = vimc_pix_map_by_code(vsen->mbus_format.code);
> > frame_size = vsen->mbus_format.width * vpix->bpp *
> > @@ -269,6 +309,9 @@ static int vimc_sen_s_ctrl(struct v4l2_ctrl *ctrl)
> > case V4L2_CID_SATURATION:
> > tpg_s_saturation(&vsen->tpg, ctrl->val);
> > break;
> > + case VIMC_CID_OSD_TEXT_MODE:
> > + vsen->osd_mode = ctrl->val;
> > + break;
> > default:
> > return -EINVAL;
> > }
> > @@ -307,6 +350,22 @@ static const struct v4l2_ctrl_config vimc_sen_ctrl_test_pattern = {
> > .qmenu = tpg_pattern_strings,
> > };
> >
> > +static const char * const vimc_ctrl_osd_mode_strings[] = {
> > + "All",
> > + "Counters Only",
> > + "None",
> > + NULL,
> > +};
> > +
> > +static const struct v4l2_ctrl_config vimc_sen_ctrl_osd_mode = {
> > + .ops = &vimc_sen_ctrl_ops,
> > + .id = VIMC_CID_OSD_TEXT_MODE,
> > + .name = "Show Information",
> > + .type = V4L2_CTRL_TYPE_MENU,
> > + .max = ARRAY_SIZE(vimc_ctrl_osd_mode_strings) - 2,
> > + .qmenu = vimc_ctrl_osd_mode_strings,
> > +};
> > +
> > static struct vimc_ent_device *vimc_sen_add(struct vimc_device *vimc,
> > const char *vcfg_name)
> > {
> > @@ -323,6 +382,7 @@ static struct vimc_ent_device *vimc_sen_add(struct vimc_device *vimc,
> >
> > v4l2_ctrl_new_custom(&vsen->hdl, &vimc_sen_ctrl_class, NULL);
> > v4l2_ctrl_new_custom(&vsen->hdl, &vimc_sen_ctrl_test_pattern, NULL);
> > + v4l2_ctrl_new_custom(&vsen->hdl, &vimc_sen_ctrl_osd_mode, NULL);
> > v4l2_ctrl_new_std(&vsen->hdl, &vimc_sen_ctrl_ops,
> > V4L2_CID_VFLIP, 0, 1, 1, 0);
> > v4l2_ctrl_new_std(&vsen->hdl, &vimc_sen_ctrl_ops,
> >

2020-06-26 12:50:35

by Kaaira Gupta

[permalink] [raw]
Subject: Re: [PATCH v6 3/3] media: vimc: Add a control to display info on test image

On Fri, Jun 26, 2020 at 08:59:19AM -0300, Helen Koike wrote:
> Hi Kaaira,
>
> Thanks for the patch,
>
> On 6/26/20 8:36 AM, Kaaira Gupta wrote:
> > Add a control in VIMC to display information such as the correct order of
> > colors for a given test pattern, brightness, hue, saturation, contrast,
> > width and height at sensor, and time since streaming started over test image.
> >
> > Signed-off-by: Kaaira Gupta <[email protected]>
> > ---
> > drivers/media/test-drivers/vimc/Kconfig | 2 +
> > drivers/media/test-drivers/vimc/vimc-common.h | 1 +
> > drivers/media/test-drivers/vimc/vimc-core.c | 10 ++++
> > drivers/media/test-drivers/vimc/vimc-sensor.c | 60 +++++++++++++++++++
> > 4 files changed, 73 insertions(+)
> >
> > diff --git a/drivers/media/test-drivers/vimc/Kconfig b/drivers/media/test-drivers/vimc/Kconfig
> > index 4068a67585f9..da4b2ad6e40c 100644
> > --- a/drivers/media/test-drivers/vimc/Kconfig
> > +++ b/drivers/media/test-drivers/vimc/Kconfig
> > @@ -2,6 +2,8 @@
> > config VIDEO_VIMC
> > tristate "Virtual Media Controller Driver (VIMC)"
> > depends on VIDEO_DEV && VIDEO_V4L2
> > + select FONT_SUPPORT
> > + select FONT_8x16
> > select MEDIA_CONTROLLER
> > select VIDEO_V4L2_SUBDEV_API
> > select VIDEOBUF2_VMALLOC
> > diff --git a/drivers/media/test-drivers/vimc/vimc-common.h b/drivers/media/test-drivers/vimc/vimc-common.h
> > index ae163dec2459..a289434e75ba 100644
> > --- a/drivers/media/test-drivers/vimc/vimc-common.h
> > +++ b/drivers/media/test-drivers/vimc/vimc-common.h
> > @@ -20,6 +20,7 @@
> > #define VIMC_CID_VIMC_CLASS (0x00f00000 | 1)
> > #define VIMC_CID_TEST_PATTERN (VIMC_CID_VIMC_BASE + 0)
> > #define VIMC_CID_MEAN_WIN_SIZE (VIMC_CID_VIMC_BASE + 1)
> > +#define VIMC_CID_OSD_TEXT_MODE (VIMC_CID_VIMC_BASE + 2)
> >
> > #define VIMC_FRAME_MAX_WIDTH 4096
> > #define VIMC_FRAME_MAX_HEIGHT 2160
> > diff --git a/drivers/media/test-drivers/vimc/vimc-core.c b/drivers/media/test-drivers/vimc/vimc-core.c
> > index 11210aaa2551..8337e1276bba 100644
> > --- a/drivers/media/test-drivers/vimc/vimc-core.c
> > +++ b/drivers/media/test-drivers/vimc/vimc-core.c
> > @@ -5,10 +5,12 @@
> > * Copyright (C) 2015-2017 Helen Koike <[email protected]>
> > */
> >
> > +#include <linux/font.h>
> > #include <linux/init.h>
> > #include <linux/module.h>
> > #include <linux/platform_device.h>
> > #include <media/media-device.h>
> > +#include <media/tpg/v4l2-tpg.h>
> > #include <media/v4l2-device.h>
> >
> > #include "vimc-common.h"
> > @@ -263,11 +265,19 @@ static int vimc_register_devices(struct vimc_device *vimc)
> >
> > static int vimc_probe(struct platform_device *pdev)
> > {
> > + const struct font_desc *font = find_font("VGA8x16");
> > struct vimc_device *vimc;
> > int ret;
> >
> > dev_dbg(&pdev->dev, "probe");
> >
> > + if (!font) {
> > + dev_err(&pdev->dev, "vimc: could not find font\n");
>
> You don't need the "vimc: " prefix if you are using dev_err(), it already gets the name from pdev->dev
>
> > + return -ENODEV;
> > + }
> > +
> > + tpg_set_font(font->data);
> > +
> > vimc = kzalloc(sizeof(*vimc), GFP_KERNEL);
> > if (!vimc)
> > return -ENOMEM;
> > diff --git a/drivers/media/test-drivers/vimc/vimc-sensor.c b/drivers/media/test-drivers/vimc/vimc-sensor.c
> > index a2f09ac9a360..ce438cdabb73 100644
> > --- a/drivers/media/test-drivers/vimc/vimc-sensor.c
> > +++ b/drivers/media/test-drivers/vimc/vimc-sensor.c
> > @@ -19,6 +19,8 @@ struct vimc_sen_device {
> > struct v4l2_subdev sd;
> > struct tpg_data tpg;
> > u8 *frame;
> > + unsigned int osd_mode;
> > + u64 start_stream_ts;
> > /* The active format */
> > struct v4l2_mbus_framefmt mbus_format;
> > struct v4l2_ctrl_handler hdl;
> > @@ -185,10 +187,46 @@ static const struct v4l2_subdev_pad_ops vimc_sen_pad_ops = {
> > static void *vimc_sen_process_frame(struct vimc_ent_device *ved,
> > const void *sink_frame)
> > {
> > + enum osd_mode {OSD_SHOW_ALL = 0, OSD_SHOW_COUNTERS = 1};
> > + u8 *basep[TPG_MAX_PLANES][2];
> > + char str[100];
> > + int line = 1;
>
> unsigned int
>
> > + const unsigned int line_height = 16;
> > struct vimc_sen_device *vsen = container_of(ved, struct vimc_sen_device,
> > ved);
>
> I would just re-order the declaration vars to have the longest lines first.
>
> >
> > tpg_fill_plane_buffer(&vsen->tpg, 0, 0, vsen->frame);
> > + tpg_calc_text_basep(&vsen->tpg, basep, 0, vsen->frame);
> > +
> > + if (vsen->osd_mode <= OSD_SHOW_COUNTERS) {
> > + unsigned int ms;
> > +
> > + ms = (ktime_get_ns() - vsen->start_stream_ts) / 1000000;
> > + snprintf(str, sizeof(str), "%02d:%02d:%02d:%03d",
> > + (ms / (60 * 60 * 1000)) % 24,
> > + (ms / (60 * 1000)) % 60,
> > + (ms / 1000) % 60,
> > + ms % 1000);
> > + tpg_gen_text(&vsen->tpg, basep, line++ * line_height, 16, str);
> > + }
> > +
> > + if (vsen->osd_mode == OSD_SHOW_ALL) {
> > + const char *order = tpg_g_color_order(&vsen->tpg);
> > +
> > + tpg_gen_text(&vsen->tpg, basep,
> > + line++ * line_height, 16, order);
> > + snprintf(str, sizeof(str),
> > + "brightness %3d, contrast %3d, saturation %3d, hue %d ",
> > + vsen->tpg.brightness,
> > + vsen->tpg.contrast,
> > + vsen->tpg.saturation,
> > + vsen->tpg.hue);
> > + tpg_gen_text(&vsen->tpg, basep, line++ * line_height, 16, str);
> > + snprintf(str, sizeof(str), "sensor size: %dx%d",
> > + vsen->mbus_format.width, vsen->mbus_format.height);
> > + tpg_gen_text(&vsen->tpg, basep, line++ * line_height, 16, str);
> > + }
>
> How about the nice case-switch statement proposed by Kieran in the last version?

Ignore my earlier message for this please, I was mistaken.

>
> Thanks,
> Helen
>
> > +
> > return vsen->frame;
> > }
> >
> > @@ -201,6 +239,8 @@ static int vimc_sen_s_stream(struct v4l2_subdev *sd, int enable)
> > const struct vimc_pix_map *vpix;
> > unsigned int frame_size;
> >
> > + vsen->start_stream_ts = ktime_get_ns();
> > +
> > /* Calculate the frame size */
> > vpix = vimc_pix_map_by_code(vsen->mbus_format.code);
> > frame_size = vsen->mbus_format.width * vpix->bpp *
> > @@ -269,6 +309,9 @@ static int vimc_sen_s_ctrl(struct v4l2_ctrl *ctrl)
> > case V4L2_CID_SATURATION:
> > tpg_s_saturation(&vsen->tpg, ctrl->val);
> > break;
> > + case VIMC_CID_OSD_TEXT_MODE:
> > + vsen->osd_mode = ctrl->val;
> > + break;
> > default:
> > return -EINVAL;
> > }
> > @@ -307,6 +350,22 @@ static const struct v4l2_ctrl_config vimc_sen_ctrl_test_pattern = {
> > .qmenu = tpg_pattern_strings,
> > };
> >
> > +static const char * const vimc_ctrl_osd_mode_strings[] = {
> > + "All",
> > + "Counters Only",
> > + "None",
> > + NULL,
> > +};
> > +
> > +static const struct v4l2_ctrl_config vimc_sen_ctrl_osd_mode = {
> > + .ops = &vimc_sen_ctrl_ops,
> > + .id = VIMC_CID_OSD_TEXT_MODE,
> > + .name = "Show Information",
> > + .type = V4L2_CTRL_TYPE_MENU,
> > + .max = ARRAY_SIZE(vimc_ctrl_osd_mode_strings) - 2,
> > + .qmenu = vimc_ctrl_osd_mode_strings,
> > +};
> > +
> > static struct vimc_ent_device *vimc_sen_add(struct vimc_device *vimc,
> > const char *vcfg_name)
> > {
> > @@ -323,6 +382,7 @@ static struct vimc_ent_device *vimc_sen_add(struct vimc_device *vimc,
> >
> > v4l2_ctrl_new_custom(&vsen->hdl, &vimc_sen_ctrl_class, NULL);
> > v4l2_ctrl_new_custom(&vsen->hdl, &vimc_sen_ctrl_test_pattern, NULL);
> > + v4l2_ctrl_new_custom(&vsen->hdl, &vimc_sen_ctrl_osd_mode, NULL);
> > v4l2_ctrl_new_std(&vsen->hdl, &vimc_sen_ctrl_ops,
> > V4L2_CID_VFLIP, 0, 1, 1, 0);
> > v4l2_ctrl_new_std(&vsen->hdl, &vimc_sen_ctrl_ops,
> >