Hi,
v4l2_ctrl_get_name returns NULL if the name for the control id is not
defined. Currently this never happens since all controls have the
names set.
In any case it's probably best if the driver returns something if this
were ever to happen.

Best regards,
Paulo


2009/10/9 Paulo Assis <[email protected]>:
> Laurent,
> so it seems you are quite busy at the moment so I hacked the driver to
> use v4l2_ctrl_get_name (patch attached)
> I've tested the on a 2.6.31 kernel and it seems to be working OK, I
> just remove the hardcoded name strings from uvc_ctrl_mappings and add
> them back using  v4l2_ctrl_get_name in uvc_ctrl_init.
> Don't know if this is enought but like I said everything seems to be
> working as expexted.
>
> Best regards,
> Paulo
>
> 2009/9/18 Laurent Pinchart <[email protected]>:
>> Hi Paulo,
>>
>> On Sunday 13 September 2009 15:32:20 Paulo Assis wrote:
>>> Hi,
>>> Currently, uvc driver and I guess all other v4l2 video drivers use
>>> internal stored control strings.
>>> This poses a problem when adding localization for this strings, since
>>> they can change between drivers.
>>> Even if driver developers are careful enough to return the same string
>>> for the correspondent control ID, a slight difference: Brightness or
>>> brightness is enough for a failed translation.
>>> Since the control ID's are defined in the V4L2 API is there any
>>> special reason why the correspondent control strings are not.
>>> I may be failing to see this correctly but at least for me it seems
>>> much logical that if all standard control IDs are already defined
>>> there, then also the name string should be made available through this
>>> central public API, making it exactly the same for all drivers.
>>>
>>> If I'm wrong please feel free to shut me up, and kick me in the but. :-)
>>
>> You're right, and there's already such a central public API. Have a look at
>> v4l2_ctrl_get_name in drivers/media/video/v4l2-common.c.
>>
>> I'll try to switch the uvcvideo driver to v4l2_ctrl_get_name when I'll find
>> some free time.
>>
>> --
>> Regards,
>>
>> Laurent Pinchart
>>
>
--- uvcvideo-756ad91a832e/linux/drivers/media/video/uvc/uvc_ctrl.c	2009-09-02 07:12:26.000000000 +0100
+++ uvcvideo/linux/drivers/media/video/uvc/uvc_ctrl.c	2009-10-10 11:58:03.345747546 +0100
@@ -22,6 +22,7 @@
 #include <linux/vmalloc.h>
 #include <linux/wait.h>
 #include <asm/atomic.h>
+#include <media/v4l2-common.h>
 
 #include "uvcvideo.h"
 
@@ -356,7 +357,7 @@ static void uvc_ctrl_set_zoom(struct uvc
 static struct uvc_control_mapping uvc_ctrl_mappings[] = {
 	{
 		.id		= V4L2_CID_BRIGHTNESS,
-		.name		= "Brightness",
+		//.name		= "Brightness",
 		.entity		= UVC_GUID_UVC_PROCESSING,
 		.selector	= UVC_PU_BRIGHTNESS_CONTROL,
 		.size		= 16,
@@ -366,7 +367,7 @@ static struct uvc_control_mapping uvc_ct
 	},
 	{
 		.id		= V4L2_CID_CONTRAST,
-		.name		= "Contrast",
+		//.name		= "Contrast",
 		.entity		= UVC_GUID_UVC_PROCESSING,
 		.selector	= UVC_PU_CONTRAST_CONTROL,
 		.size		= 16,
@@ -376,7 +377,7 @@ static struct uvc_control_mapping uvc_ct
 	},
 	{
 		.id		= V4L2_CID_HUE,
-		.name		= "Hue",
+		//.name		= "Hue",
 		.entity		= UVC_GUID_UVC_PROCESSING,
 		.selector	= UVC_PU_HUE_CONTROL,
 		.size		= 16,
@@ -386,7 +387,7 @@ static struct uvc_control_mapping uvc_ct
 	},
 	{
 		.id		= V4L2_CID_SATURATION,
-		.name		= "Saturation",
+		//.name		= "Saturation",
 		.entity		= UVC_GUID_UVC_PROCESSING,
 		.selector	= UVC_PU_SATURATION_CONTROL,
 		.size		= 16,
@@ -396,7 +397,7 @@ static struct uvc_control_mapping uvc_ct
 	},
 	{
 		.id		= V4L2_CID_SHARPNESS,
-		.name		= "Sharpness",
+		//.name		= "Sharpness",
 		.entity		= UVC_GUID_UVC_PROCESSING,
 		.selector	= UVC_PU_SHARPNESS_CONTROL,
 		.size		= 16,
@@ -406,7 +407,7 @@ static struct uvc_control_mapping uvc_ct
 	},
 	{
 		.id		= V4L2_CID_GAMMA,
-		.name		= "Gamma",
+		//.name		= "Gamma",
 		.entity		= UVC_GUID_UVC_PROCESSING,
 		.selector	= UVC_PU_GAMMA_CONTROL,
 		.size		= 16,
@@ -416,7 +417,7 @@ static struct uvc_control_mapping uvc_ct
 	},
 	{
 		.id		= V4L2_CID_BACKLIGHT_COMPENSATION,
-		.name		= "Backlight Compensation",
+		//.name		= "Backlight Compensation",
 		.entity		= UVC_GUID_UVC_PROCESSING,
 		.selector	= UVC_PU_BACKLIGHT_COMPENSATION_CONTROL,
 		.size		= 16,
@@ -426,7 +427,7 @@ static struct uvc_control_mapping uvc_ct
 	},
 	{
 		.id		= V4L2_CID_GAIN,
-		.name		= "Gain",
+		//.name		= "Gain",
 		.entity		= UVC_GUID_UVC_PROCESSING,
 		.selector	= UVC_PU_GAIN_CONTROL,
 		.size		= 16,
@@ -436,7 +437,7 @@ static struct uvc_control_mapping uvc_ct
 	},
 	{
 		.id		= V4L2_CID_POWER_LINE_FREQUENCY,
-		.name		= "Power Line Frequency",
+		//.name		= "Power Line Frequency",
 		.entity		= UVC_GUID_UVC_PROCESSING,
 		.selector	= UVC_PU_POWER_LINE_FREQUENCY_CONTROL,
 		.size		= 2,
@@ -448,7 +449,7 @@ static struct uvc_control_mapping uvc_ct
 	},
 	{
 		.id		= V4L2_CID_HUE_AUTO,
-		.name		= "Hue, Auto",
+		//.name		= "Hue, Auto",
 		.entity		= UVC_GUID_UVC_PROCESSING,
 		.selector	= UVC_PU_HUE_AUTO_CONTROL,
 		.size		= 1,
@@ -458,7 +459,7 @@ static struct uvc_control_mapping uvc_ct
 	},
 	{
 		.id		= V4L2_CID_EXPOSURE_AUTO,
-		.name		= "Exposure, Auto",
+		//.name		= "Exposure, Auto",
 		.entity		= UVC_GUID_UVC_CAMERA,
 		.selector	= UVC_CT_AE_MODE_CONTROL,
 		.size		= 4,
@@ -470,7 +471,7 @@ static struct uvc_control_mapping uvc_ct
 	},
 	{
 		.id		= V4L2_CID_EXPOSURE_AUTO_PRIORITY,
-		.name		= "Exposure, Auto Priority",
+		//.name		= "Exposure, Auto Priority",
 		.entity		= UVC_GUID_UVC_CAMERA,
 		.selector	= UVC_CT_AE_PRIORITY_CONTROL,
 		.size		= 1,
@@ -480,7 +481,7 @@ static struct uvc_control_mapping uvc_ct
 	},
 	{
 		.id		= V4L2_CID_EXPOSURE_ABSOLUTE,
-		.name		= "Exposure (Absolute)",
+		//.name		= "Exposure (Absolute)",
 		.entity		= UVC_GUID_UVC_CAMERA,
 		.selector	= UVC_CT_EXPOSURE_TIME_ABSOLUTE_CONTROL,
 		.size		= 32,
@@ -490,7 +491,7 @@ static struct uvc_control_mapping uvc_ct
 	},
 	{
 		.id		= V4L2_CID_AUTO_WHITE_BALANCE,
-		.name		= "White Balance Temperature, Auto",
+		//.name		= "White Balance Temperature, Auto",
 		.entity		= UVC_GUID_UVC_PROCESSING,
 		.selector	= UVC_PU_WHITE_BALANCE_TEMPERATURE_AUTO_CONTROL,
 		.size		= 1,
@@ -500,7 +501,7 @@ static struct uvc_control_mapping uvc_ct
 	},
 	{
 		.id		= V4L2_CID_WHITE_BALANCE_TEMPERATURE,
-		.name		= "White Balance Temperature",
+		//.name		= "White Balance Temperature",
 		.entity		= UVC_GUID_UVC_PROCESSING,
 		.selector	= UVC_PU_WHITE_BALANCE_TEMPERATURE_CONTROL,
 		.size		= 16,
@@ -510,7 +511,7 @@ static struct uvc_control_mapping uvc_ct
 	},
 	{
 		.id		= V4L2_CID_AUTO_WHITE_BALANCE,
-		.name		= "White Balance Component, Auto",
+		//.name		= "White Balance Component, Auto",
 		.entity		= UVC_GUID_UVC_PROCESSING,
 		.selector	= UVC_PU_WHITE_BALANCE_COMPONENT_AUTO_CONTROL,
 		.size		= 1,
@@ -520,7 +521,7 @@ static struct uvc_control_mapping uvc_ct
 	},
 	{
 		.id		= V4L2_CID_BLUE_BALANCE,
-		.name		= "White Balance Blue Component",
+		//.name		= "White Balance Blue Component",
 		.entity		= UVC_GUID_UVC_PROCESSING,
 		.selector	= UVC_PU_WHITE_BALANCE_COMPONENT_CONTROL,
 		.size		= 16,
@@ -530,7 +531,7 @@ static struct uvc_control_mapping uvc_ct
 	},
 	{
 		.id		= V4L2_CID_RED_BALANCE,
-		.name		= "White Balance Red Component",
+		//.name		= "White Balance Red Component",
 		.entity		= UVC_GUID_UVC_PROCESSING,
 		.selector	= UVC_PU_WHITE_BALANCE_COMPONENT_CONTROL,
 		.size		= 16,
@@ -540,7 +541,7 @@ static struct uvc_control_mapping uvc_ct
 	},
 	{
 		.id		= V4L2_CID_FOCUS_ABSOLUTE,
-		.name		= "Focus (absolute)",
+		//.name		= "Focus (absolute)",
 		.entity		= UVC_GUID_UVC_CAMERA,
 		.selector	= UVC_CT_FOCUS_ABSOLUTE_CONTROL,
 		.size		= 16,
@@ -550,7 +551,7 @@ static struct uvc_control_mapping uvc_ct
 	},
 	{
 		.id		= V4L2_CID_FOCUS_AUTO,
-		.name		= "Focus, Auto",
+		//.name		= "Focus, Auto",
 		.entity		= UVC_GUID_UVC_CAMERA,
 		.selector	= UVC_CT_FOCUS_AUTO_CONTROL,
 		.size		= 1,
@@ -560,7 +561,7 @@ static struct uvc_control_mapping uvc_ct
 	},
 	{
 		.id		= V4L2_CID_ZOOM_ABSOLUTE,
-		.name		= "Zoom, Absolute",
+		//.name		= "Zoom, Absolute",
 		.entity		= UVC_GUID_UVC_CAMERA,
 		.selector	= UVC_CT_ZOOM_ABSOLUTE_CONTROL,
 		.size		= 16,
@@ -570,7 +571,7 @@ static struct uvc_control_mapping uvc_ct
 	},
 	{
 		.id		= V4L2_CID_ZOOM_CONTINUOUS,
-		.name		= "Zoom, Continuous",
+		//.name		= "Zoom, Continuous",
 		.entity		= UVC_GUID_UVC_CAMERA,
 		.selector	= UVC_CT_ZOOM_RELATIVE_CONTROL,
 		.size		= 0,
@@ -582,7 +583,7 @@ static struct uvc_control_mapping uvc_ct
 	},
 	{
 		.id		= V4L2_CID_PRIVACY,
-		.name		= "Privacy",
+		//.name		= "Privacy",
 		.entity		= UVC_GUID_UVC_CAMERA,
 		.selector	= UVC_CT_PRIVACY_CONTROL,
 		.size		= 1,
@@ -595,7 +596,7 @@ static struct uvc_control_mapping uvc_ct
 /* ------------------------------------------------------------------------
  * Utility functions
  */
-
+ 
 static inline __u8 *uvc_ctrl_data(struct uvc_control *ctrl, int id)
 {
 	return ctrl->data + id * ctrl->info->size;
@@ -1528,6 +1529,13 @@ void uvc_ctrl_init(void)
 		uvc_ctrl_add_info(ctrl);
 
 	for (; mapping < mend; ++mapping)
+	{
+		/* set v4l2 control name if defined */ 
+		if (v4l2_ctrl_get_name(mapping->id))
+			strlcpy(mapping->name, v4l2_ctrl_get_name(mapping->id), 32);
+		else
+			strlcpy(mapping->name, "unknown control", 32);
 		uvc_ctrl_add_mapping(mapping);
+	}
 }
 
_______________________________________________
Linux-uvc-devel mailing list
[email protected]
https://lists.berlios.de/mailman/listinfo/linux-uvc-devel

Reply via email to