Re: [PATCH] RFC: Support for multiple selections

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

 



Hello Hans

On Wed, Sep 11, 2013 at 12:49 PM, Hans Verkuil <hverkuil@xxxxxxxxx> wrote:
> Hi Ricardo,
>
> On 09/11/2013 11:34 AM, Ricardo Ribalda Delgado wrote:
>> Hi Hans
>>
>> Thanks for your feedback
>>
>> On Wed, Sep 11, 2013 at 11:04 AM, Hans Verkuil <hverkuil@xxxxxxxxx> wrote:
>>> Hi Ricardo,
>>>
>>> On 09/11/2013 10:30 AM, Ricardo Ribalda Delgado wrote:
>>>> A new id field is added to the struct selection. On devices that
>>>> supports multiple sections this id indicate which of the selection to
>>>> modify.
>>>>
>>>> A new control V4L2_CID_SELECTION_BITMASK selects which of the selections
>>>> are used, if the control is set to zero the default rectangles are used.
>>>>
>>>> This is needed in cases where the user has to change multiple selections
>>>> at the same time to get a valid combination.
>>>>
>>>> On devices where the control V4L2_CID_SELECTION_BITMASK does not exist,
>>>> the id field is ignored
>>>
>>> This feels like a hack to me. A big problem I have with using a control here
>>> is that with a control you can't specify for which selection target it is.
>>>
>>
>> I am not sure that I understand what you mean here.
>>
>> If you set the control to 0x1 you are using selection 0, if you set
>> the control to 0x5, you are using selection 0 and 2.
>
> If you look here:
>
> http://hverkuil.home.xs4all.nl/spec/media.html#v4l2-selection-targets
>
> you see that a selection has a 'target': i.e. does the selection define a crop
> rectangle, a compose rectange, a default crop rectangle, etc.
>
> You are extending the API to support multiple rectangles per target and using
> a control to select which rectangles are active (if I understand correctly).
> But that control does not (and cannot) specify for which target the rectangles
> should be activated.

I want to have N crop rectangles and N compose rectangles. Every crop
rectangle has associated one compose rectangle.

This will fit multiple purposes ie:

- swap two areas of an image,
- multiple readout zones
- different decimation per area....


>
>>
>>
>>> If you want to set multiple rectangles, why not just pass them directly? E.g.:
>>>
>>> struct v4l2_selection {
>>>         __u32                   type;
>>>         __u32                   target;
>>>         __u32                   flags;
>>>         union {
>>>                 struct v4l2_rect        r;
>>>                 struct v4l2_rect        *pr;
>>>         };
>>>         __u32                   rectangles;
>>>         __u32                   reserved[8];
>>> };
>>>
>>> If rectangles > 1, then pr is used.
>>>
>>
>> The structure is passed in a ioctl and I dont think that it is a good
>> idea that you let the kernel get/set a memory address not encapsulated
>> in it. I can see that it could lead to security breaches if there is a
>> mistake on the handling.
>
> It's used in lots of places. It's OK, provided you check the memory carefully.
> See e.g. how VIDIOC_G/S_EXT_CTRLS is handled. Usually the memory checks are done
> in the v4l2 core and the driver doesn't need to take care of it.
>

I agree IFF the v4l2 core does the checks. One question raises me: how
does the user knows how big is the structure he has to allocate for
g_selection? Do we have to make a new ioctl g_n_selections?

>>> It's a bit more work to add this to the core code (VIDIOC_SUBDEV_G/S_SELECTION
>>> should probably be changed at the same time and you have to fix existing drivers
>>> to check/set the new rectangles field), but it scales much better.
>>
>> Also, we would be broking the ABI. Rectangles is not a mandatory
>> field, and has a value != 0.
>
> The spec clearly states that:
>
> "The flags and reserved fields of struct v4l2_selection are ignored and they must
>  be filled with zeros."
>
> Any app not doing that is not obeying the API and hence it is an application bug.
>
> It's standard practice inside the V4L2 API to handle reserved fields in that way,
> as it provides a mechanism to extend the API safely in the future.
>

That is what I mean, the current programs are writing a 0 on that
field, but now they are required to write a 1, so the API is broken.
Maybe we should describe:
if rectangles is 0, the field r is used (legacy), otherwise the pr,
even for 1 (multi rectangle).

>>
>> What we could do is leave the V4L2_CID_SELECTION_BITMASK  out of the
>> api, but keep the id field on the structure, so the user can define a
>> private control to do whatever he needs with the id field, wekeep the
>> ABI compatibility and no big changes are needed.
>
> I really don't like that. It artificially limits the number of rectangles to 32
> and makes the API just cumbersome to use.

I wasn't seeing the 32 rectangles as a limitation, but if you think
that it is limiting, then the solution that you provide looks good.

>
> The changes aren't difficult, just a bit tedious, and the end result does exactly
> what you want and, I think, is also very useful for things like face detection or
> object detection in general where a list of rectangles (or points, which is just a
> 1x1 rectangle) has to be returned in an atomic manner.
>
> One thing that I am not certain about is whether v4l2_rect should be used when
> specifying multiple rectangles. I can imagine that rectangles have an additional
> type field (e.g. for face detection you might have rectangles for the left eye,
> right eye and mouth).

That is where the id field was handy :), you could say rectangle
id=LEFT_EYE and then have private controls for removing red component
from rectangles which id is *_EYE.

My approach was:
You use the s/g selection api to describe rectangles (input and
output) and then you use bitmap controls to do things on the
rectangles: compose,remove red eye, track.....

>
> Regards,
>
>         Hans

So

If the 32 rectangle limitation is a nogo for you, then I would suggest:

struct v4l2_selection {
         __u32                   type;
         __u32                   target;
         __u32                   flags;
          union {
                 struct v4l2_rect        r;
                 struct v4l2_rect        *pr;
         };
         __u32                   rectangles; //if 0, r is used,
otherwise pr with rectangle components
         __u32                   id;//0 for compose/crop , N->driver
dependent (face tracking....)
        __u32                   reserved[7];
};

But:
 -memory handling has to be done in the core
 -we have to provide the user a way to know how many rectangles are in use.


If the 32 rectangle limitiation is acceptable I still like my first proposal.
But:
32 rectangles means 32 ioctls.


Thanks for your feedback and promptly response :)

-- 
Ricardo Ribalda
--
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