Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 24 Mar 1998 12:37:10 -0600 (CST)
From:      Jim Lowe <james@miller.cs.uwm.edu>
To:        hasty@rah.star-gate.com, luigi@labinfo.iet.unipi.it, rhh@ct.picker.com
Cc:        multimedia@FreeBSD.ORG
Subject:   Re: Video ioctl interface
Message-ID:  <199803241837.MAA05132@miller.cs.uwm.edu>

next in thread | raw e-mail | index | archive | help
[...LONG...]

> From: Randall Hopper <rhh@ct.picker.com>
> 
>  1) Are we sure it's really worth the effort at this point?

I am sorry I haven't gotten back to you sooner on this.  I think what we
need is to have a generic multimedia interface for both audio and video.
The interface must have the ability to change and have functionality added.
Today, we have separate audio, video capture, and mpeg encoders/decoders.
It would be nice to be able to present all different types of mm
hardware with a single interface. 

...plug on: Luigi and I are scheduled to talk about the current audio
and video interfaces for the Freenix track of Usenix, Thursday morning,
June 18th, in New Orleans, http://www.usenix.org/events/no98.  It would
be great if a group could get together during this event to discuss
multimedia issues.  Is there any interest in this?
:plug off...


> From: Randall Hopper <rhh@ct.picker.com>
>   
>  2) I'd like us convert to this model:
>   
>           Applications ->  Capture Library -> Capture Devices
>           Applications ->  Tuner   Library -> Tuner Devices
>> From: Luigi Rizzo <luigi@labinfo.iet.unipi.it>
>> 
>> this is a question of personal preference of course, but i am generally
>> against libraries unless they provide some significant functionality
>> (i.e. they do more than shuffling parameters), and function names are
>> reasonably short...

I agree with Luigi here.  I don't think we really need a library at
this time.  I think libraries have their uses, but we need a generic
extensible interface to the hardware.  Fopen() is nice, but there
are applications which still want to use open().

The library, with all its frills, can come once we have a reasonable
interface defined.  Actually, I suspect a library will be a natural
fall out once the interface is defined.  The model I would prefer:

                +--> Devices       <--> Device helper daemon(s), configuration.
                |                       [...move kernel bloat here...]
Applications <--+--> Libraries     <--> Library helper routines, daemon(s).
	        |
	        +--> Documentation <--> Doc helper routines, daemon(s).


>   
>  3) Generic, extensible interface.

I agree.

>   
>     No interfaces to explicitly open specific devices or set/get specific
>     parameters (e.g. contrast, brightness, hue, etc.) on a device.
>   
>     Have a generic interface to query which capture/tuner devices are
>     available, which parameters for each device are supported, and for each,
>     what their valid value ranges are.  E.g.:
>   
>         TUNERLIB_DEV    *TunerLib_GetInstalledTunerDevByIndex( i );
>         TUNERLIB_DEV    *TunerLib_OpenTunerDev( dev, i );
>   
>         TUNERLIB_PARAM  *TunerLib_GetParamByIndex( dev, i );
>         TUNERLIB_PARAM  *TunerLib_GetParamByName( dev, "CONTRAST" );
>         TUNERLIB_PRANGE *TunerLib_GetParamRange( dev, param );
>         TUNERLIB_PRANGE *TunerLib_SetParam( param, double value );
>         ...

Forgive me here, I am not trying to create a flame war, but it looks like
we might be trying to create something similar to what X does to a graphics
display, or what MVS did to IBM 360 architecture.  There must be
a better way to create an interface other than 1000 library calls,
each with 1000 different options, each with
really_long_names_that_I_cannot_remember_without_looking_at_the_include_files.

Maybe this can't be avoided in the long run, but there must be a better
way.  Does anyone have any ideas in this area?  Creating an interface
which resembles X is rather distasteful to me.

At a min, I think we should be able to have a multimedia set up program
which will initialize the multimedia devices for PAL, NTSC, MU_LAW, tuner
frequencies, etc...  This program could also run as a daemon connected
to a master multimedia device which would do software emulation of
functions which are not supported directly in hardware.  The alternative
to this approach would be to have support libraries which the applications
call as Randall suggests.  Maybe the best approach would be to have both.


>   
>      So all this stuff:
>   
>              #define BT848_SBRIG     _IOW('x', 38, int)  /* set brightness  */
>              #define BT848_GBRIG     _IOR('x', 38, int)  /* get brightness  */
	[...can go away...]

I agree that this stuff should be at a different level and somehow
have a mapping from a generic interface level to whatever the
particular card(s) can handle.

Here are some thoughts from a previous message that was bouncing
around between a few of us last October.   This ioctl definition
doesn't address the issue I brought up above.
-------------------------------------------------------------------
...
.../*
... * Multi-media ioctl interface definition (not to be confused with the
... * candy (m&m's).
... */
...#define MM_MAJOR_VERSION	1
...#define MM_MINOR_VESRION	0
...#define	MM_VERSION		((MM_MAJOR_VERSION << 16) | (MM_MINOR_VERSION))
...enum v0100_functions {
...	MMGHCAPS,	/* Get hardware capabilities */
...	MMGSCAPS,	/* Get software (emulation) capabilities */
...	MMSTART,	/* Start processing (go) */
...	MMGFORMAT,	/* Get format  */
...	MMSFORMAT,	/* Set format  */
...	MMGMICROCODE,	/* Retrieve microcode */
...	MMSMICROCODE,	/* Download microcode */
...	...
...};
...typedef v0100_functions	functions;
...
...struct	_mm_info	{
...	unsigned int	version;
...	functions	function;
...	unsigned 	size;
...	caddr_t		buffer;
...};
...typedef struct _mm_info mm_info;
...
...#define MM_W	 _IOW('M', 1, mm_info)
...#define MM_R	 _IOR('M', 1, mm_info)
...#define MM_WR _IOWR('M', 1, mm_info)
...#define MM	 _IO('M', 1)
...
...	mm_info	mm;
...
...	mm.version = MM_VERSION;
...	...
...	mm.function = MMGCAPS;
...	ioctl(f, MM_R, &mm);
...	... parse capabilities... [should be a library function]
...	
...	audio.format = MU_LAW;
...	mm.buffer = &audio.format;
...	mm.size = sizeof(audio.format);
...	mm.function = MMSFORMAT;
...	ioctl(f, MM_W, &mm);
...	...
...	mm.function = MMSMICROCODE;
...	mm.size = sizeof(dsp_microcode);
...	mm.buffer = dsp_microcode;
...	ioctl(f, MM_W, &mm);
...	...
...	mm.function = MMSTART;
...	ioctl(f, MM, &mm);
...
...Wouldn't the above work and give us the flexibility we need and still
...maintain the standard Unix ioctl type calls?  Of course, things would
...look better with a suitable library/API type interface to the ioctl
...calls.  Functions like:
...
...	mm_api	*mm;
...
...	mm = mm_open(device);
...	if(mm_get_format(mm) != MU_LAW)
...		(void)mm_set_format(mm, MU_LAW);
...	(void)mm_set_microcode(mm, buffer);
...	(void)mm_go(mm);
...	(void)mm_close(mm);
...
...Certainly a standard library could ``hide'' many of the backward
...compatibility issues and void kernel bloat in this area.

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

I could go on about these issues, but this message is long enough and
overdue.  

I am really interested in starting some sort of discourse on this subject.
The Usenix conference would be one way for many of us to sit around a
table and hash this out.  We could also try and schedule something on
the Mbone.  Is everyone fairly well connected on the Mbone?

	-Jim

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-multimedia" in the body of the message



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199803241837.MAA05132>