linux-media.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v7 0/3] media: Add colors' order and other info over test image
@ 2020-06-26 13:06 Kaaira Gupta
  2020-06-26 13:06 ` [PATCH v7 1/3] media: tpg: change char argument to const char Kaaira Gupta
                   ` (2 more replies)
  0 siblings, 3 replies; 11+ messages in thread
From: Kaaira Gupta @ 2020-06-26 13:06 UTC (permalink / raw)
  To: Helen Koike, Shuah Khan, Mauro Carvalho Chehab, linux-media,
	linux-kernel, Kieran Bingham, hverkuil
  Cc: Kaaira Gupta

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 v6:
	In patch 3:
	- Use switch case instead of if()
	- reorder declarartions.

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 <lkp@intel.com>)
        - Made separate switch cases for separate test patterns
         (Reported-by: kernel test robot <lkp@intel.com>)
        - 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 | 70 +++++++++++++++++++
 include/media/tpg/v4l2-tpg.h                  |  3 +-
 6 files changed, 118 insertions(+), 8 deletions(-)

-- 
2.17.1


^ permalink raw reply	[flat|nested] 11+ messages in thread

* [PATCH v7 1/3] media: tpg: change char argument to const char
  2020-06-26 13:06 [PATCH v7 0/3] media: Add colors' order and other info over test image Kaaira Gupta
@ 2020-06-26 13:06 ` Kaaira Gupta
  2020-06-26 13:06 ` [PATCH v7 2/3] media: tpg: Add function to return colors' order of test image Kaaira Gupta
  2020-06-26 13:07 ` [PATCH v7 3/3] media: vimc: Add a control to display info on " Kaaira Gupta
  2 siblings, 0 replies; 11+ messages in thread
From: Kaaira Gupta @ 2020-06-26 13:06 UTC (permalink / raw)
  To: Helen Koike, Shuah Khan, Mauro Carvalho Chehab, linux-media,
	linux-kernel, Kieran Bingham, hverkuil
  Cc: Kaaira Gupta

Change the argument of type char * to const char * for function
tpg_gen_text().

Signed-off-by: Kaaira Gupta <kgupta@es.iitr.ac.in>
---
 drivers/media/common/v4l2-tpg/v4l2-tpg-core.c | 10 +++++-----
 include/media/tpg/v4l2-tpg.h                  |  2 +-
 2 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/drivers/media/common/v4l2-tpg/v4l2-tpg-core.c b/drivers/media/common/v4l2-tpg/v4l2-tpg-core.c
index 50f1e0b28b25..dde22a4cbd6c 100644
--- a/drivers/media/common/v4l2-tpg/v4l2-tpg-core.c
+++ b/drivers/media/common/v4l2-tpg/v4l2-tpg-core.c
@@ -1927,34 +1927,34 @@ typedef struct { u16 __; u8 _; } __packed x24;
 
 static noinline void tpg_print_str_2(const struct tpg_data *tpg, u8 *basep[TPG_MAX_PLANES][2],
 			unsigned p, unsigned first, unsigned div, unsigned step,
-			int y, int x, char *text, unsigned len)
+			int y, int x, const char *text, unsigned len)
 {
 	PRINTSTR(u8);
 }
 
 static noinline void tpg_print_str_4(const struct tpg_data *tpg, u8 *basep[TPG_MAX_PLANES][2],
 			unsigned p, unsigned first, unsigned div, unsigned step,
-			int y, int x, char *text, unsigned len)
+			int y, int x, const char *text, unsigned len)
 {
 	PRINTSTR(u16);
 }
 
 static noinline void tpg_print_str_6(const struct tpg_data *tpg, u8 *basep[TPG_MAX_PLANES][2],
 			unsigned p, unsigned first, unsigned div, unsigned step,
-			int y, int x, char *text, unsigned len)
+			int y, int x, const char *text, unsigned len)
 {
 	PRINTSTR(x24);
 }
 
 static noinline void tpg_print_str_8(const struct tpg_data *tpg, u8 *basep[TPG_MAX_PLANES][2],
 			unsigned p, unsigned first, unsigned div, unsigned step,
-			int y, int x, char *text, unsigned len)
+			int y, int x, const char *text, unsigned len)
 {
 	PRINTSTR(u32);
 }
 
 void tpg_gen_text(const struct tpg_data *tpg, u8 *basep[TPG_MAX_PLANES][2],
-		  int y, int x, char *text)
+		  int y, int x, const char *text)
 {
 	unsigned step = V4L2_FIELD_HAS_T_OR_B(tpg->field) ? 2 : 1;
 	unsigned div = step;
diff --git a/include/media/tpg/v4l2-tpg.h b/include/media/tpg/v4l2-tpg.h
index eb191e85d363..9749ed409856 100644
--- a/include/media/tpg/v4l2-tpg.h
+++ b/include/media/tpg/v4l2-tpg.h
@@ -241,7 +241,7 @@ void tpg_log_status(struct tpg_data *tpg);
 
 void tpg_set_font(const u8 *f);
 void tpg_gen_text(const struct tpg_data *tpg,
-		u8 *basep[TPG_MAX_PLANES][2], int y, int x, char *text);
+		u8 *basep[TPG_MAX_PLANES][2], int y, int x, const char *text);
 void tpg_calc_text_basep(struct tpg_data *tpg,
 		u8 *basep[TPG_MAX_PLANES][2], unsigned p, u8 *vbuf);
 unsigned tpg_g_interleaved_plane(const struct tpg_data *tpg, unsigned buf_line);
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH v7 2/3] media: tpg: Add function to return colors' order of test image
  2020-06-26 13:06 [PATCH v7 0/3] media: Add colors' order and other info over test image Kaaira Gupta
  2020-06-26 13:06 ` [PATCH v7 1/3] media: tpg: change char argument to const char Kaaira Gupta
@ 2020-06-26 13:06 ` Kaaira Gupta
  2020-06-26 13:07 ` [PATCH v7 3/3] media: vimc: Add a control to display info on " Kaaira Gupta
  2 siblings, 0 replies; 11+ messages in thread
From: Kaaira Gupta @ 2020-06-26 13:06 UTC (permalink / raw)
  To: Helen Koike, Shuah Khan, Mauro Carvalho Chehab, linux-media,
	linux-kernel, Kieran Bingham, hverkuil
  Cc: Kaaira Gupta

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 <kgupta@es.iitr.ac.in>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
---
 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


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH v7 3/3] media: vimc: Add a control to display info on test image
  2020-06-26 13:06 [PATCH v7 0/3] media: Add colors' order and other info over test image Kaaira Gupta
  2020-06-26 13:06 ` [PATCH v7 1/3] media: tpg: change char argument to const char Kaaira Gupta
  2020-06-26 13:06 ` [PATCH v7 2/3] media: tpg: Add function to return colors' order of test image Kaaira Gupta
@ 2020-06-26 13:07 ` Kaaira Gupta
  2020-06-26 15:35   ` kernel test robot
  2020-06-26 16:01   ` Helen Koike
  2 siblings, 2 replies; 11+ messages in thread
From: Kaaira Gupta @ 2020-06-26 13:07 UTC (permalink / raw)
  To: Helen Koike, Shuah Khan, Mauro Carvalho Chehab, linux-media,
	linux-kernel, Kieran Bingham, hverkuil
  Cc: Kaaira Gupta

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 over test image.

Signed-off-by: Kaaira Gupta <kgupta@es.iitr.ac.in>
---
 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 | 70 +++++++++++++++++++
 4 files changed, 83 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..4b0ae6f51d76 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 <helen.fornazier@gmail.com>
  */
 
+#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, "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..9e4fb3f4d60d 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;
@@ -187,8 +189,54 @@ static void *vimc_sen_process_frame(struct vimc_ent_device *ved,
 {
 	struct vimc_sen_device *vsen = container_of(ved, struct vimc_sen_device,
 						    ved);
+	enum osd_mode {OSD_SHOW_ALL = 0, OSD_SHOW_COUNTERS = 1, OSD_SHOW_NONE = 2};
+	const unsigned int line_height = 16;
+	u8 *basep[TPG_MAX_PLANES][2];
+	unsigned int line = 1;
+	char str[100];
 
 	tpg_fill_plane_buffer(&vsen->tpg, 0, 0, vsen->frame);
+	tpg_calc_text_basep(&vsen->tpg, basep, 0, vsen->frame);
+	switch (vsen->osd_mode) {
+	case 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);
+		}
+	case 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);
+			break;
+		}
+	case OSD_SHOW_NONE:
+	default:
+		break;
+	}
+
 	return vsen->frame;
 }
 
@@ -201,6 +249,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 +319,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 +360,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 +392,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


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: [PATCH v7 3/3] media: vimc: Add a control to display info on test image
  2020-06-26 13:07 ` [PATCH v7 3/3] media: vimc: Add a control to display info on " Kaaira Gupta
@ 2020-06-26 15:35   ` kernel test robot
  2020-06-26 16:01   ` Helen Koike
  1 sibling, 0 replies; 11+ messages in thread
From: kernel test robot @ 2020-06-26 15:35 UTC (permalink / raw)
  To: Kaaira Gupta, Helen Koike, Shuah Khan, Mauro Carvalho Chehab,
	linux-kernel, Kieran Bingham, hverkuil
  Cc: kbuild-all, linux-media, Kaaira Gupta

[-- Attachment #1: Type: text/plain, Size: 3734 bytes --]

Hi Kaaira,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on linuxtv-media/master]
[also build test WARNING on v5.8-rc2 next-20200626]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use  as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/0day-ci/linux/commits/Kaaira-Gupta/media-Add-colors-order-and-other-info-over-test-image/20200626-210915
base:   git://linuxtv.org/media_tree.git master
config: s390-allyesconfig (attached as .config)
compiler: s390-linux-gcc (GCC) 9.3.0
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # save the attached .config to linux build tree
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross ARCH=s390 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>

All warnings (new ones prefixed by >>):

   drivers/media/test-drivers/vimc/vimc-sensor.c: In function 'vimc_sen_process_frame':
>> drivers/media/test-drivers/vimc/vimc-sensor.c:218:4: warning: this statement may fall through [-Wimplicit-fallthrough=]
     218 |    tpg_gen_text(&vsen->tpg, basep, line++ * line_height,
         |    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     219 |          16, str);
         |          ~~~~~~~~
   drivers/media/test-drivers/vimc/vimc-sensor.c:221:2: note: here
     221 |  case OSD_SHOW_COUNTERS:
         |  ^~~~

vim +218 drivers/media/test-drivers/vimc/vimc-sensor.c

   186	
   187	static void *vimc_sen_process_frame(struct vimc_ent_device *ved,
   188					    const void *sink_frame)
   189	{
   190		struct vimc_sen_device *vsen = container_of(ved, struct vimc_sen_device,
   191							    ved);
   192		enum osd_mode {OSD_SHOW_ALL = 0, OSD_SHOW_COUNTERS = 1, OSD_SHOW_NONE = 2};
   193		const unsigned int line_height = 16;
   194		u8 *basep[TPG_MAX_PLANES][2];
   195		unsigned int line = 1;
   196		char str[100];
   197	
   198		tpg_fill_plane_buffer(&vsen->tpg, 0, 0, vsen->frame);
   199		tpg_calc_text_basep(&vsen->tpg, basep, 0, vsen->frame);
   200		switch (vsen->osd_mode) {
   201		case OSD_SHOW_ALL:
   202			{
   203				const char *order = tpg_g_color_order(&vsen->tpg);
   204	
   205				tpg_gen_text(&vsen->tpg, basep,
   206					     line++ * line_height, 16, order);
   207				snprintf(str, sizeof(str),
   208					 "brightness %3d, contrast %3d, saturation %3d, hue %d ",
   209					 vsen->tpg.brightness,
   210					 vsen->tpg.contrast,
   211					 vsen->tpg.saturation,
   212					 vsen->tpg.hue);
   213				tpg_gen_text(&vsen->tpg, basep, line++ * line_height,
   214					     16, str);
   215				snprintf(str, sizeof(str), "sensor size: %dx%d",
   216					 vsen->mbus_format.width,
   217					 vsen->mbus_format.height);
 > 218				tpg_gen_text(&vsen->tpg, basep, line++ * line_height,
   219					     16, str);
   220			}
   221		case OSD_SHOW_COUNTERS:
   222			{
   223				unsigned int ms;
   224	
   225				ms = (ktime_get_ns() - vsen->start_stream_ts) / 1000000;
   226				snprintf(str, sizeof(str), "%02d:%02d:%02d:%03d",
   227					 (ms / (60 * 60 * 1000)) % 24,
   228					 (ms / (60 * 1000)) % 60,
   229					 (ms / 1000) % 60,
   230					 ms % 1000);
   231				tpg_gen_text(&vsen->tpg, basep, line++ * line_height,
   232					     16, str);
   233				break;
   234			}
   235		case OSD_SHOW_NONE:
   236		default:
   237			break;
   238		}
   239	
   240		return vsen->frame;
   241	}
   242	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org

[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 62643 bytes --]

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH v7 3/3] media: vimc: Add a control to display info on test image
  2020-06-26 13:07 ` [PATCH v7 3/3] media: vimc: Add a control to display info on " Kaaira Gupta
  2020-06-26 15:35   ` kernel test robot
@ 2020-06-26 16:01   ` Helen Koike
  2020-06-30 13:25     ` Kaaira Gupta
  1 sibling, 1 reply; 11+ messages in thread
From: Helen Koike @ 2020-06-26 16:01 UTC (permalink / raw)
  To: Kaaira Gupta, Shuah Khan, Mauro Carvalho Chehab, linux-media,
	linux-kernel, Kieran Bingham, hverkuil

Hi Kaaira,

On 6/26/20 10:07 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 over test image.
> 
> Signed-off-by: Kaaira Gupta <kgupta@es.iitr.ac.in>
> ---
>  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 | 70 +++++++++++++++++++
>  4 files changed, 83 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..4b0ae6f51d76 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 <helen.fornazier@gmail.com>
>   */
>  
> +#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, "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..9e4fb3f4d60d 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;

If you declare the enum outside the below function, this could be type osd_mode instead of unsigned int, what do you think?

> +	u64 start_stream_ts;
>  	/* The active format */
>  	struct v4l2_mbus_framefmt mbus_format;
>  	struct v4l2_ctrl_handler hdl;
> @@ -187,8 +189,54 @@ static void *vimc_sen_process_frame(struct vimc_ent_device *ved,
>  {
>  	struct vimc_sen_device *vsen = container_of(ved, struct vimc_sen_device,
>  						    ved);
> +	enum osd_mode {OSD_SHOW_ALL = 0, OSD_SHOW_COUNTERS = 1, OSD_SHOW_NONE = 2};
> +	const unsigned int line_height = 16;
> +	u8 *basep[TPG_MAX_PLANES][2];
> +	unsigned int line = 1;
> +	char str[100];
>  
>  	tpg_fill_plane_buffer(&vsen->tpg, 0, 0, vsen->frame);
> +	tpg_calc_text_basep(&vsen->tpg, basep, 0, vsen->frame);
> +	switch (vsen->osd_mode) {
> +	case OSD_SHOW_ALL:
> +		{

Usually we don't use this curly braces in a case statement, please, check other examples in the code,

> +			const char *order = tpg_g_color_order(&vsen->tpg);

You also don't need this level of identation.

> +
> +			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);
> +		}
> +	case OSD_SHOW_COUNTERS:

Checkpatch gives this error:

WARNING: Possible switch case/default not preceded by break or fallthrough comment

You need to add a fallthrough comment (grep for fallthrough to find other examples)

> +		{
> +			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);
> +			break;
> +		}
> +	case OSD_SHOW_NONE:

No need this case statement if you have the default below.

Regards,
Helen

> +	default:
> +		break;
> +	}
> +
>  	return vsen->frame;
>  }
>  
> @@ -201,6 +249,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 +319,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 +360,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 +392,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,
> 

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH v7 3/3] media: vimc: Add a control to display info on test image
  2020-06-26 16:01   ` Helen Koike
@ 2020-06-30 13:25     ` Kaaira Gupta
  2020-06-30 13:44       ` Kieran Bingham
  2020-06-30 13:46       ` Helen Koike
  0 siblings, 2 replies; 11+ messages in thread
From: Kaaira Gupta @ 2020-06-30 13:25 UTC (permalink / raw)
  To: Helen Koike
  Cc: Kaaira Gupta, Shuah Khan, Mauro Carvalho Chehab, linux-media,
	linux-kernel, Kieran Bingham, hverkuil

On Fri, Jun 26, 2020 at 01:01:03PM -0300, Helen Koike wrote:
> Hi Kaaira,
> 
> On 6/26/20 10:07 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 over test image.
> > 
> > Signed-off-by: Kaaira Gupta <kgupta@es.iitr.ac.in>
> > ---
> >  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 | 70 +++++++++++++++++++
> >  4 files changed, 83 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..4b0ae6f51d76 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 <helen.fornazier@gmail.com>
> >   */
> >  
> > +#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, "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..9e4fb3f4d60d 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;
> 
> If you declare the enum outside the below function, this could be type osd_mode instead of unsigned int, what do you think?
> 
> > +	u64 start_stream_ts;
> >  	/* The active format */
> >  	struct v4l2_mbus_framefmt mbus_format;
> >  	struct v4l2_ctrl_handler hdl;
> > @@ -187,8 +189,54 @@ static void *vimc_sen_process_frame(struct vimc_ent_device *ved,
> >  {
> >  	struct vimc_sen_device *vsen = container_of(ved, struct vimc_sen_device,
> >  						    ved);
> > +	enum osd_mode {OSD_SHOW_ALL = 0, OSD_SHOW_COUNTERS = 1, OSD_SHOW_NONE = 2};
> > +	const unsigned int line_height = 16;
> > +	u8 *basep[TPG_MAX_PLANES][2];
> > +	unsigned int line = 1;
> > +	char str[100];
> >  
> >  	tpg_fill_plane_buffer(&vsen->tpg, 0, 0, vsen->frame);
> > +	tpg_calc_text_basep(&vsen->tpg, basep, 0, vsen->frame);
> > +	switch (vsen->osd_mode) {
> > +	case OSD_SHOW_ALL:
> > +		{
> 
> Usually we don't use this curly braces in a case statement, please, check other examples in the code,

I have declared variables inside the cases,hence they are not just
statements, so I need to use them I think

> 
> > +			const char *order = tpg_g_color_order(&vsen->tpg);
> 
> You also don't need this level of identation.

I used it because of the braces

> 
> > +
> > +			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);
> > +		}
> > +	case OSD_SHOW_COUNTERS:
> 
> Checkpatch gives this error:
> 
> WARNING: Possible switch case/default not preceded by break or fallthrough comment
> 
> You need to add a fallthrough comment (grep for fallthrough to find other examples)

Okay, I will add that

> 
> > +		{
> > +			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);
> > +			break;
> > +		}
> > +	case OSD_SHOW_NONE:
> 
> No need this case statement if you have the default below.

I added it to make it clearer what default does, should I remove it?

> 
> Regards,
> Helen
> 
> > +	default:
> > +		break;
> > +	}
> > +
> >  	return vsen->frame;
> >  }
> >  
> > @@ -201,6 +249,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 +319,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 +360,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 +392,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,
> > 

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH v7 3/3] media: vimc: Add a control to display info on test image
  2020-06-30 13:25     ` Kaaira Gupta
@ 2020-06-30 13:44       ` Kieran Bingham
  2020-06-30 13:46       ` Helen Koike
  1 sibling, 0 replies; 11+ messages in thread
From: Kieran Bingham @ 2020-06-30 13:44 UTC (permalink / raw)
  To: Kaaira Gupta, Helen Koike
  Cc: Shuah Khan, Mauro Carvalho Chehab, linux-media, linux-kernel, hverkuil

Hi Kaaira,

On 30/06/2020 14:25, Kaaira Gupta wrote:
> On Fri, Jun 26, 2020 at 01:01:03PM -0300, Helen Koike wrote:
>> Hi Kaaira,
>>
>> On 6/26/20 10:07 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 over test image.
>>>
>>> Signed-off-by: Kaaira Gupta <kgupta@es.iitr.ac.in>
>>> ---
>>>  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 | 70 +++++++++++++++++++
>>>  4 files changed, 83 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..4b0ae6f51d76 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 <helen.fornazier@gmail.com>
>>>   */
>>>  
>>> +#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, "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..9e4fb3f4d60d 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;
>>
>> If you declare the enum outside the below function, this could be type osd_mode instead of unsigned int, what do you think?
>>
>>> +	u64 start_stream_ts;
>>>  	/* The active format */
>>>  	struct v4l2_mbus_framefmt mbus_format;
>>>  	struct v4l2_ctrl_handler hdl;
>>> @@ -187,8 +189,54 @@ static void *vimc_sen_process_frame(struct vimc_ent_device *ved,
>>>  {
>>>  	struct vimc_sen_device *vsen = container_of(ved, struct vimc_sen_device,
>>>  						    ved);
>>> +	enum osd_mode {OSD_SHOW_ALL = 0, OSD_SHOW_COUNTERS = 1, OSD_SHOW_NONE = 2};
>>> +	const unsigned int line_height = 16;
>>> +	u8 *basep[TPG_MAX_PLANES][2];
>>> +	unsigned int line = 1;
>>> +	char str[100];
>>>  
>>>  	tpg_fill_plane_buffer(&vsen->tpg, 0, 0, vsen->frame);
>>> +	tpg_calc_text_basep(&vsen->tpg, basep, 0, vsen->frame);
>>> +	switch (vsen->osd_mode) {
>>> +	case OSD_SHOW_ALL:
>>> +		{
>>
>> Usually we don't use this curly braces in a case statement, please, check other examples in the code,
> 
> I have declared variables inside the cases,hence they are not just
> statements, so I need to use them I think

The scope of the variables should still be local to the case statement,
even without the braces.

Take them out and check with the compiler of course, but I think it
shoudl be fine.

> 
>>
>>> +			const char *order = tpg_g_color_order(&vsen->tpg);
>>
>> You also don't need this level of identation.
> 
> I used it because of the braces

I suspect that's why we don't use braces in this instance, to prevent
the indentation getting too far out to the right.

With the braces gone, one less level of indentation should be ok.


> 
>>
>>> +
>>> +			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);
>>> +		}
>>> +	case OSD_SHOW_COUNTERS:
>>
>> Checkpatch gives this error:
>>
>> WARNING: Possible switch case/default not preceded by break or fallthrough comment
>>
>> You need to add a fallthrough comment (grep for fallthrough to find other examples)
> 
> Okay, I will add that

The /* fallthrough */ comments are important, as it helps prevent bugs
where the fallthrough was not intentional.

Even though the 'comment' does nothing, it tells the compiler/tools that
you /intentionally/ want to run the code in the next block as well.


> 
>>
>>> +		{
>>> +			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);
>>> +			break;
>>> +		}
>>> +	case OSD_SHOW_NONE:
>>
>> No need this case statement if you have the default below.
> 
> I added it to make it clearer what default does, should I remove it?

I personally would keep it directly above the default. It's not
essential as the default will of course catch it - but I would (where
reasonable) make sure all expected case statement options are declared
in the switch.


I don't think it makes it clearer what the 'default' does, but it does
make it clearer that 'SHOW_NONE' is an option and it will go through
here and ... do nothing ;-)

(where the default statement would be the path for invalid options)

--
Kieran


>>
>> Regards,
>> Helen
>>
>>> +	default:
>>> +		break;
>>> +	}
>>> +
>>>  	return vsen->frame;
>>>  }
>>>  
>>> @@ -201,6 +249,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 +319,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 +360,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 +392,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,
>>>

-- 
Regards
--
Kieran

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH v7 3/3] media: vimc: Add a control to display info on test image
  2020-06-30 13:25     ` Kaaira Gupta
  2020-06-30 13:44       ` Kieran Bingham
@ 2020-06-30 13:46       ` Helen Koike
  2020-06-30 13:52         ` Kieran Bingham
  1 sibling, 1 reply; 11+ messages in thread
From: Helen Koike @ 2020-06-30 13:46 UTC (permalink / raw)
  To: Kaaira Gupta
  Cc: Shuah Khan, Mauro Carvalho Chehab, linux-media, linux-kernel,
	Kieran Bingham, hverkuil

Hi Kaaira,

On 6/30/20 10:25 AM, Kaaira Gupta wrote:
> On Fri, Jun 26, 2020 at 01:01:03PM -0300, Helen Koike wrote:
>> Hi Kaaira,
>>
>> On 6/26/20 10:07 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 over test image.
>>>
>>> Signed-off-by: Kaaira Gupta <kgupta@es.iitr.ac.in>
>>> ---
>>>  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 | 70 +++++++++++++++++++
>>>  4 files changed, 83 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..4b0ae6f51d76 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 <helen.fornazier@gmail.com>
>>>   */
>>>  
>>> +#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, "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..9e4fb3f4d60d 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;
>>
>> If you declare the enum outside the below function, this could be type osd_mode instead of unsigned int, what do you think?
>>
>>> +	u64 start_stream_ts;
>>>  	/* The active format */
>>>  	struct v4l2_mbus_framefmt mbus_format;
>>>  	struct v4l2_ctrl_handler hdl;
>>> @@ -187,8 +189,54 @@ static void *vimc_sen_process_frame(struct vimc_ent_device *ved,
>>>  {
>>>  	struct vimc_sen_device *vsen = container_of(ved, struct vimc_sen_device,
>>>  						    ved);
>>> +	enum osd_mode {OSD_SHOW_ALL = 0, OSD_SHOW_COUNTERS = 1, OSD_SHOW_NONE = 2};
>>> +	const unsigned int line_height = 16;
>>> +	u8 *basep[TPG_MAX_PLANES][2];
>>> +	unsigned int line = 1;
>>> +	char str[100];
>>>  
>>>  	tpg_fill_plane_buffer(&vsen->tpg, 0, 0, vsen->frame);
>>> +	tpg_calc_text_basep(&vsen->tpg, basep, 0, vsen->frame);
>>> +	switch (vsen->osd_mode) {
>>> +	case OSD_SHOW_ALL:
>>> +		{
>>
>> Usually we don't use this curly braces in a case statement, please, check other examples in the code,
> 
> I have declared variables inside the cases,hence they are not just
> statements, so I need to use them I think

Doing this grep:

git grep -A1 "case.*:" drivers/media | grep -B1 -P "\tstruct"

I see that the standard is to place the curly braces in the same line of the case statement,
example: https://elixir.bootlin.com/linux/latest/source/drivers/media/v4l2-core/v4l2-subdev.c#L469

> 
>>
>>> +			const char *order = tpg_g_color_order(&vsen->tpg);
>>
>> You also don't need this level of identation.
> 
> I used it because of the braces

Please check the example above

> 
>>
>>> +
>>> +			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);
>>> +		}
>>> +	case OSD_SHOW_COUNTERS:
>>
>> Checkpatch gives this error:
>>
>> WARNING: Possible switch case/default not preceded by break or fallthrough comment
>>
>> You need to add a fallthrough comment (grep for fallthrough to find other examples)
> 
> Okay, I will add that
> 
>>
>>> +		{
>>> +			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);
>>> +			break;
>>> +		}
>>> +	case OSD_SHOW_NONE:
>>
>> No need this case statement if you have the default below.
> 
> I added it to make it clearer what default does, should I remove it?

hmm, I think this depends on your style, but to me, just the "default" statement below makes it
clear that options not listed above do nothing.
I think you would also need to add a fallthtough comment.

Or you could just add a comment instead of the case statement in the code, like:

	/* case OSD_SHOW_NONE: */

So it would be clear what this option does.

Regards,
Helen

> 
>>
>> Regards,
>> Helen
>>
>>> +	default:
>>> +		break;
>>> +	}
>>> +
>>>  	return vsen->frame;
>>>  }
>>>  
>>> @@ -201,6 +249,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 +319,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 +360,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 +392,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,
>>>

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH v7 3/3] media: vimc: Add a control to display info on test image
  2020-06-30 13:46       ` Helen Koike
@ 2020-06-30 13:52         ` Kieran Bingham
  2020-06-30 14:00           ` Helen Koike
  0 siblings, 1 reply; 11+ messages in thread
From: Kieran Bingham @ 2020-06-30 13:52 UTC (permalink / raw)
  To: Helen Koike, Kaaira Gupta
  Cc: Shuah Khan, Mauro Carvalho Chehab, linux-media, linux-kernel, hverkuil

Hi Helen, Kaaira,

On 30/06/2020 14:46, Helen Koike wrote:
> Hi Kaaira,
> 
> On 6/30/20 10:25 AM, Kaaira Gupta wrote:
>> On Fri, Jun 26, 2020 at 01:01:03PM -0300, Helen Koike wrote:
>>> Hi Kaaira,
>>>
>>> On 6/26/20 10:07 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 over test image.
>>>>
>>>> Signed-off-by: Kaaira Gupta <kgupta@es.iitr.ac.in>
>>>> ---
>>>>  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 | 70 +++++++++++++++++++
>>>>  4 files changed, 83 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..4b0ae6f51d76 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 <helen.fornazier@gmail.com>
>>>>   */
>>>>  
>>>> +#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, "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..9e4fb3f4d60d 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;
>>>
>>> If you declare the enum outside the below function, this could be type osd_mode instead of unsigned int, what do you think?
>>>
>>>> +	u64 start_stream_ts;
>>>>  	/* The active format */
>>>>  	struct v4l2_mbus_framefmt mbus_format;
>>>>  	struct v4l2_ctrl_handler hdl;
>>>> @@ -187,8 +189,54 @@ static void *vimc_sen_process_frame(struct vimc_ent_device *ved,
>>>>  {
>>>>  	struct vimc_sen_device *vsen = container_of(ved, struct vimc_sen_device,
>>>>  						    ved);
>>>> +	enum osd_mode {OSD_SHOW_ALL = 0, OSD_SHOW_COUNTERS = 1, OSD_SHOW_NONE = 2};
>>>> +	const unsigned int line_height = 16;
>>>> +	u8 *basep[TPG_MAX_PLANES][2];
>>>> +	unsigned int line = 1;
>>>> +	char str[100];
>>>>  
>>>>  	tpg_fill_plane_buffer(&vsen->tpg, 0, 0, vsen->frame);
>>>> +	tpg_calc_text_basep(&vsen->tpg, basep, 0, vsen->frame);
>>>> +	switch (vsen->osd_mode) {
>>>> +	case OSD_SHOW_ALL:
>>>> +		{
>>>
>>> Usually we don't use this curly braces in a case statement, please, check other examples in the code,
>>
>> I have declared variables inside the cases,hence they are not just
>> statements, so I need to use them I think
> 
> Doing this grep:
> 
> git grep -A1 "case.*:" drivers/media | grep -B1 -P "\tstruct"

Aha, yes - they might indeed be needed then because of the local scope
variables...

> 
> I see that the standard is to place the curly braces in the same line of the case statement,
> example: https://elixir.bootlin.com/linux/latest/source/drivers/media/v4l2-core/v4l2-subdev.c#L469
> 
>>
>>>
>>>> +			const char *order = tpg_g_color_order(&vsen->tpg);
>>>
>>> You also don't need this level of identation.
>>
>> I used it because of the braces
> 
> Please check the example above
> 
>>
>>>
>>>> +
>>>> +			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);
>>>> +		}
>>>> +	case OSD_SHOW_COUNTERS:
>>>
>>> Checkpatch gives this error:
>>>
>>> WARNING: Possible switch case/default not preceded by break or fallthrough comment
>>>
>>> You need to add a fallthrough comment (grep for fallthrough to find other examples)
>>
>> Okay, I will add that
>>
>>>
>>>> +		{
>>>> +			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);
>>>> +			break;
>>>> +		}
>>>> +	case OSD_SHOW_NONE:
>>>
>>> No need this case statement if you have the default below.
>>
>> I added it to make it clearer what default does, should I remove it?
> 
> hmm, I think this depends on your style, but to me, just the "default" statement below makes it
> clear that options not listed above do nothing.
> I think you would also need to add a fallthtough comment.

Consecutive case statements (or the default) statement should not need a
/* fallthrough */. I believe it's only if there is a code block it
becomes required.

--
Kieran


> 
> Or you could just add a comment instead of the case statement in the code, like:
> 
> 	/* case OSD_SHOW_NONE: */
> 
> So it would be clear what this option does.
> 
> Regards,
> Helen
> 
>>
>>>
>>> Regards,
>>> Helen
>>>
>>>> +	default:
>>>> +		break;
>>>> +	}
>>>> +
>>>>  	return vsen->frame;
>>>>  }
>>>>  
>>>> @@ -201,6 +249,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 +319,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 +360,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 +392,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,
>>>>

-- 
Regards
--
Kieran

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH v7 3/3] media: vimc: Add a control to display info on test image
  2020-06-30 13:52         ` Kieran Bingham
@ 2020-06-30 14:00           ` Helen Koike
  0 siblings, 0 replies; 11+ messages in thread
From: Helen Koike @ 2020-06-30 14:00 UTC (permalink / raw)
  To: kieran.bingham, Kaaira Gupta
  Cc: Shuah Khan, Mauro Carvalho Chehab, linux-media, linux-kernel, hverkuil



On 6/30/20 10:52 AM, Kieran Bingham wrote:
> Hi Helen, Kaaira,
> 
> On 30/06/2020 14:46, Helen Koike wrote:
>> Hi Kaaira,
>>
>> On 6/30/20 10:25 AM, Kaaira Gupta wrote:
>>> On Fri, Jun 26, 2020 at 01:01:03PM -0300, Helen Koike wrote:
>>>> Hi Kaaira,
>>>>
>>>> On 6/26/20 10:07 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 over test image.
>>>>>
>>>>> Signed-off-by: Kaaira Gupta <kgupta@es.iitr.ac.in>
>>>>> ---
>>>>>  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 | 70 +++++++++++++++++++
>>>>>  4 files changed, 83 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..4b0ae6f51d76 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 <helen.fornazier@gmail.com>
>>>>>   */
>>>>>  
>>>>> +#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, "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..9e4fb3f4d60d 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;
>>>>
>>>> If you declare the enum outside the below function, this could be type osd_mode instead of unsigned int, what do you think?
>>>>
>>>>> +	u64 start_stream_ts;
>>>>>  	/* The active format */
>>>>>  	struct v4l2_mbus_framefmt mbus_format;
>>>>>  	struct v4l2_ctrl_handler hdl;
>>>>> @@ -187,8 +189,54 @@ static void *vimc_sen_process_frame(struct vimc_ent_device *ved,
>>>>>  {
>>>>>  	struct vimc_sen_device *vsen = container_of(ved, struct vimc_sen_device,
>>>>>  						    ved);
>>>>> +	enum osd_mode {OSD_SHOW_ALL = 0, OSD_SHOW_COUNTERS = 1, OSD_SHOW_NONE = 2};
>>>>> +	const unsigned int line_height = 16;
>>>>> +	u8 *basep[TPG_MAX_PLANES][2];
>>>>> +	unsigned int line = 1;
>>>>> +	char str[100];
>>>>>  
>>>>>  	tpg_fill_plane_buffer(&vsen->tpg, 0, 0, vsen->frame);
>>>>> +	tpg_calc_text_basep(&vsen->tpg, basep, 0, vsen->frame);
>>>>> +	switch (vsen->osd_mode) {
>>>>> +	case OSD_SHOW_ALL:
>>>>> +		{
>>>>
>>>> Usually we don't use this curly braces in a case statement, please, check other examples in the code,
>>>
>>> I have declared variables inside the cases,hence they are not just
>>> statements, so I need to use them I think
>>
>> Doing this grep:
>>
>> git grep -A1 "case.*:" drivers/media | grep -B1 -P "\tstruct"
> 
> Aha, yes - they might indeed be needed then because of the local scope
> variables...
> 
>>
>> I see that the standard is to place the curly braces in the same line of the case statement,
>> example: https://elixir.bootlin.com/linux/latest/source/drivers/media/v4l2-core/v4l2-subdev.c#L469
>>
>>>
>>>>
>>>>> +			const char *order = tpg_g_color_order(&vsen->tpg);
>>>>
>>>> You also don't need this level of identation.
>>>
>>> I used it because of the braces
>>
>> Please check the example above
>>
>>>
>>>>
>>>>> +
>>>>> +			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);
>>>>> +		}
>>>>> +	case OSD_SHOW_COUNTERS:
>>>>
>>>> Checkpatch gives this error:
>>>>
>>>> WARNING: Possible switch case/default not preceded by break or fallthrough comment
>>>>
>>>> You need to add a fallthrough comment (grep for fallthrough to find other examples)
>>>
>>> Okay, I will add that
>>>
>>>>
>>>>> +		{
>>>>> +			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);
>>>>> +			break;
>>>>> +		}
>>>>> +	case OSD_SHOW_NONE:
>>>>
>>>> No need this case statement if you have the default below.
>>>
>>> I added it to make it clearer what default does, should I remove it?
>>
>> hmm, I think this depends on your style, but to me, just the "default" statement below makes it
>> clear that options not listed above do nothing.
>> I think you would also need to add a fallthtough comment.
> 
> Consecutive case statements (or the default) statement should not need a
> /* fallthrough */. I believe it's only if there is a code block it
> becomes required.

Ok, cool, I don't mind keeping like this then.

Regards,
Helen

> 
> --
> Kieran
> 
> 
>>
>> Or you could just add a comment instead of the case statement in the code, like:
>>
>> 	/* case OSD_SHOW_NONE: */
>>
>> So it would be clear what this option does.
>>
>> Regards,
>> Helen
>>
>>>
>>>>
>>>> Regards,
>>>> Helen
>>>>
>>>>> +	default:
>>>>> +		break;
>>>>> +	}
>>>>> +
>>>>>  	return vsen->frame;
>>>>>  }
>>>>>  
>>>>> @@ -201,6 +249,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 +319,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 +360,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 +392,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,
>>>>>
> 

^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2020-06-30 14:00 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-06-26 13:06 [PATCH v7 0/3] media: Add colors' order and other info over test image Kaaira Gupta
2020-06-26 13:06 ` [PATCH v7 1/3] media: tpg: change char argument to const char Kaaira Gupta
2020-06-26 13:06 ` [PATCH v7 2/3] media: tpg: Add function to return colors' order of test image Kaaira Gupta
2020-06-26 13:07 ` [PATCH v7 3/3] media: vimc: Add a control to display info on " Kaaira Gupta
2020-06-26 15:35   ` kernel test robot
2020-06-26 16:01   ` Helen Koike
2020-06-30 13:25     ` Kaaira Gupta
2020-06-30 13:44       ` Kieran Bingham
2020-06-30 13:46       ` Helen Koike
2020-06-30 13:52         ` Kieran Bingham
2020-06-30 14:00           ` Helen Koike

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).