Re: Re: [RFC] alternative kernel multimedia API

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



On 26 Oct 2001, Gerd Knorr wrote:

> > > I would like to see a detailed explanation of how the capabilities 
> > > differ from those of v4l2.
> >  
> >  The major difference is in increased flexibility and stability of
> >  kernel-user space interface.
> >  
> >  On the application side:
> >         * ability to utilize advanced driver features without explicit
> >           knowledge of their behaviour
> >         * wider compatibility without the need for recompile
> 
> what exactly is bad with the v4l2 controls?

a) no way to use them to set non-integer data (like gamma tables)
b) labels are limited to 32 chars, no way to provide "comment" fields.
  (I would like the driver to provide a short label and longer,
   user-readable and understable comment field).
c) no way to present control dependencies.
  For example in ATI cards there are several ways you can control gamma:
  gamma table, gamma overlay setting, gamma setting in the decoder chip.
  same goes for brightness. I would rather expose all the controls and
  show their relationship then bundle them up in one control
  (as to why this is relevant to kernel and not only Xv see below)

> 
> >  On the kernel side:
> >         * elimination of interfaced specific headers
> 
> Ok, you replace the '#define V4L2_CID_HUE 0x???' with the magic string
> "HUE" then.  The point is?

ioctl are kernel specific. My scheme proposes a set of mmaped buffers and
character stream. The plus is that I can make Xmultimedia extension that
also presents a set of shared buffers and character stream. The
application code will be exactly the same.

Additionally nonone will need to include kernel headers to compile the
application. Also magic string HUE is a bigger namespace then an
integer number. 

> 
> >  On the driver side:
> >         * be compatible with a wide range of applications
> 
> ???
> Sorry, but I don't see why your approach handles this better than v4l2.

Since the application accesses the driver symbolically they only have to
worry about agreeing on semantics. For example the driver can layout its
control structs any way it likes (say, to mirror hardware registers) and 
the application will bind to them. 

Also, mmaped buffers + character device fits a larger category then just
the devices mentioned in v4l2 specifications. Granted the specification
can be extended, but the new driver will have to distribute not only its
source but a patch to the kernel headers. The scheme will avoid this.

> 
> >         * introduce support for new features without the need to modify
> >           kernel interfaces
> 
> Hmm.  I don't like the idea to add new stuff that easily.  People tend
> to do quick&dirty hacks + crazy stuff with it, leading to more
> incompatibilies between drivers and applications.

And people will always be able to write a driver outside video4linux
framework. In fact, plenty of drivers and applications are incompatible as
is. The same is true about audio drivers. 

The compatibility is achived best by specifications that are clear and
easy to implement. This proposal helps it by providing a well defined
interface and by separating semantic meaning from actual interface. 
First the internal kernel library will insure that the control interface
is standard across drivers. Secondly, the drivers are free to use whatever
fields they want - no restriction their. Thirdly, the way the applications
know they deal, say, with a grabber device is when the driver says it
supports a certain INTERFACE_CLASS. Hence, to make sure the drivers
behave, all we have to do is bar any driver which declares itself
compliant with a certain INTERFACE_CLASS but isn't from entering the
kernel. And the added advantage is that we can have many INTERFACE_CLASSes
which vary in implementation difficulty, so that BASIC_GRABBER-YUV422
would be very easy to implement (just expose the buffers) and something
more advanced could be added later. This solves the conflict of people
wanting to have _some_ driver and the time consumption of writing a driver
that supports all features.

> 
> >  The last point is the very important in my opinion. For example, in
> >  current specification, v4l2 has no support for TV-out in graphics cards.
> >  It has no support for setting complex parameters like gamma tables. 
> >  Using memory-mapped buffers requires device specific ioctls.
> 
> Which device specific ioctls?  They are common for _all_ v4l2 devices.

Quote from http://www.thedirks.org/v4l2/v4l2dev.htm :

A common use for memory-mapped buffers is for streaming data to and from
drivers with minimum overhead. Drivers will maintain internal queues of
buffers and process them asynchonously. The ioctl commands for doing that
are described in the device-specific documents. Memory-mapping can also be
used for a variety of other purposes. Drivers can define hardware-specific
memory buffer types if needed. Use V4L2_BUF_TYPE_PRIVATE_BASE and greater
values for such buffer types. 


> 
> >  The goal is to create an interface that does not rely on structures
> >  defined in kernel headers for communication. 
> 
> Why do you want to do that?

 * not elegant
 * kernel structures force a specific model onto a driver
 * can cause problems with different compilers
 * confuse applications when a driver does not implement a field

Here is another way one may arrive at this kind of interface:
 
Consider capability flags. Wouldn't it be nice to have the driver present
them symbolically instead of bits ? Besides everything else you get around
the issue of running out of bits when adding new ones. 

So you can query device and get a string of the form:

 PREVIEW,SELECT,TUNER

However, this is hard to implement with ioctl's as they rely on fixed
length structures. You would have to call first to find out the size of
the buffer you need (which the driver would have to compute) and then the
second time to get the data. Eeeks. Instead just make a device and let the
application do something like:

write:  ?QUERY_CAPABILITY\n
read: PREVIEW,SELECT,TUNER

Much better, ha ? Now if you agree that this is nice we can use the same
scheme for other things. For example the whole control (i.e. hue,
etc) query can be done thru this device. No need for structs. Same goes
for width,height,picture format etc. 

Now what is left are the structs describing the format of memory buffers. 
But the driver typically has this info in a struct itself. Instead of
getting it via ioctl simply mmap the area - you'll be getting the exact
same information yourself with less context switches.

This gets rid of the structs. 

What is left of v4l now are synchronization ioctls. But we can replace
them with read/writes on the control device. With the added benifit that
we can select on it to wait for an event.

                      Vladimir Dergachev

> 
>   Gerd
> 
> -- 
> Netscape is unable to locate the server localhost:8000.
> Please check the server name and try again.
> 
> 
> 
> _______________________________________________
> Video4linux-list mailing list
> Video4linux-list@xxxxxxxxxx
> https://listman.redhat.com/mailman/listinfo/video4linux-list
> 







[Index of Archives]     [Linux DVB]     [Video Disk Recorder]     [Asterisk]     [Photo]     [DCCP]     [Netdev]     [Xorg]     [Util Linux NG]     [Xfree86]     [Free Photo Albums]     [Fedora Users]     [Fedora Women]     [ALSA Users]     [ALSA Devel]     [Linux USB]

Powered by Linux