Re: [RFC] Reserved fields in v4l2_mbus_framefmt, v4l2_subdev_format alignment

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

 



Hi Sylwester and Sakari,

On Tuesday 06 September 2011 23:07:43 Sakari Ailus wrote:
> On Tue, Sep 06, 2011 at 09:10:17PM +0200, Sylwester Nawrocki wrote:
> > On 09/05/2011 05:55 PM, Sakari Ailus wrote:
> > > Hi all,
> > > 
> > > I recently came across a few issues in the definitions of
> > > v4l2_subdev_format and v4l2_mbus_framefmt when I was working on sensor
> > > control that I wanted to bring up here. The appropriate structure
> > > right now look like this:
> > > 
> > > include/linux/v4l2-subdev.h:
> > > ---8<---
> > > /**
> > > 
> > >   * struct v4l2_subdev_format - Pad-level media bus format
> > >   * @which: format type (from enum v4l2_subdev_format_whence)
> > >   * @pad: pad number, as reported by the media API
> > >   * @format: media bus format (format code and frame size)
> > >   */
> > > 
> > > struct v4l2_subdev_format {
> > > 
> > >          __u32 which;
> > >          __u32 pad;
> > >          struct v4l2_mbus_framefmt format;
> > >          __u32 reserved[8];
> > > 
> > > };
> > > ---8<---
> > > 
> > > include/linux/v4l2-mediabus.h:
> > > ---8<---
> > > /**
> > > 
> > >   * struct v4l2_mbus_framefmt - frame format on the media bus
> > >   * @width:      frame width
> > >   * @height:     frame height
> > >   * @code:       data format code (from enum v4l2_mbus_pixelcode)
> > >   * @field:      used interlacing type (from enum v4l2_field)
> > >   * @colorspace: colorspace of the data (from enum v4l2_colorspace)
> > >   */
> > > 
> > > struct v4l2_mbus_framefmt {
> > > 
> > >          __u32                   width;
> > >          __u32                   height;
> > >          __u32                   code;
> > >          __u32                   field;
> > >          __u32                   colorspace;
> > >          __u32                   reserved[7];
> > > 
> > > };
> > > ---8<---
> > > 
> > > Offering a lower level interface for sensors which allows better
> > > control of them from the user space involves providing the link
> > > frequency to the user space. While the link frequency will be a
> > > control, together with the bus type and number of lanes (on serial
> > > links), this will define the pixel clock.
> > > 
> > > <URL:http://www.spinics.net/lists/linux-media/msg36492.html>
> > > 
> > > After adding pixel clock to v4l2_mbus_framefmt there will be six
> > > reserved fields left, one of which will be further possibly consumed
> > > by maximum image size:
> > > 
> > > <URL:http://www.spinics.net/lists/linux-media/msg35949.html>
> > 
> > Yes, thanks for remembering about it. I have done some experiments with a
> > sensor producing JPEG data and I'd like to add '__u32 framesamples'
> > field to struct v4l2_mbus_framefmt, even though it solves only part of
> > the problem. I'm not sure when I'll be able to get this finished though.
> > I've just attached the initial patch now.
> > 
> > > Frame blanking (horizontal and vertical) and number of lanes might be
> > > needed in the struct as well in the future, bringing the reserved
> > > count down to two. I find this alarmingly low for a relatively new
> > > structure definition which will potentially have a few different uses
> > > in the future.
> > 
> > Sorry, could you explain why we need to put the blanking information in
> > struct v4l2_mbus_framefmt ? I thought it had been initially agreed that
> > the control framework will be used for this.
> 
> Configuration of blanking will be implemented as controls, yes.
> 
> Bandwidth calculation in the ISP driver may well need to know more detailed
> information than just the maximum pixel rate. Averge rate over certain
> period may also be important.
> 
> For example, take a sensor which is able to produce pixel rate of 200 Mp/s.
> In the OMAP 3 ISP only the CSI2 block will be able to process pixels at
> such rate. The ISP driver needs this information to be able to decide
> whether it's safe to start streaming or not.
> 
> Higher momentary pixel rates are still possible as there are buffers
> between some of the blocks. When using downscaling on sensors this gets
> more tricky. There may be bursts of data which may overflow these buffers
> since the sensors do not output data at amortised rate. Information on the
> sensor (bursts) and size of the buffers is at least required to assess
> this question.
> 
> I have a vague feeling we may need some of this data as part of the
> v4l2_mbus_framefmt before we have a solution.

Do we really need to make all this (including the proposed framesamples field) 
part of v4l2_mbus_framefmt ? My understanding is that the information needs to 
be propagated down the pipeline to verify pipeline validity at streamon time 
and to configure blocks down in the chain. That's an in-kernel requirement, 
wouldn't it be better to use an in-kernel API for that instead of requiring 
userspace to do the job ?

> > > The another issue is that the size of the v4l2_subdev_format struct is
> > > not aligned to a power of two. Instead of the intended 32 u32's, the
> > > size is actually 22 u32's.
> > 
> > hmm, is this really an issue ? What is advantage of having the structure
> > size being the power of 2 ? Isn't multiple of 4 just enough ?
> 
> A power of two has been considered a good practice. It's also how kmalloc
> will allocate memory for the duration of the ioctl call. Typical sizes can
> be found in /proc/slabinfo. For small sizes also some non-power of two
> sizes appear available, at least on my machines.
> 
> I'm not sure about the allocation in user space.
> 
> > > The interface is present in the 3.0 and marked experimental. My
> > > proposal is to add reserved fields to v4l2_mbus_framefmt to extend its
> > > size up to 32 u32's. I understand there are already few which use the
> > > interface right now and thus this change must be done now or left
> > > as-is forever.
> > 
> > hmm, I feel a bit uncomfortable with increasing size of data structure
> > which is quite widely used, not only in sensors, also in TV capture
> > cards, tuners, etc. So far struct v4l2_mbus_framefmt was quite generic.
> > IMHO it might be good to try to avoid extending it widely with
> > properties specific to single subsystem.
> 
> This is why I wanted to bring this up now rather than later. Of course I
> should have realised these issues before we had .39. ;)
> 
> I agree the pixel rate management should be implemented in a way which is
> not specific to sensors.

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


[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