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