| Mauro Carvalho Chehab | 8e080c2 | 2009-09-13 22:16:04 -0300 | [diff] [blame] | 1 | <title>Introduction</title> | 
|  | 2 |  | 
|  | 3 | <section id="requisites"> | 
|  | 4 | <title>What you need to know</title> | 
|  | 5 |  | 
|  | 6 | <para>The reader of this document is required to have some knowledge in | 
|  | 7 | the area of digital video broadcasting (DVB) and should be familiar with | 
|  | 8 | part I of the MPEG2 specification ISO/IEC 13818 (aka ITU-T H.222), i.e | 
|  | 9 | you should know what a program/transport stream (PS/TS) is and what is | 
|  | 10 | meant by a packetized elementary stream (PES) or an I-frame.</para> | 
|  | 11 |  | 
|  | 12 | <para>Various DVB standards documents are available from | 
| Mauro Carvalho Chehab | 62b122a | 2009-09-15 21:03:45 -0300 | [diff] [blame] | 13 | <ulink url="http://www.dvb.org" /> and/or | 
|  | 14 | <ulink url="http://www.etsi.org" />.</para> | 
| Mauro Carvalho Chehab | 8e080c2 | 2009-09-13 22:16:04 -0300 | [diff] [blame] | 15 |  | 
|  | 16 | <para>It is also necessary to know how to access unix/linux devices and | 
|  | 17 | how to use ioctl calls. This also includes the knowledge of C or C++. | 
|  | 18 | </para> | 
|  | 19 | </section> | 
|  | 20 |  | 
|  | 21 | <section id="history"> | 
|  | 22 | <title>History</title> | 
|  | 23 |  | 
|  | 24 | <para>The first API for DVB cards we used at Convergence in late 1999 | 
|  | 25 | was an extension of the Video4Linux API which was primarily developed | 
|  | 26 | for frame grabber cards. As such it was not really well suited to be | 
|  | 27 | used for DVB cards and their new features like recording MPEG streams | 
|  | 28 | and filtering several section and PES data streams at the same time. | 
|  | 29 | </para> | 
|  | 30 |  | 
|  | 31 | <para>In early 2000, we were approached by Nokia with a proposal for a | 
|  | 32 | new standard Linux DVB API. As a commitment to the development of | 
|  | 33 | terminals based on open standards, Nokia and Convergence made it | 
| Mauro Carvalho Chehab | 62b122a | 2009-09-15 21:03:45 -0300 | [diff] [blame] | 34 | available to all Linux developers and published it on | 
|  | 35 | <ulink url="http://www.linuxtv.org/" /> in September 2000. | 
| Mauro Carvalho Chehab | 8e080c2 | 2009-09-13 22:16:04 -0300 | [diff] [blame] | 36 | Convergence is the maintainer of the Linux DVB API. Together with the | 
|  | 37 | LinuxTV community (i.e. you, the reader of this document), the Linux DVB | 
|  | 38 | API will be constantly reviewed and improved. With the Linux driver for | 
|  | 39 | the Siemens/Hauppauge DVB PCI card Convergence provides a first | 
|  | 40 | implementation of the Linux DVB API.</para> | 
|  | 41 | </section> | 
|  | 42 |  | 
|  | 43 | <section id="overview"> | 
|  | 44 | <title>Overview</title> | 
|  | 45 |  | 
|  | 46 | <figure id="stb_components"> | 
|  | 47 | <title>Components of a DVB card/STB</title> | 
|  | 48 | <mediaobject> | 
|  | 49 | <imageobject> | 
|  | 50 | <imagedata fileref="dvbstb.pdf" format="PS" /> | 
|  | 51 | </imageobject> | 
|  | 52 | <imageobject> | 
|  | 53 | <imagedata fileref="dvbstb.png" format="PNG" /> | 
|  | 54 | </imageobject> | 
|  | 55 | </mediaobject> | 
|  | 56 | </figure> | 
|  | 57 |  | 
|  | 58 | <para>A DVB PCI card or DVB set-top-box (STB) usually consists of the | 
|  | 59 | following main hardware components: </para> | 
|  | 60 |  | 
|  | 61 | <itemizedlist> | 
|  | 62 | <listitem> | 
|  | 63 |  | 
|  | 64 | <para>Frontend consisting of tuner and DVB demodulator</para> | 
|  | 65 |  | 
|  | 66 | <para>Here the raw signal reaches the DVB hardware from a satellite dish | 
|  | 67 | or antenna or directly from cable. The frontend down-converts and | 
|  | 68 | demodulates this signal into an MPEG transport stream (TS). In case of a | 
|  | 69 | satellite frontend, this includes a facility for satellite equipment | 
|  | 70 | control (SEC), which allows control of LNB polarization, multi feed | 
|  | 71 | switches or dish rotors.</para> | 
|  | 72 |  | 
|  | 73 | </listitem> | 
|  | 74 | <listitem> | 
|  | 75 |  | 
|  | 76 | <para>Conditional Access (CA) hardware like CI adapters and smartcard slots | 
|  | 77 | </para> | 
|  | 78 |  | 
|  | 79 | <para>The complete TS is passed through the CA hardware. Programs to | 
|  | 80 | which the user has access (controlled by the smart card) are decoded in | 
|  | 81 | real time and re-inserted into the TS.</para> | 
|  | 82 |  | 
|  | 83 | </listitem> | 
|  | 84 | <listitem> | 
|  | 85 | <para>Demultiplexer which filters the incoming DVB stream</para> | 
|  | 86 |  | 
|  | 87 | <para>The demultiplexer splits the TS into its components like audio and | 
|  | 88 | video streams. Besides usually several of such audio and video streams | 
|  | 89 | it also contains data streams with information about the programs | 
|  | 90 | offered in this or other streams of the same provider.</para> | 
|  | 91 |  | 
|  | 92 | </listitem> | 
|  | 93 | <listitem> | 
|  | 94 |  | 
|  | 95 | <para>MPEG2 audio and video decoder</para> | 
|  | 96 |  | 
|  | 97 | <para>The main targets of the demultiplexer are the MPEG2 audio and | 
|  | 98 | video decoders. After decoding they pass on the uncompressed audio and | 
|  | 99 | video to the computer screen or (through a PAL/NTSC encoder) to a TV | 
|  | 100 | set.</para> | 
|  | 101 |  | 
|  | 102 |  | 
|  | 103 | </listitem> | 
|  | 104 | </itemizedlist> | 
|  | 105 |  | 
|  | 106 | <para><xref linkend="stb_components" /> shows a crude schematic of the control and data flow | 
|  | 107 | between those components.</para> | 
|  | 108 |  | 
|  | 109 | <para>On a DVB PCI card not all of these have to be present since some | 
|  | 110 | functionality can be provided by the main CPU of the PC (e.g. MPEG | 
|  | 111 | picture and sound decoding) or is not needed (e.g. for data-only uses | 
|  | 112 | like “internet over satellite”). Also not every card or STB | 
|  | 113 | provides conditional access hardware.</para> | 
|  | 114 |  | 
|  | 115 | </section> | 
|  | 116 |  | 
|  | 117 | <section id="dvb_devices"> | 
|  | 118 | <title>Linux DVB Devices</title> | 
|  | 119 |  | 
|  | 120 | <para>The Linux DVB API lets you control these hardware components | 
|  | 121 | through currently six Unix-style character devices for video, audio, | 
|  | 122 | frontend, demux, CA and IP-over-DVB networking. The video and audio | 
|  | 123 | devices control the MPEG2 decoder hardware, the frontend device the | 
|  | 124 | tuner and the DVB demodulator. The demux device gives you control over | 
|  | 125 | the PES and section filters of the hardware. If the hardware does not | 
|  | 126 | support filtering these filters can be implemented in software. Finally, | 
|  | 127 | the CA device controls all the conditional access capabilities of the | 
|  | 128 | hardware. It can depend on the individual security requirements of the | 
|  | 129 | platform, if and how many of the CA functions are made available to the | 
|  | 130 | application through this device.</para> | 
|  | 131 |  | 
|  | 132 | <para>All devices can be found in the <emphasis role="tt">/dev</emphasis> | 
|  | 133 | tree under <emphasis role="tt">/dev/dvb</emphasis>. The individual devices | 
|  | 134 | are called:</para> | 
|  | 135 |  | 
|  | 136 | <itemizedlist> | 
|  | 137 | <listitem> | 
|  | 138 |  | 
|  | 139 | <para><emphasis role="tt">/dev/dvb/adapterN/audioM</emphasis>,</para> | 
|  | 140 | </listitem> | 
|  | 141 | <listitem> | 
|  | 142 | <para><emphasis role="tt">/dev/dvb/adapterN/videoM</emphasis>,</para> | 
|  | 143 | </listitem> | 
|  | 144 | <listitem> | 
|  | 145 | <para><emphasis role="tt">/dev/dvb/adapterN/frontendM</emphasis>,</para> | 
|  | 146 | </listitem> | 
|  | 147 | <listitem> | 
|  | 148 |  | 
|  | 149 | <para><emphasis role="tt">/dev/dvb/adapterN/netM</emphasis>,</para> | 
|  | 150 | </listitem> | 
|  | 151 | <listitem> | 
|  | 152 |  | 
|  | 153 | <para><emphasis role="tt">/dev/dvb/adapterN/demuxM</emphasis>,</para> | 
|  | 154 | </listitem> | 
|  | 155 | <listitem> | 
|  | 156 |  | 
|  | 157 | <para><emphasis role="tt">/dev/dvb/adapterN/caM</emphasis>,</para></listitem></itemizedlist> | 
|  | 158 |  | 
|  | 159 | <para>where N enumerates the DVB PCI cards in a system starting | 
|  | 160 | from 0, and M enumerates the devices of each type within each | 
|  | 161 | adapter, starting from 0, too. We will omit the “<emphasis | 
|  | 162 | role="tt">/dev/dvb/adapterN/</emphasis>” in the further dicussion | 
|  | 163 | of these devices. The naming scheme for the devices is the same wheter | 
|  | 164 | devfs is used or not.</para> | 
|  | 165 |  | 
|  | 166 | <para>More details about the data structures and function calls of all | 
|  | 167 | the devices are described in the following chapters.</para> | 
|  | 168 |  | 
|  | 169 | </section> | 
|  | 170 |  | 
|  | 171 | <section id="include_files"> | 
|  | 172 | <title>API include files</title> | 
|  | 173 |  | 
|  | 174 | <para>For each of the DVB devices a corresponding include file exists. | 
|  | 175 | The DVB API include files should be included in application sources with | 
|  | 176 | a partial path like:</para> | 
|  | 177 |  | 
|  | 178 |  | 
|  | 179 | <programlisting> | 
|  | 180 | #include <linux/dvb/frontend.h> | 
|  | 181 | </programlisting> | 
|  | 182 |  | 
|  | 183 | <para>To enable applications to support different API version, an | 
|  | 184 | additional include file <emphasis | 
|  | 185 | role="tt">linux/dvb/version.h</emphasis> exists, which defines the | 
|  | 186 | constant <emphasis role="tt">DVB_API_VERSION</emphasis>. This document | 
|  | 187 | describes <emphasis role="tt">DVB_API_VERSION 3</emphasis>. | 
|  | 188 | </para> | 
|  | 189 |  | 
|  | 190 | </section> | 
|  | 191 |  |