Re: [PATCH v9 02/11] media: v4l2-ctrl: Document V4L2_CID_CAMERA_SENSOR_LOCATION

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

 



Hi Laurent,

On Wed, May 06, 2020 at 06:47:41PM +0300, Laurent Pinchart wrote:
> Hi Jacopo,
>
> On Wed, May 06, 2020 at 01:07:30PM +0200, Jacopo Mondi wrote:
> > On Wed, May 06, 2020 at 11:39:09AM +0200, Mauro Carvalho Chehab wrote:
> > > Em Wed, 6 May 2020 10:04:39 +0200 Hans Verkuil escreveu:
> > >> On 05/05/2020 16:58, Mauro Carvalho Chehab wrote:
> > >>> Em Tue, 5 May 2020 14:21:38 +0200 Hans Verkuil escreveu:
> > >>>> On 05/05/2020 14:02, Mauro Carvalho Chehab wrote:
> > >>>>> Em Fri, 17 Apr 2020 14:41:01 +0200 Jacopo Mondi escreveu:
> > >>>>>> Add documentation for the V4L2_CID_CAMERA_SENSOR_LOCATION camera
> > >>>>>> control. The newly added read-only control reports the camera device
> > >>>>>> mounting position.
> > >>>>>>
> > >>>>>> Signed-off-by: Jacopo Mondi <jacopo@xxxxxxxxxx>
> > >>>>>> ---
> > >>>>>>  .../media/v4l/ext-ctrls-camera.rst            | 32 +++++++++++++++++++
> > >>>>>>  1 file changed, 32 insertions(+)
> > >>>>>>
> > >>>>>> diff --git a/Documentation/userspace-api/media/v4l/ext-ctrls-camera.rst b/Documentation/userspace-api/media/v4l/ext-ctrls-camera.rst
> > >>>>>> index e39f84d2447f..01a9042d53a6 100644
> > >>>>>> --- a/Documentation/userspace-api/media/v4l/ext-ctrls-camera.rst
> > >>>>>> +++ b/Documentation/userspace-api/media/v4l/ext-ctrls-camera.rst
> > >>>>>> @@ -510,6 +510,38 @@ enum v4l2_scene_mode -
> > >>>>>>      value down. A value of zero stops the motion if one is in progress
> > >>>>>>      and has no effect otherwise.
> > >>>>>>
> > >>>>>> +``V4L2_CID_CAMERA_SENSOR_LOCATION (integer)``
> > >>>>>> +    This read-only control describes the camera sensor location by reporting
> > >>>>>> +    its mounting position on the device where the camera is installed. The
> > >>>>>> +    control value is constant and not modifiable by software. This control is
> > >>>>>> +    particularly meaningful for devices which have a well defined orientation,
> > >>>>>> +    such as phones, laptops and portable devices since the camera location is
> > >>>>>> +    expressed as a position relative to the device's intended usage orientation.
> > >>>>>> +    For example, a camera sensor installed on the user-facing side of a phone,
> > >>>>>> +    a tablet or a laptop device is said to be installed in the
> > >>>>>> +    ``V4L2_LOCATION_FRONT`` location while camera sensors installed on the side
> > >>>>>> +    opposite the front one are said to be installed in the
> > >>>>>> +    ``V4L2_LOCATION_BACK`` location. Camera sensors not directly attached to
> > >>>>>> +    the device or attached in a way that allows them to move freely, such as
> > >>>>>> +    webcams and digital cameras, are said to have the ``V4L2_LOCATION_EXTERNAL``
> > >>>>>> +    location.
> > >>>>>> +
> > >>>>>> +
> > >>>>>> +
> > >>>>>> +.. flat-table::
> > >>>>>> +    :header-rows:  0
> > >>>>>> +    :stub-columns: 0
> > >>>>>> +
> > >>>>>> +    * - ``
> > >>>>> ``
> > >>>>>> +      - The camera sensor is located on the front side of the device.
> > >>>>>> +    * - ``V4L2_LOCATION_BACK``
> > >>>>>> +      - The camera sensor is located on the back side of the device.
> > >>>>>> +    * - ``V4L2_LOCATION_EXTERNAL``
> > >>>>>> +      - The camera sensor is not directly attached to the device and is
> > >>>>>> +        freely movable.
> > >>>>>
> > >>>>> I guess I mentioned this already, but IMHO this ioctl is somewhat flawed,
> > >>>>> for two reasons:
> > >>>>>
> > >>>>> 1) newer devices may all top of the line mobile devices now are coming
> > >>>>>    with multiple camera sensors at the same side. So, just saying that
> > >>>>>    the location is front or back is not enough. A location syscall would
> > >>>>>    need have something more to better identify the location.
> > >>>>>    It probably doesn't need to be something fancy, but, at least, on a
> > >>>>>    device with 3 back sensors, I would call them as:
> > >>>>>
> > >>>>> 	V4L2_LOCATION_BACK_1
> > >>>>> 	V4L2_LOCATION_BACK_2
> > >>>>> 	V4L2_LOCATION_BACK_3
> > >>>>>
> > >>>>>    And add some comment at the control documentation that would allow to
> > >>>>>    uniquely number the other ones, like:
> > >>>>>
> > >>>>> 	"when multiple sensors are present at the same side, sensors
> > >>>>> 	 will be numbered considering the ``(x,y)`` coordinates of the center
> > >>>>> 	 of each sensor, starting from the topmost, leftmost position.
> > >>>>>
> > >>>>> 	 She first sensor will be the topmost sensor column at the leftmost
> > >>>>> 	 side. The other sensors that will have the same ``y`` coordinate,
> > >>>>> 	 counting from the left to the right, then increment the ``y`` and
> > >>>>> 	 parse the next column again until all sensors are numbered."
> > >>>>
> > >>>> I think this isn't a good idea. In most cases you do not care about this.
> > >>>
> > >>> True, because on most cases, the userspace is hardcoded to open, let's say,
> > >>> video0 for the front sensor or video1 for the back sensor.
> > >>>
> > >>> This control only makes sense if the userspace is generic enough to accept
> > >>> sensors on different positions, identifying them at runtime.
> > >>>
> > >>> With the current proposal, userspace can only work with 2 sensors, as, if
> > >>> there's a third sensor, userspace won't know how to pick the right one.
> > >>>
> > >>> For instance, let's assume a car with 4 sensors, one on each side of
> > >>> the car (right, front); (left, front); (right; back); (left; back).
> > >>>
> > >>> With the current proposal, userspace can't do anything if it wants
> > >>> to identify the (right, back) camera.
> > >>>
> > >>>> And if you do care about this, then wouldn't it be better to do that through
> > >>>> a new control where you provide the precise coordinates in e.g. mm?
> > >>>>
> > >>>> BACK_1/2/3 really doesn't tell you anything other than that there are three
> > >>>> sensors on the back, but we knew that already.
> > >>>
> > >>> No, if we define some criteria about how sensors should be accounted for
> > >>> (something similar to the text I drafted), the location will be defined.
> > >>>
> > >>> With the above text, for example, a device with 3 sensors horizontally
> > >>> aligned, the arrangement will be:
> > >>>
> > >>> - sensor 1 is on the left;
> > >>> - sensor 2 in the middle;
> > >>> - sensor 3 is on the right.
> > >>
> > >> Or sensor 2 is below sensor 1 and sensor 3 is to the right of sensor 1.
> > >> It's meaningless information. If you want to specify the location, then
> > >> be precise. Especially for stereoscopic sensors (left and right) it is
> > >> good to know the exact distance between the sensors. Just calling them
> > >> '1' and '2' is not enough.
> > >>
> > >> For sensors you want to know the plane (back/front) and where they are
> > >> on that plane (in the case of more than one sensor). That's separate
> > >> information that's only needed in the case of more than one sensor.
> > >>
> > >>>
> > >>> Ok, I agree that writing a text with such criteria sucks, and maybe
> > >>> just numbering from 1 to n may not be the best thing to do. Yet,
> > >>> adding coordinates in mm would be just too much information, IMHO.
> > >>
> > >> Why? Just numbering them makes no sense, it's useless information.
> > >>
> > >>>> If we need support for the precise location in the future, then let's do that
> > >>>> right and not try to shoehorn into something that wasn't meant for it.
> > >>>
> > >>> Assuming that all the problems we have so far are to support devices with
> > >>> 2 sensors, by the time we add support for a third sensor, we'll end having
> > >>> a new ioctl for the same thing: to specify the sensors locations.
> > >>
> > >> It's just a control, nothing more.
> > >>
> > >> In most cases all you need to know is if it is a front or back sensor. In
> > >> some cases you need to know more: e.g. my Samsung Note 10+ has three sensors
> > >> on the back in a vertical row (wide, telephoto, ultrawide), and two sensors
> > >> for 3D to the right of them. For those last two you need to know the exact
> > >> position relative to one another. For the other sensors all you need to know
> > >> is that they are back sensors.
> > >>
> > >>> We know the drill: having two controls for the same thing makes userspace
> > >>> more complex and will require backward-compatibility code at the kernel
> > >>> and at userspace. That's what I want to avoid.
> > >>>
> > >>> I'm open to other suggestions that won't limit the usage of this control
> > >>> for devices with just (up to) two sensors.
> > >>
> > >> What backward compatibility code are you talking about? I honestly don't see
> > >> the problem here.
> > >
> > > Right now, we're adding an API that assumes that the video node may have
> > > only up to 2 sensors, and that would cover just one small subset of usecases
> > > (see more below). If it has anything more than that, this control won't help.
> >
> > I don't agree the number of sensor is limited to 2. This property does
> > not identify sensors, it describes one more thing that userspace might
> > use to filter cameras. I was actually suprised nothing like this
> > existed in Linux when I started looking into this issue, as this seems
> > to me quite basic information that a generic enough userspace
> > application would like to be able to retrieve.
> >
> > TL;DR: you can describe as many BACK cameras you want, the 'location'
> > gives you -one- filtering criteria more, that's it.
> >
> > > One day (probably soon enough, as there are several devices with more than
> > > two sensors already), we'll end adding a proper support for it, and this
> > > control will become obsoleted, requiring us to think about backward
> > > compatibility issues when this control become deprecated.
> > >
> > > That's why I prefer spending some time finding a better way to report it,
> > > avoiding the need of having to do some deprecation logic anytime soon.
> >
> > As said and discussed during the review of this series, a 3-d rotation
> > matrix is probably the right direction. I refrained from taking that
> > path because:
> > 1) 99% of devices are interested in reporting FRONT/BACK or some
> > specialization of those. Asking dt to provide a 9 entries matrix to
> > say "FRONT" seemed an overkill.
> > 2) There is no consensus on how the reference plane should be defined,
> > given the wide range of devices that we target. This is a separate
> > discussion on itself, and given it took 6 months to get to the point
> > of considering these basic properties, I'm a bit skeptical such a
> > discussion would have taken less than that.
> >
> > >>>>>
> > >>>>> 2) There are also some devices that has a movable sensor, that can either
> > >>>>>    be taking a picture from the front or from the back, like those:
> > >>>>>
> > >>>>> 	https://www.youtube.com/watch?v=br6G7MrkRUc
> > >>>>>
> > >>>>>    On such case, the control should not be read-only, as one may need to
> > >>>>>    change this control in order to select if a sensor would either be on
> > >>>>>    FRONT or on BACK position.
> > >>>>>
> > >>>>>    For such kind of sensors (when we start supporting them), we could
> > >>>>>    for example call them like:
> > >>>>>
> > >>>>> 	V4L2_LOCATION_MOVABLE_IN_BACK_POSITION_1
> > >>>>> 	V4L2_LOCATION_MOVABLE_IN_BACK_POSITION_2
> > >>>>> 	V4L2_LOCATION_MOVABLE_IN_FRONT_POSITION_1
> > >>>>> 	V4L2_LOCATION_MOVABLE_IN_FRONT_POSITION_2
> > >>>>
> > >>>> I don't like this. If the driver can tell when the position changes, then it
> > >>>> can update the control's value (it's still read-only because userspace
> > >>>> can't write to it, but that doesn't mean it can't be updated).
> > >>>
> > >>> Why userspace can't set it? I mean, if the camera is movable, it
> > >>> should be up to the application to select the sensor between FRONT
> > >>> and BACK.
> > >>
> > >> Ah, right. If you can command the camera to flip from back to front using
> > >> a button or something, then yes, it can be writable. Sorry, didn't think of
> > >> that. I was thinking that the user would manually move the camera and the
> > >> new position would be detected by the driver and reported in the location
> > >> control.
> > >>
> > >> In any case, if the location control can be set through the driver by setting
> > >> this control, then just drop the READ_ONLY flag. If the control is writable,
> > >> then the sensor is movable. Just document this and we're done.
> > >
> > > Works for me.
> >
> > This makes sense, it will impact bindings in the sense that it now
> > becomes possible to specify several locations to which select from,
> > which will become the items of the menu control (with some rule that
> > says "the first is the default" or such). If more than one location is
> > specified the control is RW, RO otherwise.
> >
> > >> You are making this much more complicated than it need to be IMHO.
> > >>
> > >>> Btw, this is a case where I clearly see value on this ioctl: all cameras
> > >>
> > >> It's a *control*, not a new ioctl.
> > >>
> > >>> with flippable sensors need a control to switch the sensor's position,
> > >>> even if the sensor device is hardcoded on some application.
> > >>>
> > >>>> So there is
> > >>>> no need to call it 'MOVABLE', you just report the correct location. And with
> > >>>> QUERYMENU you can tell that it is movable since multiple possible locations
> > >>>> are reported (BACK and FRONT in this example). If it is fixed, then QUERYMENU
> > >>>> will report only a single location.
> > >>>>
> > >>>> This might have some consequences for the DT bindings, though. Not sure
> > >>>> how to represent this there.
> > >>>
> > >>> I guess DT should contain the default value when the device is turned
> > >>> off.
> > >>>
> > >>>> If the driver cannot tell what the position is, then it makes no sense for
> > >>>> the driver to expose this location control since it clearly is something that
> > >>>> has to be hardcoded in userspace. I.e., there is no point for userspace to
> > >>>> write to the control and then read back what it wrote :-)
> > >>>
> > >>> Actually there is. When you command a device to switch position, it may
> > >>> take some time to move the sensor, and such operation may even fail.
> > >>
> > >> Yeah, I forgot about that option.
> > >>
> > >>>
> > >>> So, reading back the position is probably mandatory.
> > >>
> > >> Well, it's a control, so that's standard.
> > >>
> > >>>
> > >>> That reminds that it may actually have a third position, to warn
> > >>> that the sensor was blocked.
> > >>>
> > >>> Also, some flip sensors may have another position (a "closed"
> > >>> position).
> > >>
> > >> It's certainly possible that we need to add new positions to support the
> > >> various states of such a movable sensor. But that's no problem. It's just
> > >> a menu control, adding new positions is cheap and easy.
> > >>
> > >> I stand by what I said, except that I agree that this control can be
> > >> writable in some circumstances, and that should be documented
> > >>
> > >> I strongly disagree with the notion of BACK_1/2/3 and FRONT_1/2/3: it adds
> > >> no meaningful information.
> > >
> > > Ok, but if this control would just say where a sensor is mounted
> > > (front, back or unknown/external), naming it as "LOCATION" seems too
> > > ambitious ;-)
> > >
> > > What it is actually trying to report is the angle of the sensor, with
> > > regards to the front position, adding currently two possible angles:
> > > 0 degrees (front) or 180 degrees (back).
> > >
> > > So, I would call it, instead, as V4L2_CID_CAMERA_VIEWING_ANGLE
> > > (or something similar to it).
> >
> > _ORIENTATION might be the right word, I'm fine to reserve _LOCATION
> > for a more precise property if that helps moving forward.
> >
> > > Having just two pre-defined angles (front/back) only works fine on
> > > devices like cell-phones or tablets, where the sensor cannot be
> > > on some other angle.
> > >
> > > If you mount cameras on a larger device, like a car, you may have
> > > some cameras mounted with different angles, for example, the front
> > > cameras could have been mounted with -45, 0 and 45 degrees, in order
> > > to cover a larger region.
> >
> > I considered that case, but I expect those very specific usages to be
> > covered by downstream extensions of the property supported values. I
> > wish we had a .dts to describe a car in mainlien, but I would be happy
> > enough to provide a standard mechanism for people to use downstream
> > eventually, instead of adding custom properties, or taking shortcuts
> > like it mostly happens today.
> >
> > > So, if that would be ok for you, I can live with a
> > >
> > > V4L2_CID_CAMERA_VIEWING_ANGLE (or some similar name) that will
> > > specify the angle where the sensor is mounted (for fixed sensors),
> > > or the current angle, in case of movable ones, being RO for fixed
> > > sensors and RW for movable ones.
> > >
> > > Let's postpone discussions for a LOCATION control once this
> > > would be needed by some driver.
> >
> > Would V4L2_CID_CAMERA_ORIENTATION work ?
> >
> > I could:
> > 1) rename dt-proeprty and control to use orientation
> > 2) specify multiple locations could be entered, the first one being
> > the "default" (eg. device turned off) location
> > 3) make am RW control if multiple entries have been specified, a RO
> > otherwise.
>
> I would refrain from doing 2) and 3) at this point. We have no idea how
> we will control those devices, as we haven't worked with them, and we
> don't know whether flipping the camera could be done through the V4L2
> subsystem or would need to involve other APIs. Designing APIs that can't
> be tested has so far not been a great success. It's easy to specify the
> DT property as a single value and the control as read-only and ease
> those restrictions later, it will be more difficult to start with the
> read-write case and then change it to something else if we realize it
> was a bad idea.
>

Sure we don't have use cases at hand.. I'm fine post-poning then.
> --
> Regards,
>
> Laurent Pinchart



[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