Re: how to crop/scale in mono-subdev camera sensor driver?

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

 



Hi Sylwester and Nicolas,

Sylwester Nawrocki wrote:
Hi,

On 09/14/2012 05:00 PM, Nicolas THERY wrote:
Hello,

I'm studying how to support cropping and scaling (binning, skipping, digital
scaling if any) for different models for camera sensor drivers.  There seems to
be (at least) two kinds of sensor drivers:

1) The smiapp driver has 2 or 3 subdevs: pixel array ->  binning (->  scaling).
It gives clients full control over the various ways of cropping and scaling
thanks to the selection API.

2) The mt9p031 driver (and maybe others) has a single subdev.  Clients use the
obsolete SUBDEV_S_CROP ioctl for selecting a region of interest in the pixel
array and SUBDEV_S_FMT for setting the source pad mbus size.  If the mbus size
differs from the cropping rectangle size, scaling is enabled and the driver
decides internally how to combine skipping and binning to achieve the requested
scaling factors.

As SUBDEV_S_CROP is obsolete, I wonder whether it is okay to support cropping
and scaling in a mono-subdev sensor driver by (a) setting the cropping
rectangle with SUBDEV_S_SELECTION on the source pad, and (b) setting the
scaling factors via the source pad mbus size as in the mt9p031 driver?

Cc: Sakari, Laurent

AFAICT in a single subdev with one pad configuration your steps as above
are valid, i.e. crop rectangle can be set with
VIDIOC_SUBDEV_S_SELECTION(V4L2_SEL_TGT_CROP) and the sensor's output
resolution with VIDIOC_SUBDEV_S_FMT.

I guess documentation [1] wasn't clear enough about that ?

The subdev crop ioctls are deprecated in favour of the selection API, so
now VIDIOC_SUBDEV_G/S_SELECTION ioctls and corresponding subdev ops needs
to be used anywhere you would have used SUBDEV_G/S_CROP before.

This reminds me there are still a few drivers that need to be converted
to use set/get_selection subdev pad level ops, rather than set/get_crop.

[1] http://linuxtv.org/downloads/v4l-dvb-apis/subdev.html

After the selection IOCTLs were implemented for the subdev API, the subdev API then allowed explicitly configuring cropping after scaling inside a single subdev, among other improvements.

Before the introduction of the selection extensions, the subdev API has never allowed explicitly performing scaling and cropping using a single subdev with only a single source pad but still some sensor drivers implement it this way. It may well be that it is technically possible to use the source pad media bus format to configure scaling after cropping but that's against what's currently defined in the spec, for the reason that we wanted to define explicitly which selection targets are used for configuring cropping and scaling and in which order that configuration is expected to be done, in order to be able to configure the subdev without having to know anything else about it except that it implements the selection API. The scaler in the ISP can now be configured using exactly the same API as can the scaler in the sensor.

If you wish to expose the scaling configuration of the sensor using the V4L2 subdev interface, then I suggest doing what the SMIA++ driver does: multiple subdevs. See "Order of configuration and format propagation" behind the above URL.

Kind regards,

--
Sakari Ailus
sakari.ailus@xxxxxx
--
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