<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
	"http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" []>

<book id="V4LGuide">
 <bookinfo>
  <title>Video4Linux Programming</title>
  
  <authorgroup>
   <author>
    <firstname>Alan</firstname>
    <surname>Cox</surname>
    <affiliation>
     <address>
      <email>alan@redhat.com</email>
     </address>
    </affiliation>
   </author>
  </authorgroup>

  <copyright>
   <year>2000</year>
   <holder>Alan Cox</holder>
  </copyright>

  <legalnotice>
   <para>
     This documentation is free software; you can redistribute
     it and/or modify it under the terms of the GNU General Public
     License as published by the Free Software Foundation; either
     version 2 of the License, or (at your option) any later
     version.
   </para>
      
   <para>
     This program is distributed in the hope that it will be
     useful, but WITHOUT ANY WARRANTY; without even the implied
     warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
     See the GNU General Public License for more details.
   </para>
      
   <para>
     You should have received a copy of the GNU General Public
     License along with this program; if not, write to the Free
     Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
     MA 02111-1307 USA
   </para>
      
   <para>
     For more details see the file COPYING in the source
     distribution of Linux.
   </para>
  </legalnotice>
 </bookinfo>

<toc></toc>

  <chapter id="intro">
      <title>Introduction</title>
  <para>
        Parts of this document first appeared in Linux Magazine under a
        ninety day exclusivity.
  </para>
  <para>
        Video4Linux is intended to provide a common programming interface
        for the many TV and capture cards now on the market, as well as
        parallel port and USB video cameras. Radio, teletext decoders and
        vertical blanking data interfaces are also provided.
  </para>
  </chapter>
  <chapter id="radio">
        <title>Radio Devices</title>
  <para>
        There are a wide variety of radio interfaces available for PC's, and these
        are generally very simple to program. The biggest problem with supporting
        such devices is normally extracting documentation from the vendor.
  </para>
  <para>
        The radio interface supports a simple set of control ioctls standardised
        across all radio and tv interfaces. It does not support read or write, which
        are used for video streams. The reason radio cards do not allow you to read
        the audio stream into an application is that without exception they provide
        a connection on to a soundcard. Soundcards can be used to read the radio
        data just fine. 
  </para>
  <sect1 id="registerradio">
  <title>Registering Radio Devices</title>
  <para>
        The Video4linux core provides an interface for registering devices. The
        first step in writing our radio card driver is to register it.
  </para>
  <programlisting>


static struct video_device my_radio
{
        "My radio",
        VID_TYPE_TUNER,
        VID_HARDWARE_MYRADIO,
        radio_open.
        radio_close,
        NULL,                /* no read */
        NULL,                 /* no write */
        NULL,                /* no poll */
        radio_ioctl,
        NULL,                /* no special init function */
        NULL                /* no private data */
};


  </programlisting>
  <para>
        This declares our video4linux device driver interface. The VID_TYPE_ value
        defines what kind of an interface we are, and defines basic capabilities.
  </para>
  <para>
        The only defined value relevant for a radio card is VID_TYPE_TUNER which
        indicates that the device can be tuned. Clearly our radio is going to have some
        way to change channel so it is tuneable.
  </para>
  <para>
        The VID_HARDWARE_ types are unique to each device. Numbers are assigned by
        <email>alan@redhat.com</email> when device drivers are going to be released. Until then you
        can pull a suitably large number out of your hat and use it. 10000 should be
        safe for a very long time even allowing for the huge number of vendors
        making new and different radio cards at the moment.
  </para>
  <para>
        We declare an open and close routine, but we do not need read or write,
        which are used to read and write video data to or from the card itself. As
        we have no read or write there is no poll function.
  </para>
  <para>
        The private initialise function is run when the device is registered. In
        this driver we've already done all the work needed. The final pointer is a
        private data pointer that can be used by the device driver to attach and
        retrieve private data structures. We set this field "priv" to NULL for
        the moment.
  </para>
  <para>
        Having the structure defined is all very well but we now need to register it
        with the kernel. 
  </para>
  <programlisting>


static int io = 0x320;

int __init myradio_init(struct video_init *v)
{
        if(!request_region(io, MY_IO_SIZE, "myradio"))
        {
                printk(KERN_ERR 
                    "myradio: port 0x%03X is in use.\n", io);
                return -EBUSY;
        }

        if(video_device_register(&amp;my_radio, VFL_TYPE_RADIO)==-1) {
                release_region(io, MY_IO_SIZE);
                return -EINVAL;
        }		
        return 0;
}

  </programlisting>
  <para>
        The first stage of the initialisation, as is normally the case, is to check 
        that the I/O space we are about to fiddle with doesn't belong to some other 
        driver. If it is we leave well alone. If the user gives the address of the 
        wrong device then we will spot this. These policies will generally avoid 
        crashing the machine.
  </para>
  <para>
        Now we ask the Video4Linux layer to register the device for us. We hand it
        our carefully designed video_device structure and also tell it which group
        of devices we want it registered with. In this case VFL_TYPE_RADIO.
  </para>
  <para>
        The types available are
  </para>
   <table frame="all"><title>Device Types</title>
   <tgroup cols="3" align="left">
   <tbody>
   <row>
        <entry>VFL_TYPE_RADIO</entry><entry>/dev/radio{n}</entry><entry>

        Radio devices are assigned in this block. As with all of these
        selections the actual number assignment is done by the video layer
        accordijng to what is free.</entry>
	</row><row>
        <entry>VFL_TYPE_GRABBER</entry><entry>/dev/video{n}</entry><entry>
        Video capture devices and also -- counter-intuitively for the name --
        hardware video playback devices such as MPEG2 cards.</entry>
	</row><row>
        <entry>VFL_TYPE_VBI</entry><entry>/dev/vbi{n}</entry><entry>
        The VBI devices capture the hidden lines on a television picture
        that carry further information like closed caption data, teletext
        (primarily in Europe) and now Intercast and the ATVEC internet
        television encodings.</entry>
	</row><row>
        <entry>VFL_TYPE_VTX</entry><entry>/dev/vtx[n}</entry><entry>
        VTX is 'Videotext' also known as 'Teletext'. This is a system for
        sending numbered, 40x25, mostly textual page images over the hidden
        lines. Unlike the /dev/vbi interfaces, this is for 'smart' decoder 
        chips. (The use of the word smart here has to be taken in context,
        the smartest teletext chips are fairly dumb pieces of technology).
	</entry>
    </row>
    </tbody>
    </tgroup>
    </table>
  <para>
        We are most definitely a radio.
  </para>
  <para>
        Finally we allocate our I/O space so that nobody treads on us and return 0
        to signify general happiness with the state of the universe.
  </para>
  </sect1>
  <sect1 id="openradio">
  <title>Opening And Closing The Radio</title>

  <para>
        The functions we declared in our video_device are mostly very simple.
        Firstly we can drop in what is basically standard code for open and close. 
  </para>
  <programlisting>


static int users = 0;

static int radio_open(struct video_device *dev, int flags)
{
        if(users)
                return -EBUSY;
        users++;
        return 0;
}

  </programlisting>
  <para>
        At open time we need to do nothing but check if someone else is also using
        the radio card. If nobody is using it we make a note that we are using it,
        then we ensure that nobody unloads our driver on us.
  </para>
  <programlisting>


static int radio_close(struct video_device *dev)
{
        users--;
}

  </programlisting>
  <para>
        At close time we simply need to reduce the user count and allow the module
        to become unloadable.
  </para>
  <para>
        If you are sharp you will have noticed neither the open nor the close
        routines attempt to reset or change the radio settings. This is intentional.
        It allows an application to set up the radio and exit. It avoids a user
        having to leave an application running all the time just to listen to the
        radio. 
  </para>
  </sect1>
  <sect1 id="ioctlradio">
  <title>The Ioctl Interface</title>
  <para>
        This leaves the ioctl routine, without which the driver will not be
        terribly useful to anyone.
  </para>
  <programlisting>


static int radio_ioctl(struct video_device *dev, unsigned int cmd, void *arg)
{
        switch(cmd)
        {
                case VIDIOCGCAP:
                {
                        struct video_capability v;
                        v.type = VID_TYPE_TUNER;
                        v.channels = 1;
                        v.audios = 1;
                        v.maxwidth = 0;
                        v.minwidth = 0;
                        v.maxheight = 0;
                        v.minheight = 0;
                        strcpy(v.name, "My Radio");
                        if(copy_to_user(arg, &amp;v, sizeof(v)))
                                return -EFAULT;
                        return 0;
                }

  </programlisting>
  <para>
        VIDIOCGCAP is the first ioctl all video4linux devices must support. It
        allows the applications to find out what sort of a card they have found and
        to figure out what they want to do about it. The fields in the structure are
  </para>
   <table frame="all"><title>struct video_capability fields</title>
   <tgroup cols="2" align="left">
   <tbody>
   <row>
        <entry>name</entry><entry>The device text name. This is intended for the user.</entry>
	</row><row>
        <entry>channels</entry><entry>The number of different channels you can tune on
                        this card. It could even by zero for a card that has
                        no tuning capability. For our simple FM radio it is 1. 
                        An AM/FM radio would report 2.</entry>
	</row><row>
        <entry>audios</entry><entry>The number of audio inputs on this device. For our
                        radio there is only one audio input.</entry>
	</row><row>
        <entry>minwidth,minheight</entry><entry>The smallest size the card is capable of capturing
		        images in. We set these to zero. Radios do not
                        capture pictures</entry>
	</row><row>
        <entry>maxwidth,maxheight</entry><entry>The largest image size the card is capable of
                                      capturing. For our radio we report 0.
				</entry>
	</row><row>
        <entry>type</entry><entry>This reports the capabilities of the device, and
                        matches the field we filled in in the struct
                        video_device when registering.</entry>
    </row>
    </tbody>
    </tgroup>
    </table>
  <para>
        Having filled in the fields, we use copy_to_user to copy the structure into
        the users buffer. If the copy fails we return an EFAULT to the application
        so that it knows it tried to feed us garbage.
  </para>
  <para>
        The next pair of ioctl operations select which tuner is to be used and let
        the application find the tuner properties. We have only a single FM band
        tuner in our example device.
  </para>
  <programlisting>


                case VIDIOCGTUNER:
                {
                        struct video_tuner v;
                        if(copy_from_user(&amp;v, arg, sizeof(v))!=0)
                                return -EFAULT;
                        if(v.tuner)
                                return -EINVAL;
                        v.rangelow=(87*16000);
                        v.rangehigh=(108*16000);
                        v.flags = VIDEO_TUNER_LOW;
                        v.mode = VIDEO_MODE_AUTO;
                        v.signal = 0xFFFF;
                        strcpy(v.name, "FM");
                        if(copy_to_user(&amp;v, arg, sizeof(v))!=0)
                                return -EFAULT;
                        return 0;
                }

  </programlisting>
  <para>
        The VIDIOCGTUNER ioctl allows applications to query a tuner. The application
        sets the tuner field to the tuner number it wishes to query. The query does
        not change the tuner that is being used, it merely enquires about the tuner
        in question.
  </para>
  <para>
        We have exactly one tuner so after copying the user buffer to our temporary
        structure we complain if they asked for a tuner other than tuner 0. 
  </para>
  <para>
        The video_tuner structure has the following fields
  </para>
   <table frame="all"><title>struct video_tuner fields</title>
   <tgroup cols="2" align="left">
   <tbody>
   <row>
        <entry>int tuner</entry><entry>The number of the tuner in question</entry>
   </row><row>
        <entry>char name[32]</entry><entry>A text description of this tuner. "FM" will do fine.
                        This is intended for the application.</entry>
   </row><row>
        <entry>u32 flags</entry>
        <entry>Tuner capability flags</entry>
   </row>
   <row>
        <entry>u16 mode</entry><entry>The current reception mode</entry>

   </row><row>
        <entry>u16 signal</entry><entry>The signal strength scaled between 0 and 65535. If
                        a device cannot tell the signal strength it should
                        report 65535. Many simple cards contain only a 
                        signal/no signal bit. Such cards will report either
                        0 or 65535.</entry>

   </row><row>
        <entry>u32 rangelow, rangehigh</entry><entry>
                        The range of frequencies supported by the radio
                        or TV. It is scaled according to the VIDEO_TUNER_LOW
                        flag.</entry>

    </row>
    </tbody>
    </tgroup>
    </table>

   <table frame="all"><title>struct video_tuner flags</title>
   <tgroup cols="2" align="left">
   <tbody>
   <row>
	<entry>VIDEO_TUNER_PAL</entry><entry>A PAL TV tuner</entry>
	</row><row>
        <entry>VIDEO_TUNER_NTSC</entry><entry>An NTSC (US) TV tuner</entry>
	</row><row>
        <entry>VIDEO_TUNER_SECAM</entry><entry>A SECAM (French) TV tuner</entry>
	</row><row>
        <entry>VIDEO_TUNER_LOW</entry><entry>
             The tuner frequency is scaled in 1/16th of a KHz
             steps. If not it is in 1/16th of a MHz steps
	</entry>
	</row><row>
        <entry>VIDEO_TUNER_NORM</entry><entry>The tuner can set its format</entry>
	</row><row>
        <entry>VIDEO_TUNER_STEREO_ON</entry><entry>The tuner is currently receiving a stereo signal</entry>
        </row>
    </tbody>
    </tgroup>
    </table>

   <table frame="all"><title>struct video_tuner modes</title>
   <tgroup cols="2" align="left">
   <tbody>
   <row>
                <entry>VIDEO_MODE_PAL</entry><entry>PAL Format</entry>
   </row><row>
                <entry>VIDEO_MODE_NTSC</entry><entry>NTSC Format (USA)</entry>
   </row><row>
                <entry>VIDEO_MODE_SECAM</entry><entry>French Format</entry>
   </row><row>
                <entry>VIDEO_MODE_AUTO</entry><entry>A device that does not need to do
                                        TV format switching</entry>
   </row>
    </tbody>
    </tgroup>
    </table>
  <para>
        The settings for the radio card are thus fairly simple. We report that we
        are a tuner called "FM" for FM radio. In order to get the best tuning
        resolution we report VIDEO_TUNER_LOW and select tuning to 1/16th of KHz. Its
        unlikely our card can do that resolution but it is a fair bet the card can
        do better than 1/16th of a MHz. VIDEO_TUNER_LOW is appropriate to almost all
        radio usage.
  </para>
  <para>
        We report that the tuner automatically handles deciding what format it is
        receiving - true enough as it only handles FM radio. Our example card is
        also incapable of detecting stereo or signal strengths so it reports a
        strength of 0xFFFF (maximum) and no stereo detected.
  </para>
  <para>
        To finish off we set the range that can be tuned to be 87-108Mhz, the normal
        FM broadcast radio range. It is important to find out what the card is
        actually capable of tuning. It is easy enough to simply use the FM broadcast
        range. Unfortunately if you do this you will discover the FM broadcast
        ranges in the USA, Europe and Japan are all subtly different and some users
        cannot receive all the stations they wish.
  </para>
  <para>
        The application also needs to be able to set the tuner it wishes to use. In
        our case, with a single tuner this is rather simple to arrange.
  </para>
  <programlisting>

                case VIDIOCSTUNER:
                {
                        struct video_tuner v;
                        if(copy_from_user(&amp;v, arg, sizeof(v)))
                                return -EFAULT;
                        if(v.tuner != 0)
                                return -EINVAL;
                        return 0;
                }

  </programlisting>
  <para>
        We copy the user supplied structure into kernel memory so we can examine it. 
        If the user has selected a tuner other than zero we reject the request. If 
        they wanted tuner 0 then, surprisingly enough, that is the current tuner already.
  </para>
  <para>
        The next two ioctls we need to provide are to get and set the frequency of
        the radio. These both use an unsigned long argument which is the frequency.
        The scale of the frequency depends on the VIDEO_TUNER_LOW flag as I
        mentioned earlier on. Since we have VIDEO_TUNER_LOW set this will be in
        1/16ths of a KHz.
  </para>
  <programlisting>

static unsigned long current_freq;



                case VIDIOCGFREQ:
                        if(copy_to_user(arg, &amp;current_freq, 
                                sizeof(unsigned long))
                                return -EFAULT;
                        return 0;

  </programlisting>
  <para>
        Querying the frequency in our case is relatively simple. Our radio card is
        too dumb to let us query the signal strength so we remember our setting if 
        we know it. All we have to do is copy it to the user.
  </para>
  <programlisting>


                case VIDIOCSFREQ:
                {
                        u32 freq;
                        if(copy_from_user(arg, &amp;freq, 
                                sizeof(unsigned long))!=0)
                                return -EFAULT;
                        if(hardware_set_freq(freq)&lt;0)
                                return -EINVAL;
                        current_freq = freq;
                        return 0;
                }

  </programlisting>
  <para>
        Setting the frequency is a little more complex. We begin by copying the
        desired frequency into kernel space. Next we call a hardware specific routine
        to set the radio up. This might be as simple as some scaling and a few
        writes to an I/O port. For most radio cards it turns out a good deal more
        complicated and may involve programming things like a phase locked loop on
        the card. This is what documentation is for. 
  </para>
  <para>
        The final set of operations we need to provide for our radio are the 
        volume controls. Not all radio cards can even do volume control. After all
        there is a perfectly good volume control on the sound card. We will assume
        our radio card has a simple 4 step volume control.
  </para>
  <para>
        There are two ioctls with audio we need to support
  </para>
  <programlisting>

static int current_volume=0;

                case VIDIOCGAUDIO:
                {
                        struct video_audio v;
                        if(copy_from_user(&amp;v, arg, sizeof(v)))
                                return -EFAULT;
                        if(v.audio != 0)
                                return -EINVAL;
                        v.volume = 16384*current_volume;
                        v.step = 16384;
                        strcpy(v.name, "Radio");
                        v.mode = VIDEO_SOUND_MONO;
                        v.balance = 0;
                        v.base = 0;
                        v.treble = 0;
                        
                        if(copy_to_user(arg. &amp;v, sizeof(v)))
                                return -EFAULT;
                        return 0;
                }

  </programlisting>
  <para>
        Much like the tuner we start by copying the user structure into kernel
        space. Again we check if the user has asked for a valid audio input. We have
        only input 0 and we punt if they ask for another input.
  </para>
  <para>
        Then we fill in the video_audio structure. This has the following format
  </para>
   <table frame="all"><title>struct video_audio fields</title>
   <tgroup cols="2" align="left">
   <tbody>
   <row>
   <entry>audio</entry><entry>The input the user wishes to query</entry>
   </row><row>
   <entry>volume</entry><entry>The volume setting on a scale of 0-65535</entry>
   </row><row>
   <entry>base</entry><entry>The base level on a scale of 0-65535</entry>
   </row><row>
   <entry>treble</entry><entry>The treble level on a scale of 0-65535</entry>
   </row><row>
   <entry>flags</entry><entry>The features this audio device supports
   </entry>
   </row><row>
   <entry>name</entry><entry>A text name to display to the user. We picked
                        "Radio" as it explains things quite nicely.</entry>
   </row><row>
   <entry>mode</entry><entry>The current reception mode for the audio

                We report MONO because our card is too stupid to know if it is in
                mono or stereo. 
   </entry>
   </row><row>
   <entry>balance</entry><entry>The stereo balance on a scale of 0-65535, 32768 is
                        middle.</entry>
   </row><row>
   <entry>step</entry><entry>The step by which the volume control jumps. This is
                        used to help make it easy for applications to set 
                        slider behaviour.</entry>
   </row>
   </tbody>
   </tgroup>
   </table>

   <table frame="all"><title>struct video_audio flags</title>
   <tgroup cols="2" align="left">
   <tbody>
   <row>
                <entry>VIDEO_AUDIO_MUTE</entry><entry>The audio is currently muted. We
                                        could fake this in our driver but we
                                        choose not to bother.</entry>
   </row><row>
                <entry>VIDEO_AUDIO_MUTABLE</entry><entry>The input has a mute option</entry>
   </row><row>
                <entry>VIDEO_AUDIO_TREBLE</entry><entry>The  input has a treble control</entry>
   </row><row>
                <entry>VIDEO_AUDIO_BASS</entry><entry>The input has a base control</entry>
   </row>
   </tbody>
   </tgroup>
   </table>

   <table frame="all"><title>struct video_audio modes</title>
   <tgroup cols="2" align="left">
   <tbody>
   <row>
                <entry>VIDEO_SOUND_MONO</entry><entry>Mono sound</entry>
   </row><row>
                <entry>VIDEO_SOUND_STEREO</entry><entry>Stereo sound</entry>
   </row><row>
                <entry>VIDEO_SOUND_LANG1</entry><entry>Alternative language 1 (TV specific)</entry>
   </row><row>
                <entry>VIDEO_SOUND_LANG2</entry><entry>Alternative language 2 (TV specific)</entry>
   </row>
   </tbody>
   </tgroup>
   </table>
  <para>
        Having filled in the structure we copy it back to user space.
  </para>
  <para>
        The VIDIOCSAUDIO ioctl allows the user to set the audio parameters in the
        video_audio structure. The driver does its best to honour the request.
  </para>
  <programlisting>

                case VIDIOCSAUDIO:
                {
                        struct video_audio v;
                        if(copy_from_user(&amp;v, arg, sizeof(v)))
                                return -EFAULT;
                        if(v.audio)
                                return -EINVAL;
                        current_volume = v/16384;
                        hardware_set_volume(current_volume);
                        return 0;
                }

  </programlisting>
  <para>
        In our case there is very little that the user can set. The volume is
        basically the limit. Note that we could pretend to have a mute feature
        by rewriting this to 
  </para>
  <programlisting>

                case VIDIOCSAUDIO:
                {
                        struct video_audio v;
                        if(copy_from_user(&amp;v, arg, sizeof(v)))
                                return -EFAULT;
                        if(v.audio)
                                return -EINVAL;
                        current_volume = v/16384;
                        if(v.flags&amp;VIDEO_AUDIO_MUTE)
                                hardware_set_volume(0);
                        else
                                hardware_set_volume(current_volume);
                        current_muted = v.flags &amp; 
                                              VIDEO_AUDIO_MUTE;
                        return 0;
                }

  </programlisting>
  <para>
        This with the corresponding changes to the VIDIOCGAUDIO code to report the
        state of the mute flag we save and to report the card has a mute function,
        will allow applications to use a mute facility with this card. It is
        questionable whether this is a good idea however. User applications can already
        fake this themselves and kernel space is precious.
  </para>
  <para>
        We now have a working radio ioctl handler. So we just wrap up the function
  </para>
  <programlisting>


        }
        return -ENOIOCTLCMD;
}

  </programlisting>
  <para>
        and pass the Video4Linux layer back an error so that it knows we did not
        understand the request we got passed.
  </para>
  </sect1>
  <sect1 id="modradio">
  <title>Module Wrapper</title>
  <para>
        Finally we add in the usual module wrapping and the driver is done.
  </para>
  <programlisting>

#ifndef MODULE

static int io = 0x300;

#else

static int io = -1;

#endif

MODULE_AUTHOR("Alan Cox");
MODULE_DESCRIPTION("A driver for an imaginary radio card.");
module_param(io, int, 0444);
MODULE_PARM_DESC(io, "I/O address of the card.");

static int __init init(void)
{
        if(io==-1)
        {
                printk(KERN_ERR 
         "You must set an I/O address with io=0x???\n");
                return -EINVAL;
        }
        return myradio_init(NULL);
}

static void __exit cleanup(void)
{
        video_unregister_device(&amp;my_radio);
        release_region(io, MY_IO_SIZE);
}

module_init(init);
module_exit(cleanup);

  </programlisting>
  <para>
        In this example we set the IO base by default if the driver is compiled into
        the kernel: you can still set it using "my_radio.irq" if this file is called <filename>my_radio.c</filename>. For the module we require the
        user sets the parameter. We set io to a nonsense port (-1) so that we can
        tell if the user supplied an io parameter or not.
  </para>
  <para>
        We use MODULE_ defines to give an author for the card driver and a
        description. We also use them to declare that io is an integer and it is the
        address of the card, and can be read by anyone from sysfs.
  </para>
  <para>
        The clean-up routine unregisters the video_device we registered, and frees
        up the I/O space. Note that the unregister takes the actual video_device
        structure as its argument. Unlike the file operations structure which can be
        shared by all instances of a device a video_device structure as an actual
        instance of the device. If you are registering multiple radio devices you
        need to fill in one structure per device (most likely by setting up a
        template and copying it to each of the actual device structures).
  </para>
  </sect1>
  </chapter>
  <chapter>
        <title>Video Capture Devices</title>
  <sect1 id="introvid">
  <title>Video Capture Device Types</title>
  <para>
        The video capture devices share the same interfaces as radio devices. In
        order to explain the video capture interface I will use the example of a
        camera that has no tuners or audio input. This keeps the example relatively
        clean. To get both combine the two driver examples.
  </para>
  <para>
        Video capture devices divide into four categories. A little technology
        backgrounder. Full motion video even at television resolution (which is
        actually fairly low) is pretty resource-intensive. You are continually
        passing megabytes of data every second from the capture card to the display. 
        several alternative approaches have emerged because copying this through the 
        processor and the user program is a particularly bad idea .
  </para>
  <para>
        The first is to add the television image onto the video output directly.
        This is also how some 3D cards work. These basic cards can generally drop the
        video into any chosen rectangle of the display. Cards like this, which
        include most mpeg1 cards that used the feature connector,  aren't very
        friendly in a windowing environment. They don't understand windows or
        clipping. The video window is always on the top of the display.
  </para>
  <para>
        Chroma keying is a technique used by cards to get around this. It is an old
        television mixing trick where you mark all the areas you wish to replace
        with a single clear colour that isn't used in the image - TV people use an
        incredibly bright blue while computing people often use a particularly
        virulent purple. Bright blue occurs on the desktop. Anyone with virulent
        purple windows has another problem besides their TV overlay.
  </para>
  <para>
        The third approach is to copy the data from the capture card to the video
        card, but to do it directly across the PCI bus. This relieves the processor
        from doing the work but does require some smartness on the part of the video
        capture chip, as well as a suitable video card. Programming this kind of
        card and more so debugging it can be extremely tricky. There are some quite
        complicated interactions with the display and you may also have to cope with
        various chipset bugs that show up when PCI cards start talking to each
        other. 
  </para>
  <para>
        To keep our example fairly simple we will assume a card that supports
        overlaying a flat rectangular image onto the frame buffer output, and which
        can also capture stuff into processor memory.
  </para>
  </sect1>
  <sect1 id="regvid">
  <title>Registering Video Capture Devices</title>
  <para>
        This time we need to add more functions for our camera device.
  </para>
  <programlisting>
static struct video_device my_camera
{
        "My Camera",
        VID_TYPE_OVERLAY|VID_TYPE_SCALES|\
        VID_TYPE_CAPTURE|VID_TYPE_CHROMAKEY,
        VID_HARDWARE_MYCAMERA,
        camera_open.
        camera_close,
        camera_read,      /* no read */
        NULL,             /* no write */
        camera_poll,      /* no poll */
        camera_ioctl,
        NULL,             /* no special init function */
        NULL              /* no private data */
};
  </programlisting>
  <para>
        We need a read() function which is used for capturing data from
        the card, and we need a poll function so that a driver can wait for the next
        frame to be captured.
  </para>
  <para>
        We use the extra video capability flags that did not apply to the
        radio interface. The video related flags are
  </para>
   <table frame="all"><title>Capture Capabilities</title>
   <tgroup cols="2" align="left">
   <tbody>
   <row>
<entry>VID_TYPE_CAPTURE</entry><entry>We support image capture</entry>
</row><row>
<entry>VID_TYPE_TELETEXT</entry><entry>A teletext capture device (vbi{n])</entry>
</row><row>
<entry>VID_TYPE_OVERLAY</entry><entry>The image can be directly overlaid onto the
                                frame buffer</entry>
</row><row>
<entry>VID_TYPE_CHROMAKEY</entry><entry>Chromakey can be used to select which parts
                                of the image to display</entry>
</row><row>
<entry>VID_TYPE_CLIPPING</entry><entry>It is possible to give the board a list of
                                rectangles to draw around. </entry>
</row><row>
<entry>VID_TYPE_FRAMERAM</entry><entry>The video capture goes into the video memory
                                and actually changes it. Applications need
                                to know this so they can clean up after the
                                card</entry>
</row><row>
<entry>VID_TYPE_SCALES</entry><entry>The image can be scaled to various sizes,
                                rather than being a single fixed size.</entry>
</row><row>
<entry>VID_TYPE_MONOCHROME</entry><entry>The capture will be monochrome. This isn't a
                                complete answer to the question since a mono
                                camera on a colour capture card will still
                                produce mono output.</entry>
</row><row>
<entry>VID_TYPE_SUBCAPTURE</entry><entry>The card allows only part of its field of
                                view to be captured. This enables
                                applications to avoid copying all of a large
                                image into memory when only some section is
                                relevant.</entry>
    </row>
    </tbody>
    </tgroup>
    </table>
  <para>
        We set VID_TYPE_CAPTURE so that we are seen as a capture card,
        VID_TYPE_CHROMAKEY so the application knows it is time to draw in virulent
        purple, and VID_TYPE_SCALES because we can be resized.
  </para>
  <para>
        Our setup is fairly similar. This time we also want an interrupt line
        for the 'frame captured' signal. Not all cards have this so some of them
        cannot handle poll().
  </para>
  <programlisting>


static int io = 0x320;
static int irq = 11;

int __init mycamera_init(struct video_init *v)
{
        if(!request_region(io, MY_IO_SIZE, "mycamera"))
        {
                printk(KERN_ERR 
                      "mycamera: port 0x%03X is in use.\n", io);
                return -EBUSY;
        }

        if(video_device_register(&amp;my_camera, 
            VFL_TYPE_GRABBER)==-1) {
                release_region(io, MY_IO_SIZE);
                return -EINVAL;
        }
        return 0;
}

  </programlisting>
  <para>
        This is little changed from the needs of the radio card. We specify
        VFL_TYPE_GRABBER this time as we want to be allocated a /dev/video name.
  </para>
  </sect1>
  <sect1 id="opvid">
  <title>Opening And Closing The Capture Device</title>
  <programlisting>


static int users = 0;

static int camera_open(struct video_device *dev, int flags)
{
        if(users)
                return -EBUSY;
        if(request_irq(irq, camera_irq, 0, "camera", dev)&lt;0)
                return -EBUSY;
        users++;
        return 0;
}


static int camera_close(struct video_device *dev)
{
        users--;
        free_irq(irq, dev);
}
  </programlisting>
  <para>
        The open and close routines are also quite similar. The only real change is
        that we now request an interrupt for the camera device interrupt line. If we
        cannot get the interrupt we report EBUSY to the application and give up.
  </para>
  </sect1>
  <sect1 id="irqvid">
  <title>Interrupt Handling</title>
  <para>
        Our example handler is for an ISA bus device. If it was PCI you would be
        able to share the interrupt and would have set IRQF_SHARED to indicate a
        shared IRQ. We pass the device pointer as the interrupt routine argument. We
        don't need to since we only support one card but doing this will make it
        easier to upgrade the driver for multiple devices in the future.
  </para>
  <para>
        Our interrupt routine needs to do little if we assume the card can simply
        queue one frame to be read after it captures it. 
  </para>
  <programlisting>


static struct wait_queue *capture_wait;
static int capture_ready = 0;

static void camera_irq(int irq, void *dev_id, 
                          struct pt_regs *regs)
{
        capture_ready=1;
        wake_up_interruptible(&amp;capture_wait);
}
  </programlisting>
  <para>
        The interrupt handler is nice and simple for this card as we are assuming
        the card is buffering the frame for us. This means we have little to do but
        wake up        anybody interested. We also set a capture_ready flag, as we may
        capture a frame before an application needs it. In this case we need to know
        that a frame is ready. If we had to collect the frame on the interrupt life
        would be more complex.
  </para>
  <para>
        The two new routines we need to supply are camera_read which returns a
        frame, and camera_poll which waits for a frame to become ready.
  </para>
  <programlisting>


static int camera_poll(struct video_device *dev, 
	struct file *file, struct poll_table *wait)
{
        poll_wait(file, &amp;capture_wait, wait);
        if(capture_read)
                return POLLIN|POLLRDNORM;
        return 0;
}

  </programlisting>
  <para>
        Our wait queue for polling is the capture_wait queue. This will cause the
        task to be woken up by our camera_irq routine. We check capture_read to see
        if there is an image present and if so report that it is readable.
  </para>
  </sect1>
  <sect1 id="rdvid">
  <title>Reading The Video Image</title>
  <programlisting>


static long camera_read(struct video_device *dev, char *buf,
                                unsigned long count)
{
        struct wait_queue wait = { current, NULL };
        u8 *ptr;
        int len;
        int i;

        add_wait_queue(&amp;capture_wait, &amp;wait);

        while(!capture_ready)
        {
                if(file->flags&amp;O_NDELAY)
                {
                        remove_wait_queue(&amp;capture_wait, &amp;wait);
                        current->state = TASK_RUNNING;
                        return -EWOULDBLOCK;
                }
                if(signal_pending(current))
                {
                        remove_wait_queue(&amp;capture_wait, &amp;wait);
                        current->state = TASK_RUNNING;
                        return -ERESTARTSYS;
                }
                schedule();
                current->state = TASK_INTERRUPTIBLE;
        }
        remove_wait_queue(&amp;capture_wait, &amp;wait);
        current->state = TASK_RUNNING;

  </programlisting>
  <para>
        The first thing we have to do is to ensure that the application waits until
        the next frame is ready. The code here is almost identical to the mouse code
        we used earlier in this chapter. It is one of the common building blocks of
        Linux device driver code and probably one which you will find occurs in any
        drivers you write.
  </para>
  <para>
        We wait for a frame to be ready, or for a signal to interrupt our waiting. If a
        signal occurs we need to return from the system call so that the signal can
        be sent to the application itself. We also check to see if the user actually
        wanted to avoid waiting - ie  if they are using non-blocking I/O and have other things 
        to get on with.
  </para>
  <para>
        Next we copy the data from the card to the user application. This is rarely
        as easy as our example makes out. We will add capture_w, and capture_h here
        to hold the width and height of the captured image. We assume the card only
        supports 24bit RGB for now.
  </para>
  <programlisting>



        capture_ready = 0;

        ptr=(u8 *)buf;
        len = capture_w * 3 * capture_h; /* 24bit RGB */

        if(len>count)
                len=count;  /* Doesn't all fit */

        for(i=0; i&lt;len; i++)
        {
                put_user(inb(io+IMAGE_DATA), ptr);
                ptr++;
        }

        hardware_restart_capture();
                
        return i;
}

  </programlisting>
  <para>
        For a real hardware device you would try to avoid the loop with put_user().
        Each call to put_user() has a time overhead checking whether the accesses to user
        space are allowed. It would be better to read a line into a temporary buffer
        then copy this to user space in one go.
  </para>
  <para>
        Having captured the image and put it into user space we can kick the card to
        get the next frame acquired.
  </para>
  </sect1>
  <sect1 id="iocvid">
  <title>Video Ioctl Handling</title>
  <para>
        As with the radio driver the major control interface is via the ioctl()
        function. Video capture devices support the same tuner calls as a radio
        device and also support additional calls to control how the video functions
        are handled. In this simple example the card has no tuners to avoid making
        the code complex. 
  </para>
  <programlisting>



static int camera_ioctl(struct video_device *dev, unsigned int cmd, void *arg)
{
        switch(cmd)
        {
                case VIDIOCGCAP:
                {
                        struct video_capability v;
                        v.type = VID_TYPE_CAPTURE|\
                                 VID_TYPE_CHROMAKEY|\
                                 VID_TYPE_SCALES|\
                                 VID_TYPE_OVERLAY;
                        v.channels = 1;
                        v.audios = 0;
                        v.maxwidth = 640;
                        v.minwidth = 16;
                        v.maxheight = 480;
                        v.minheight = 16;
                        strcpy(v.name, "My Camera");
                        if(copy_to_user(arg, &amp;v, sizeof(v)))
                                return -EFAULT;
                        return 0;
                }


  </programlisting>
  <para>
        The first ioctl we must support and which all video capture and radio
        devices are required to support is VIDIOCGCAP. This behaves exactly the same
        as with a radio device. This time, however, we report the extra capabilities
        we outlined earlier on when defining our video_dev structure.
  </para>
  <para>
        We now set the video flags saying that we support overlay, capture,
        scaling and chromakey. We also report size limits - our smallest image is
        16x16 pixels, our largest is 640x480. 
  </para>
  <para>
        To keep things simple we report no audio and no tuning capabilities at all.
  </para>
  <programlisting>        

                case VIDIOCGCHAN:
                {
                        struct video_channel v;
                        if(copy_from_user(&amp;v, arg, sizeof(v)))
                                return -EFAULT;
                        if(v.channel != 0)
                                return -EINVAL;
                        v.flags = 0;
                        v.tuners = 0;
                        v.type = VIDEO_TYPE_CAMERA;
                        v.norm = VIDEO_MODE_AUTO;
                        strcpy(v.name, "Camera Input");break;
                        if(copy_to_user(&amp;v, arg, sizeof(v)))
                                return -EFAULT;
                        return 0;
                }


  </programlisting>
  <para>
        This follows what is very much the standard way an ioctl handler looks
        in Linux. We copy the data into a kernel space variable and we check that the
        request is valid (in this case that the input is 0). Finally we copy the
        camera info back to the user.
  </para>
  <para>
        The VIDIOCGCHAN ioctl allows a user to ask about video channels (that is
        inputs to the video card). Our example card has a single camera input. The
        fields in the structure are
  </para>
   <table frame="all"><title>struct video_channel fields</title>
   <tgroup cols="2" align="left">
   <tbody>
   <row>

   <entry>channel</entry><entry>The channel number we are selecting</entry>
   </row><row>
   <entry>name</entry><entry>The name for this channel. This is intended
                   to describe the port to the user.
                   Appropriate names are therefore things like
                   "Camera" "SCART input"</entry>
   </row><row>
   <entry>flags</entry><entry>Channel properties</entry>
   </row><row>
   <entry>type</entry><entry>Input type</entry>
   </row><row>
   <entry>norm</entry><entry>The current television encoding being used
                   if relevant for this channel.
    </entry>
    </row>
    </tbody>
    </tgroup>
    </table>
    <table frame="all"><title>struct video_channel flags</title>
    <tgroup cols="2" align="left">
    <tbody>
    <row>
        <entry>VIDEO_VC_TUNER</entry><entry>Channel has a tuner.</entry>
   </row><row>
        <entry>VIDEO_VC_AUDIO</entry><entry>Channel has audio.</entry>
    </row>
    </tbody>
    </tgroup>
    </table>
    <table frame="all"><title>struct video_channel types</title>
    <tgroup cols="2" align="left">
    <tbody>
    <row>
        <entry>VIDEO_TYPE_TV</entry><entry>Television input.</entry>
   </row><row>
        <entry>VIDEO_TYPE_CAMERA</entry><entry>Fixed camera input.</entry>
   </row><row>
	<entry>0</entry><entry>Type is unknown.</entry>
    </row>
    </tbody>
    </tgroup>
    </table>
    <table frame="all"><title>struct video_channel norms</title>
    <tgroup cols="2" align="left">
    <tbody>
    <row>
        <entry>VIDEO_MODE_PAL</entry><entry>PAL encoded Television</entry>
   </row><row>
        <entry>VIDEO_MODE_NTSC</entry><entry>NTSC (US) encoded Television</entry>
   </row><row>
        <entry>VIDEO_MODE_SECAM</entry><entry>SECAM (French) Television </entry>
   </row><row>
        <entry>VIDEO_MODE_AUTO</entry><entry>Automatic switching, or format does not
                                matter</entry>
    </row>
    </tbody>
    </tgroup>
    </table>
    <para>
        The corresponding VIDIOCSCHAN ioctl allows a user to change channel and to
        request the norm is changed - for example to switch between a PAL or an NTSC
        format camera.
  </para>
  <programlisting>


                case VIDIOCSCHAN:
                {
                        struct video_channel v;
                        if(copy_from_user(&amp;v, arg, sizeof(v)))
                                return -EFAULT;
                        if(v.channel != 0)
                                return -EINVAL;
                        if(v.norm != VIDEO_MODE_AUTO)
                                return -EINVAL;
                        return 0;
                }


  </programlisting>
  <para>
        The implementation of this call in our driver is remarkably easy. Because we
        are assuming fixed format hardware we need only check that the user has not
        tried to change anything. 
  </para>
  <para>
        The user also needs to be able to configure and adjust the picture they are
        seeing. This is much like adjusting a television set. A user application
        also needs to know the palette being used so that it knows how to display
        the image that has been captured. The VIDIOCGPICT and VIDIOCSPICT ioctl
        calls provide this information.
  </para>
  <programlisting>


                case VIDIOCGPICT
                {
                        struct video_picture v;
                        v.brightness = hardware_brightness();
                        v.hue = hardware_hue();
                        v.colour = hardware_saturation();
                        v.contrast = hardware_brightness();
                        /* Not settable */
                        v.whiteness = 32768;
                        v.depth = 24;           /* 24bit */
                        v.palette = VIDEO_PALETTE_RGB24;
                        if(copy_to_user(&amp;v, arg, 
                             sizeof(v)))
                                return -EFAULT;
                        return 0;
                }


  </programlisting>
  <para>
        The brightness, hue, color, and contrast provide the picture controls that
        are akin to a conventional television. Whiteness provides additional
        control for greyscale images. All of these values are scaled between 0-65535
        and have 32768 as the mid point setting. The scaling means that applications
        do not have to worry about the capability range of the hardware but can let
        it make a best effort attempt.
  </para>
  <para>
        Our depth is 24, as this is in bits. We will be returning RGB24 format. This
        has one byte of red, then one of green, then one of blue. This then repeats
        for every other pixel in the image. The other common formats the interface 
        defines are
  </para>
   <table frame="all"><title>Framebuffer Encodings</title>
   <tgroup cols="2" align="left">
   <tbody>
   <row>
   <entry>GREY</entry><entry>Linear greyscale. This is for simple cameras and the
                        like</entry>
   </row><row>
   <entry>RGB565</entry><entry>The top 5 bits hold 32 red levels, the next six bits
                        hold green and the low 5 bits hold blue. </entry>
   </row><row>
   <entry>RGB555</entry><entry>The top bit is clear. The red green and blue levels
                        each occupy five bits.</entry>
    </row>
    </tbody>
    </tgroup>
    </table>
  <para>
        Additional modes are support for YUV capture formats. These are common for
        TV and video conferencing applications.
  </para>
  <para>
        The VIDIOCSPICT ioctl allows a user to set some of the picture parameters.
        Exactly which ones are supported depends heavily on the card itself. It is
        possible to support many modes and effects in software. In general doing
        this in the kernel is a bad idea. Video capture is a performance-sensitive
        application and the programs can often do better if they aren't being
        'helped' by an overkeen driver writer. Thus for our device we will report
        RGB24 only and refuse to allow a change.
  </para>
  <programlisting>


                case VIDIOCSPICT:
                {
                        struct video_picture v;
                        if(copy_from_user(&amp;v, arg, sizeof(v)))
                                return -EFAULT;
                        if(v.depth!=24 || 
                           v.palette != VIDEO_PALETTE_RGB24)
                                return -EINVAL;
                        set_hardware_brightness(v.brightness);
                        set_hardware_hue(v.hue);
                        set_hardware_saturation(v.colour);
                        set_hardware_brightness(v.contrast);
                        return 0;
                }


  </programlisting>
  <para>
        We check the user has not tried to change the palette or the depth. We do
        not want to carry out some of the changes and then return an error. This may
        confuse the application which will be assuming no change occurred.
  </para>
  <para>
        In much the same way as you need to be able to set the picture controls to
        get the right capture images, many cards need to know what they are
        displaying onto when generating overlay output. In some cases getting this
        wrong even makes a nasty mess or may crash the computer. For that reason
        the VIDIOCSBUF ioctl used to set up the frame buffer information may well
        only be usable by root.
  </para>
  <para>
        We will assume our card is one of the old ISA devices with feature connector
        and only supports a couple of standard video modes. Very common for older
        cards although the PCI devices are way smarter than this.
  </para>
  <programlisting>


static struct video_buffer capture_fb;

                case VIDIOCGFBUF:
                {
                        if(copy_to_user(arg, &amp;capture_fb, 
                             sizeof(capture_fb)))
                                return -EFAULT;
                        return 0;
                        
                }


  </programlisting>
  <para>
        We keep the frame buffer information in the format the ioctl uses. This
        makes it nice and easy to work with in the ioctl calls.
  </para>
  <programlisting>

                case VIDIOCSFBUF:
                {
                        struct video_buffer v;

                        if(!capable(CAP_SYS_ADMIN))
                                return -EPERM;

                        if(copy_from_user(&amp;v, arg, sizeof(v)))
                                return -EFAULT;
                        if(v.width!=320 &amp;&amp; v.width!=640)
                                return -EINVAL;
                        if(v.height!=200 &amp;&amp; v.height!=240 
                                &amp;&amp; v.height!=400
                                &amp;&amp; v.height !=480)
                                return -EINVAL;
                        memcpy(&amp;capture_fb, &amp;v, sizeof(v));
                        hardware_set_fb(&amp;v);
                        return 0;
                }



  </programlisting>
  <para>
        The capable() function checks a user has the required capability. The Linux
        operating system has a set of about 30 capabilities indicating privileged
        access to services. The default set up gives the superuser (uid 0) all of
        them and nobody else has any.
  </para>
  <para>
        We check that the user has the SYS_ADMIN capability, that is they are
        allowed to operate as the machine administrator. We don't want anyone but
        the administrator making a mess of the display.
  </para>
  <para>
        Next we check for standard PC video modes (320 or 640 wide with either
        EGA or VGA depths). If the mode is not a standard video mode we reject it as
        not supported by our card. If the mode is acceptable we save it so that
        VIDIOCFBUF will give the right answer next time it is called.  The
        hardware_set_fb() function is some undescribed card specific function to
        program the card for the desired mode.
  </para>
  <para>
        Before the driver can display an overlay window it needs to know where the
        window should be placed, and also how large it should be. If the card
        supports clipping it needs to know which rectangles to omit from the
        display. The video_window structure is used to describe the way the image 
        should be displayed. 
   </para>
   <table frame="all"><title>struct video_window fields</title>
   <tgroup cols="2" align="left">
   <tbody>
   <row>
        <entry>width</entry><entry>The width in pixels of the desired image. The card
                        may use a smaller size if this size is not available</entry>
	</row><row>
        <entry>height</entry><entry>The height of the image. The card may use a smaller
                        size if this size is not available.</entry>
	</row><row>
        <entry>x</entry><entry>   The X position of the top left of the window. This
                        is in pixels relative to the left hand edge of the
                        picture. Not all cards can display images aligned on
                        any pixel boundary. If the position is unsuitable
                        the card adjusts the image right and reduces the
                        width.</entry>
	</row><row>
        <entry>y</entry><entry>   The Y position of the top left of the window. This
                        is counted in pixels relative to the top edge of the
                        picture. As with the width if the card cannot
                        display  starting on this line it will adjust the
                        values.</entry>
	</row><row>
        <entry>chromakey</entry><entry>The colour (expressed in RGB32 format) for the
                        chromakey colour if chroma keying is being used. </entry>
	</row><row>
        <entry>clips</entry><entry>An array of rectangles that must not be drawn
			over.</entry>
	</row><row>
        <entry>clipcount</entry><entry>The number of clips in this array.</entry>
    </row>
    </tbody>
    </tgroup>
    </table>
    <para>
        Each clip is a struct video_clip which has the following fields
   </para>
   <table frame="all"><title>video_clip fields</title>
   <tgroup cols="2" align="left">
   <tbody>
   <row>
        <entry>x, y</entry><entry>Co-ordinates relative to the display</entry>
	</row><row>
        <entry>width, height</entry><entry>Width and height in pixels</entry>
	</row><row>
        <entry>next</entry><entry>A spare field for the application to use</entry>
    </row>
    </tbody>
    </tgroup>
    </table>
    <para>
        The driver is required to ensure it always draws in the area requested or a        smaller area, and that it never draws in any of the areas that are clipped.
        This may well mean it has to leave alone. small areas the application wished to be
        drawn.
  </para>
  <para>
        Our example card uses chromakey so does not have to address most of the
        clipping.  We will add a video_window structure to our global variables to
        remember our parameters, as we did with the frame buffer.
  </para>
  <programlisting>


                case VIDIOCGWIN:
                {
                        if(copy_to_user(arg, &amp;capture_win, 
                            sizeof(capture_win)))
                                return -EFAULT;
                        return 0;
                }


                case VIDIOCSWIN:
                {
                        struct video_window v;
                        if(copy_from_user(&amp;v, arg, sizeof(v)))
                                return -EFAULT;
                        if(v.width &gt; 640 || v.height &gt; 480)
                                return -EINVAL;
                        if(v.width &lt; 16 || v.height &lt; 16)
                                return -EINVAL;
                        hardware_set_key(v.chromakey);
                        hardware_set_window(v);
                        memcpy(&amp;capture_win, &amp;v, sizeof(v));
                        capture_w = v.width;
                        capture_h = v.height;
                        return 0;
                }


  </programlisting>
  <para>
        Because we are using Chromakey our setup is fairly simple. Mostly we have to
        check the values are sane and load them into the capture card.
  </para>
  <para>
        With all the setup done we can now turn on the actual capture/overlay. This
        is done with the VIDIOCCAPTURE ioctl. This takes a single integer argument
        where 0 is on and 1 is off.
  </para>
  <programlisting>


                case VIDIOCCAPTURE:
                {
                        int v;
                        if(get_user(v, (int *)arg))
                                return -EFAULT;
                        if(v==0)
                                hardware_capture_off();
                        else
                        {
                                if(capture_fb.width == 0 
                                    || capture_w == 0)
                                        return -EINVAL;
                                hardware_capture_on();
                        }
                        return 0;
                }


  </programlisting>
  <para>
        We grab the flag from user space and either enable or disable according to
        its value. There is one small corner case we have to consider here. Suppose
        that the capture was requested before the video window or the frame buffer
        had been set up. In those cases there will be unconfigured fields in our
        card data, as well as unconfigured hardware settings. We check for this case and
        return an error if the frame buffer or the capture window width is zero.
  </para>
  <programlisting>


                default:
                        return -ENOIOCTLCMD;
        }
}
  </programlisting>
  <para>

        We don't need to support any other ioctls, so if we get this far, it is time
        to tell the video layer that we don't now what the user is talking about.
  </para>
  </sect1>
  <sect1 id="endvid">
  <title>Other Functionality</title>
  <para>
        The Video4Linux layer supports additional features, including a high
        performance mmap() based capture mode and capturing part of the image. 
        These features are out of the scope of the book.  You should however have enough 
        example code to implement most simple video4linux devices for radio and TV
        cards.
  </para>
  </sect1>
  </chapter>
  <chapter id="bugs">
     <title>Known Bugs And Assumptions</title>
  <para>
  <variablelist>
    <varlistentry><term>Multiple Opens</term>
    <listitem>
    <para>
        The driver assumes multiple opens should not be allowed. A driver
        can work around this but not cleanly.
    </para>
    </listitem></varlistentry>

    <varlistentry><term>API Deficiencies</term>
    <listitem>
    <para>
        The existing API poorly reflects compression capable devices. There
        are plans afoot to merge V4L, V4L2 and some other ideas into a
        better interface.
    </para>
    </listitem></varlistentry>
  </variablelist>

  </para>
  </chapter>

  <chapter id="pubfunctions">
     <title>Public Functions Provided</title>
!Edrivers/media/video/videodev.c
  </chapter>

</book>
