Laurent Pinchart wrote:
Hi Tomasz,

On Tuesday 24 May 2011 14:28:49 Tomasz Stanislawski wrote:
Laurent Pinchart wrote:
On Wednesday 18 May 2011 18:55:51 Tomasz Stanislawski wrote:
Laurent Pinchart wrote:
On Saturday 14 May 2011 12:50:32 Hans Verkuil wrote:
On Friday, May 13, 2011 14:43:08 Laurent Pinchart wrote:
On Saturday 07 May 2011 13:52:25 Hans Verkuil wrote:
On Thursday, May 05, 2011 11:39:54 Tomasz Stanislawski wrote:

[snip]

Solution I (more restrictive):
0 - driver is free to adjust size, it is recommended to choose the
crop/compose rectangle as close as possible to desired one

SEL_SIZE_GE - drive is not allowed to shrink the rectangle. If no such a
rectangle exists ERANGE is returned (EINVAL is used for
not-understandable configuration)

SEL_SIZE_LE - drive is not allowed to grow the rectangle. If no such a
rectangle exists ERANGE is returned (EINVAL is used for
not-understandable configuration)

SEL_SIZE_EQ = SEL_SIZE_GE | SEL_SIZE_LE - choose size exactly the same
as in desired rectangle. Return ERANGE if such a configuration is not
possible.
So SEL_SIZE_EQ would be identical to 0, except that ERANGE would be
returned if the resulting configuration is not equal to the requested
configuration.

-----------------------------------------

Solution II (less restrictive). Proposed in this RFC.

0 - apply rectangle as close as possible to desired one like the default
behavior of  VIDIOC_S_CROP.

SEL_SIZE_GE - suggestion to increase or keep size of both coordinates

SEL_SIZE_LE - suggestion to decrease or keep size of both coordinates

SEL_SIZE_GE | SEL_SIZE_LE - technically suggestion to "increase or keep
or decrease" sizes. Basically, it means that driver is completely free
to choose coordinates. It works like saying "give me a crop similar to
this one" to the driver. I agree that it is not "a very useful"
combination of flags.
I don't see any difference between that and 0. Drivers will implement
both the same way.

In both solutions, the driver is recommended to keep the center of the
rectangle in the same place.

Personally, I prefer 'solution I' because it is more logical one.
One day, the SEL_SIZE_GE could be expanded to LEFT_LE | RIGHT_GE |
TOP_LE | BOTTOM_GE flags if drivers could support it.
But why return ERANGE ? That's one extra check in the driver that could
easily be done in userspace. And it won't be very useful to
applications, knowing that the driver doesn't support one exact
configuration won't help the application finding out how to use the
hardware. Applications will likely use 0 instead of SEL_SIZE_EQ. If we
got for solution I, I think we should disallow SEL_SIZE_LE |
SEL_SIZE_GE. It's just not useful.
Hi Laurent,
You are right that the check could be done in the userspace.
However I think it is better to do it in driver or V4L2 framework
because of following reasons:

1. Checking by an application is a redundant work:
- application specifies constraint flags
- application checks if returned coordinates suit to the flags,
   so demands are implemented twice by passing flags and making checks,
   it may lead to error prone code and difficult to detect bugs.
- the code for checking of coordinates would be duplicated in every
application that would use SELECTION

2. Coordinate checking could be done by v4l2 framework. I mean adding a
function like one below:
int v4l2_selection_check_rect(const struct v4l2_rect *adjusted, const
struct v4l2_rect *desired, int flags)

The function whould be called by driver after initial adjustments.
The function returns -ERANGE if coordinates of adjusted rectangle do not
suit to desired one basing on constraint flags.

3. It is easier to add new flags if checking is controlled by
driver/v4l2 framework (including libv4l2).

4. Successful S_SELECTION may change format set by S_FMT
- if adjusted rectangle does not suit to application's demands then
falling back to other crop resolution requires to reconfigure the
pipeline (calling S_FMT again).
- therefore S_SELECTION should fail if it not possible to satisfy
applications constraints and leave the hardware configuration intact

We need to define how S_SELECTION and S_FMT will interact before I can answer this :-) The LE | GE behaviour is a detail though, so I think we can postpone the decision and work on S_SELECTION/S_FMT/S_WHATEVER interaction first.

5. Some application may want to have a fixed crop resolution, others may
allow adjustment. I think that API should let applications explicitly
decide which treatment they prefer and using SIZE_EQ is an intuitive way
to force fixed coordinates. If the application if forced to use a fixed
crop resolution. Without SIZE_EQ the application has to to a lot of
checks only to detect that the resolution is not applicable.
The application that use SIZE_* flags knows failure may happen.

6. In order to compare an original and adjusted rectangle, an application must keep a copy of the original rectangle. It introduces a small memory overhead.


(In response to 1-3 and 5) Our current policy with most format-related ioctls is that the driver has to respond to a user request in a "best effort" way. This means the driver tries to honor the request as much as possible, and returns what it can achieve. It's then up to the application to use that information to implement application-specific policies. I think that a hint that would require the driver to return an error would not be consistent with the API, and that inconsistency wouldn't bring any added value.


Hi Laurent,
Thank you for your comments.

Keeping flags 0 is a request for a driver to behave in the "best effort" way. Using constraint flags would be used to control "best effort" policy. Moreover, this control is done explicitly. What do you think about returning the best achievable rectangle even after ERANGE error? The application would decide what to do next. Drawback to other configuration or simply to panic :).

I agree that "best effort" policy is adopted by S_FMT. I think it should be adopted by all configuration-related ioctls. All exceptions from this rule should be done explicitly by an application (like constraint flags).

Which are format-related ioctls? Is S_CROP one of them?

I noticed that there is some inconsistence in the current V4L2 API:

VIDIOC_S_CROP: EINVAL: Cropping is not supported.
- cropcap.bounds rectangle should be returned because it is the best crop rectangle which a driver can achieve. VIDIOC_CROPCAP is a mandatory ioctl, therefore a bounds rectangle always exists. Therefore driver can always draw back to bounds rectangle while executing S_CROP.

VIDIOC_S_DV_TIMINGS: EINVAL: This ioctl is not supported, or the VIDIOC_S_DV_TIMINGS parameter was unsuitable. - a driver should adjust timings to reasonable ones, or a least return timings that suit to a supported preset.

VIDIOC_S_EXT_CTRLS: ERANGE: The struct v4l2_ext_control value is out of bounds, "When the value is out of bounds drivers can choose to take the closest valid value or return an ERANGE error code, whatever seems more appropriate"
- a driver should always saturate control's value according to bounds

I think that we need a discussion about configuration policies. Some of ideas might be useful for MC. As you said that the main difficulty is interaction between S_FMT and other ioctls and controls. The problem still is present in for MC framework. There you can find complex interaction between video node format, mbus formats/crops on pads. Someone has to "the dirty-job", it means a configuration of a pipeline. The business logic has to preset somewhere:
a) in kernel space (driver)
b) middleware (libv4l, by MC plugins)
c) application (directly using MC ioctls)

Solutions b/c are somehow forms of user a space driver.

Best regards,
Tomasz Stanislawski
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to