Re: RFC: String controls

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Monday 20 July 2009 19:12:53 Laurent Pinchart wrote:
> Hi Hans,
>
> On Monday 20 July 2009 17:23:02 Hans Verkuil wrote:
> > Hi all,
> >
> > For the si4713 FM transmitter driver from Eduardo we need to add
> > support for string controls so that the user can set things like the
> > RDS Program Name.
> >
> > The v4l2_ext_control struct has been designed with the possibility of
> > things like this in mind, so adding this isn't very difficult. There
> > are a few details that need to be sorted out first, though.
> >
> > The struct looks like this right now:
> >
> > struct v4l2_ext_control {
> >         __u32 id;
> >         __u32 reserved2[2];
> >         union {
> >                 __s32 value;
> >                 __s64 value64;
> >                 void *reserved;
> >         };
> > } __attribute__ ((packed));
> >
> > For string controls we need to change it to this:
> >
> > struct v4l2_ext_control {
> >         __u32 id;
> > 	__u32 length;
> >         __u32 reserved2;
> >         union {
> >                 __s32 value;
> >                 __s64 value64;
> > 		char *string;
> >         };
> > } __attribute__ ((packed));
> >
> > The new length field is setup by the caller and contains the size in
> > bytes of the memory that the string field points to. This length will
> > be used as well by any future pointer control type, so it is not string
> > specific. Note that for string controls the length has to be
> > strlen(string) + 1 to make room for the terminating zero.
> >
> > An added bonus is that we can use the length field in
> > v4l2-compat-ioctl32.c in order to do the right pointer transformation
> > from 32 to 64 bits since length is only non-zero for pointer types.
> >
> > While it is possible to do a copy_from_user in v4l2-ioctl.c for the
> > string in a string control I have decided not to do this. For any
> > pointer control it is the driver that will have to do this step. The
> > reason is that there is no limit on these lengths, so rather than
> > copying it to a temporary piece of kernel memory and then again copying
> > it in the driver to whatever the final destination is, I think it is
> > much more efficient to just let the driver handle it.
> >
> > We also need a new string type, of course: V4L2_CTRL_TYPE_STRING.
>
> Should we standardize on a particular encoding ?

No, this is control dependent. For the FM transmitter driver that means that 
the encoding defined by the RDS standard will be used. But it is a good 
point that the string encoding used by each string control must be 
documented.

>
> > There is one remaining problem: how to determine how big the string
> > memory has to be? When retrieving a string control the application has
> > to know how much memory to allocate for the result. Or at the minimum
> > it has to know when it didn't allocate enough memory.
> >
> > The first part of the solution is to utilize the minimum and maximum
> > fields in v4l2_queryctrl: these can be set to the minimum and maximum
> > length of the string control. This can be useful when creating a GUI
> > control element in that the GUI knows how to present the string control
> > and to implement simple input validation. The maximum value can also be
> > used to allocate sufficient memory when retrieving a string control. In
> > case there is no maximum (other than the amount of available memory)
> > the maximum field can be left at 0. I am not sure whether the min and
> > max fields should refer to the string length or the memory size. The
> > latter is one higher due to the terminating zero. I think I prefer the
> > string length as that makes more sense from a GUI perspective (which is
> > really what v4l2_queryctrl is all about).
> >
> > I see no use for the default_value and step fields, so these should be
> > left at 0.
> >
> > The second part of the solution is that when retrieving a string
> > control the length field is set by the driver to the minimum required
> > length if the original length was too short. In that case the
> > g_ext_ctrls ioctl returns ENOSPC as error and it is up to the
> > application to re-allocate enough memory and retry the ioctl. Setting
> > length to 0 initially will always force an ENOSPC error and can be used
> > to discover the length up front.
> >
> > I think that this is a reasonable solution.
>
> This might not be enough to accommodate string controls are varying
> lengths. Let's say a given string controls needs 16 bytes to hold the
> string value. The userspace application queries the driver with a 0
> length and receives a - ENOSPC error with the required length. At that
> point the application retries the call with a 16 bytes buffer, but the
> string values changes and now requires 32 bytes. The application will
> receive -ENOSPC once again. This can go on for a few iterations.

Or between the first call (with length == 0) and the second (with the result 
of the first call) someone sets the string control with a new string. So 
yes, this is a possibility.

> I'm not sure it would be wise to allow for a 0 maximum length value in
> response to a control query. Do you have use cases in mind where the
> driver can't compute the maximum string size in advance ?

Not at the moment. And I am not particularly attached to this. It might be 
better to always have a non-zero value here.

Thanks for the comments!

	Hans

>
> Regards,
>
> Laurent Pinchart
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-media" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at  http://vger.kernel.org/majordomo-info.html



-- 
Hans Verkuil - video4linux developer - sponsored by TANDBERG Telecom
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux