diff options
author | Mauro Carvalho Chehab <mchehab@redhat.com> | 2009-09-13 21:16:04 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2009-09-18 22:47:55 -0400 |
commit | 8e080c2e6cadada82a6b520e0c23a1cb974822d5 (patch) | |
tree | 991450ff1abba98e5313906478c33816a202ccab /Documentation/DocBook/dvb | |
parent | f4e96deb4513d044653027d4921fd7592195503a (diff) |
V4L/DVB (12761): DocBook: add media API specs
The V4L and DVB API's are there for a long time. however, up to now,
no efforts were done to merge them to kernel DocBook.
This patch adds the current versions of the specs as an unique compendium.
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'Documentation/DocBook/dvb')
-rw-r--r-- | Documentation/DocBook/dvb/audio.xml | 1473 | ||||
-rw-r--r-- | Documentation/DocBook/dvb/ca.xml | 221 | ||||
-rw-r--r-- | Documentation/DocBook/dvb/demux.xml | 973 | ||||
-rw-r--r-- | Documentation/DocBook/dvb/dvbapi.xml | 79 | ||||
-rw-r--r-- | Documentation/DocBook/dvb/dvbstb.pdf | bin | 0 -> 1881 bytes | |||
-rw-r--r-- | Documentation/DocBook/dvb/dvbstb.png | bin | 0 -> 22655 bytes | |||
-rw-r--r-- | Documentation/DocBook/dvb/examples.xml | 365 | ||||
-rw-r--r-- | Documentation/DocBook/dvb/frontend.xml | 1765 | ||||
-rw-r--r-- | Documentation/DocBook/dvb/intro.xml | 191 | ||||
-rw-r--r-- | Documentation/DocBook/dvb/kdapi.xml | 2309 | ||||
-rw-r--r-- | Documentation/DocBook/dvb/net.xml | 12 | ||||
-rw-r--r-- | Documentation/DocBook/dvb/video.xml | 1971 |
12 files changed, 9359 insertions, 0 deletions
diff --git a/Documentation/DocBook/dvb/audio.xml b/Documentation/DocBook/dvb/audio.xml new file mode 100644 index 000000000000..eeb96b8a0864 --- /dev/null +++ b/Documentation/DocBook/dvb/audio.xml | |||
@@ -0,0 +1,1473 @@ | |||
1 | <title>DVB Audio Device</title> | ||
2 | <para>The DVB audio device controls the MPEG2 audio decoder of the DVB hardware. It | ||
3 | can be accessed through <emphasis role="tt">/dev/dvb/adapter0/audio0</emphasis>. Data types and and | ||
4 | ioctl definitions can be accessed by including <emphasis role="tt">linux/dvb/video.h</emphasis> in your | ||
5 | application. | ||
6 | </para> | ||
7 | <para>Please note that some DVB cards don’t have their own MPEG decoder, which results in | ||
8 | the omission of the audio and video device. | ||
9 | </para> | ||
10 | |||
11 | <section id="audio_data_types"> | ||
12 | <title>Audio Data Types</title> | ||
13 | <para>This section describes the structures, data types and defines used when talking to the | ||
14 | audio device. | ||
15 | </para> | ||
16 | |||
17 | <section id="audio_stream_source_t"> | ||
18 | <title>audio_stream_source_t</title> | ||
19 | <para>The audio stream source is set through the AUDIO_SELECT_SOURCE call and can take | ||
20 | the following values, depending on whether we are replaying from an internal (demux) or | ||
21 | external (user write) source. | ||
22 | </para> | ||
23 | <programlisting> | ||
24 | typedef enum { | ||
25 | AUDIO_SOURCE_DEMUX, | ||
26 | AUDIO_SOURCE_MEMORY | ||
27 | } audio_stream_source_t; | ||
28 | </programlisting> | ||
29 | <para>AUDIO_SOURCE_DEMUX selects the demultiplexer (fed either by the frontend or the | ||
30 | DVR device) as the source of the video stream. If AUDIO_SOURCE_MEMORY | ||
31 | is selected the stream comes from the application through the <emphasis role="tt">write()</emphasis> system | ||
32 | call. | ||
33 | </para> | ||
34 | |||
35 | </section> | ||
36 | <section id="audio_play_state_t"> | ||
37 | <title>audio_play_state_t</title> | ||
38 | <para>The following values can be returned by the AUDIO_GET_STATUS call representing the | ||
39 | state of audio playback. | ||
40 | </para> | ||
41 | <programlisting> | ||
42 | typedef enum { | ||
43 | AUDIO_STOPPED, | ||
44 | AUDIO_PLAYING, | ||
45 | AUDIO_PAUSED | ||
46 | } audio_play_state_t; | ||
47 | </programlisting> | ||
48 | |||
49 | </section> | ||
50 | <section id="audio_channel_select_t"> | ||
51 | <title>audio_channel_select_t</title> | ||
52 | <para>The audio channel selected via AUDIO_CHANNEL_SELECT is determined by the | ||
53 | following values. | ||
54 | </para> | ||
55 | <programlisting> | ||
56 | typedef enum { | ||
57 | AUDIO_STEREO, | ||
58 | AUDIO_MONO_LEFT, | ||
59 | AUDIO_MONO_RIGHT, | ||
60 | } audio_channel_select_t; | ||
61 | </programlisting> | ||
62 | |||
63 | </section> | ||
64 | <section id="struct_audio_status"> | ||
65 | <title>struct audio_status</title> | ||
66 | <para>The AUDIO_GET_STATUS call returns the following structure informing about various | ||
67 | states of the playback operation. | ||
68 | </para> | ||
69 | <programlisting> | ||
70 | typedef struct audio_status { | ||
71 | boolean AV_sync_state; | ||
72 | boolean mute_state; | ||
73 | audio_play_state_t play_state; | ||
74 | audio_stream_source_t stream_source; | ||
75 | audio_channel_select_t channel_select; | ||
76 | boolean bypass_mode; | ||
77 | } audio_status_t; | ||
78 | </programlisting> | ||
79 | |||
80 | </section> | ||
81 | <section id="struct_audio_mixer"> | ||
82 | <title>struct audio_mixer</title> | ||
83 | <para>The following structure is used by the AUDIO_SET_MIXER call to set the audio | ||
84 | volume. | ||
85 | </para> | ||
86 | <programlisting> | ||
87 | typedef struct audio_mixer { | ||
88 | unsigned int volume_left; | ||
89 | unsigned int volume_right; | ||
90 | } audio_mixer_t; | ||
91 | </programlisting> | ||
92 | |||
93 | </section> | ||
94 | <section id="audio_encodings"> | ||
95 | <title>audio encodings</title> | ||
96 | <para>A call to AUDIO_GET_CAPABILITIES returns an unsigned integer with the following | ||
97 | bits set according to the hardwares capabilities. | ||
98 | </para> | ||
99 | <programlisting> | ||
100 | #define AUDIO_CAP_DTS 1 | ||
101 | #define AUDIO_CAP_LPCM 2 | ||
102 | #define AUDIO_CAP_MP1 4 | ||
103 | #define AUDIO_CAP_MP2 8 | ||
104 | #define AUDIO_CAP_MP3 16 | ||
105 | #define AUDIO_CAP_AAC 32 | ||
106 | #define AUDIO_CAP_OGG 64 | ||
107 | #define AUDIO_CAP_SDDS 128 | ||
108 | #define AUDIO_CAP_AC3 256 | ||
109 | </programlisting> | ||
110 | |||
111 | </section> | ||
112 | <section id="struct_audio_karaoke"> | ||
113 | <title>struct audio_karaoke</title> | ||
114 | <para>The ioctl AUDIO_SET_KARAOKE uses the following format: | ||
115 | </para> | ||
116 | <programlisting> | ||
117 | typedef | ||
118 | struct audio_karaoke{ | ||
119 | int vocal1; | ||
120 | int vocal2; | ||
121 | int melody; | ||
122 | } audio_karaoke_t; | ||
123 | </programlisting> | ||
124 | <para>If Vocal1 or Vocal2 are non-zero, they get mixed into left and right t at 70% each. If both, | ||
125 | Vocal1 and Vocal2 are non-zero, Vocal1 gets mixed into the left channel and Vocal2 into the | ||
126 | right channel at 100% each. Ff Melody is non-zero, the melody channel gets mixed into left | ||
127 | and right. | ||
128 | </para> | ||
129 | |||
130 | </section> | ||
131 | <section id="audio_attributes"> | ||
132 | <title>audio attributes</title> | ||
133 | <para>The following attributes can be set by a call to AUDIO_SET_ATTRIBUTES: | ||
134 | </para> | ||
135 | <programlisting> | ||
136 | typedef uint16_t audio_attributes_t; | ||
137 | /⋆ bits: descr. ⋆/ | ||
138 | /⋆ 15-13 audio coding mode (0=ac3, 2=mpeg1, 3=mpeg2ext, 4=LPCM, 6=DTS, ⋆/ | ||
139 | /⋆ 12 multichannel extension ⋆/ | ||
140 | /⋆ 11-10 audio type (0=not spec, 1=language included) ⋆/ | ||
141 | /⋆ 9- 8 audio application mode (0=not spec, 1=karaoke, 2=surround) ⋆/ | ||
142 | /⋆ 7- 6 Quantization / DRC (mpeg audio: 1=DRC exists)(lpcm: 0=16bit, ⋆/ | ||
143 | /⋆ 5- 4 Sample frequency fs (0=48kHz, 1=96kHz) ⋆/ | ||
144 | /⋆ 2- 0 number of audio channels (n+1 channels) ⋆/ | ||
145 | </programlisting> | ||
146 | </section></section> | ||
147 | <section id="audio_function_calls"> | ||
148 | <title>Audio Function Calls</title> | ||
149 | |||
150 | |||
151 | <section id="audio_fopen"> | ||
152 | <title>open()</title> | ||
153 | <para>DESCRIPTION | ||
154 | </para> | ||
155 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
156 | align="char"> | ||
157 | <para>This system call opens a named audio device (e.g. /dev/dvb/adapter0/audio0) | ||
158 | for subsequent use. When an open() call has succeeded, the device will be ready | ||
159 | for use. The significance of blocking or non-blocking mode is described in the | ||
160 | documentation for functions where there is a difference. It does not affect the | ||
161 | semantics of the open() call itself. A device opened in blocking mode can later | ||
162 | be put into non-blocking mode (and vice versa) using the F_SETFL command | ||
163 | of the fcntl system call. This is a standard system call, documented in the Linux | ||
164 | manual page for fcntl. Only one user can open the Audio Device in O_RDWR | ||
165 | mode. All other attempts to open the device in this mode will fail, and an error | ||
166 | code will be returned. If the Audio Device is opened in O_RDONLY mode, the | ||
167 | only ioctl call that can be used is AUDIO_GET_STATUS. All other call will | ||
168 | return with an error code.</para> | ||
169 | </entry> | ||
170 | </row></tbody></tgroup></informaltable> | ||
171 | <para>SYNOPSIS | ||
172 | </para> | ||
173 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
174 | align="char"> | ||
175 | <para>int open(const char ⋆deviceName, int flags);</para> | ||
176 | </entry> | ||
177 | </row></tbody></tgroup></informaltable> | ||
178 | <para>PARAMETERS | ||
179 | </para> | ||
180 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
181 | align="char"> | ||
182 | <para>const char | ||
183 | *deviceName</para> | ||
184 | </entry><entry | ||
185 | align="char"> | ||
186 | <para>Name of specific audio device.</para> | ||
187 | </entry> | ||
188 | </row><row><entry | ||
189 | align="char"> | ||
190 | <para>int flags</para> | ||
191 | </entry><entry | ||
192 | align="char"> | ||
193 | <para>A bit-wise OR of the following flags:</para> | ||
194 | </entry> | ||
195 | </row><row><entry | ||
196 | align="char"> | ||
197 | </entry><entry | ||
198 | align="char"> | ||
199 | <para>O_RDONLY read-only access</para> | ||
200 | </entry> | ||
201 | </row><row><entry | ||
202 | align="char"> | ||
203 | </entry><entry | ||
204 | align="char"> | ||
205 | <para>O_RDWR read/write access</para> | ||
206 | </entry> | ||
207 | </row><row><entry | ||
208 | align="char"> | ||
209 | </entry><entry | ||
210 | align="char"> | ||
211 | <para>O_NONBLOCK open in non-blocking mode</para> | ||
212 | </entry> | ||
213 | </row><row><entry | ||
214 | align="char"> | ||
215 | </entry><entry | ||
216 | align="char"> | ||
217 | <para>(blocking mode is the default)</para> | ||
218 | </entry> | ||
219 | </row></tbody></tgroup></informaltable> | ||
220 | <para>ERRORS | ||
221 | </para> | ||
222 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
223 | align="char"> | ||
224 | <para>ENODEV</para> | ||
225 | </entry><entry | ||
226 | align="char"> | ||
227 | <para>Device driver not loaded/available.</para> | ||
228 | </entry> | ||
229 | </row><row><entry | ||
230 | align="char"> | ||
231 | <para>EINTERNAL</para> | ||
232 | </entry><entry | ||
233 | align="char"> | ||
234 | <para>Internal error.</para> | ||
235 | </entry> | ||
236 | </row><row><entry | ||
237 | align="char"> | ||
238 | <para>EBUSY</para> | ||
239 | </entry><entry | ||
240 | align="char"> | ||
241 | <para>Device or resource busy.</para> | ||
242 | </entry> | ||
243 | </row><row><entry | ||
244 | align="char"> | ||
245 | <para>EINVAL</para> | ||
246 | </entry><entry | ||
247 | align="char"> | ||
248 | <para>Invalid argument.</para> | ||
249 | </entry> | ||
250 | </row></tbody></tgroup></informaltable> | ||
251 | |||
252 | </section> | ||
253 | <section id="audio_fclose"> | ||
254 | <title>close()</title> | ||
255 | <para>DESCRIPTION | ||
256 | </para> | ||
257 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
258 | align="char"> | ||
259 | <para>This system call closes a previously opened audio device.</para> | ||
260 | </entry> | ||
261 | </row></tbody></tgroup></informaltable> | ||
262 | <para>SYNOPSIS | ||
263 | </para> | ||
264 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
265 | align="char"> | ||
266 | <para>int close(int fd);</para> | ||
267 | </entry> | ||
268 | </row></tbody></tgroup></informaltable> | ||
269 | <para>PARAMETERS | ||
270 | </para> | ||
271 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
272 | align="char"> | ||
273 | <para>int fd</para> | ||
274 | </entry><entry | ||
275 | align="char"> | ||
276 | <para>File descriptor returned by a previous call to open().</para> | ||
277 | </entry> | ||
278 | </row></tbody></tgroup></informaltable> | ||
279 | <para>ERRORS | ||
280 | </para> | ||
281 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
282 | align="char"> | ||
283 | <para>EBADF</para> | ||
284 | </entry><entry | ||
285 | align="char"> | ||
286 | <para>fd is not a valid open file descriptor.</para> | ||
287 | </entry> | ||
288 | </row></tbody></tgroup></informaltable> | ||
289 | |||
290 | </section> | ||
291 | <section id="audio_fwrite"> | ||
292 | <title>write()</title> | ||
293 | <para>DESCRIPTION | ||
294 | </para> | ||
295 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
296 | align="char"> | ||
297 | <para>This system call can only be used if AUDIO_SOURCE_MEMORY is selected | ||
298 | in the ioctl call AUDIO_SELECT_SOURCE. The data provided shall be in | ||
299 | PES format. If O_NONBLOCK is not specified the function will block until | ||
300 | buffer space is available. The amount of data to be transferred is implied by | ||
301 | count.</para> | ||
302 | </entry> | ||
303 | </row></tbody></tgroup></informaltable> | ||
304 | <para>SYNOPSIS | ||
305 | </para> | ||
306 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
307 | align="char"> | ||
308 | <para>size_t write(int fd, const void ⋆buf, size_t count);</para> | ||
309 | </entry> | ||
310 | </row></tbody></tgroup></informaltable> | ||
311 | <para>PARAMETERS | ||
312 | </para> | ||
313 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
314 | align="char"> | ||
315 | <para>int fd</para> | ||
316 | </entry><entry | ||
317 | align="char"> | ||
318 | <para>File descriptor returned by a previous call to open().</para> | ||
319 | </entry> | ||
320 | </row><row><entry | ||
321 | align="char"> | ||
322 | <para>void *buf</para> | ||
323 | </entry><entry | ||
324 | align="char"> | ||
325 | <para>Pointer to the buffer containing the PES data.</para> | ||
326 | </entry> | ||
327 | </row><row><entry | ||
328 | align="char"> | ||
329 | <para>size_t count</para> | ||
330 | </entry><entry | ||
331 | align="char"> | ||
332 | <para>Size of buf.</para> | ||
333 | </entry> | ||
334 | </row></tbody></tgroup></informaltable> | ||
335 | <para>ERRORS | ||
336 | </para> | ||
337 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
338 | align="char"> | ||
339 | <para>EPERM</para> | ||
340 | </entry><entry | ||
341 | align="char"> | ||
342 | <para>Mode AUDIO_SOURCE_MEMORY not selected.</para> | ||
343 | </entry> | ||
344 | </row><row><entry | ||
345 | align="char"> | ||
346 | <para>ENOMEM</para> | ||
347 | </entry><entry | ||
348 | align="char"> | ||
349 | <para>Attempted to write more data than the internal buffer can | ||
350 | hold.</para> | ||
351 | </entry> | ||
352 | </row><row><entry | ||
353 | align="char"> | ||
354 | <para>EBADF</para> | ||
355 | </entry><entry | ||
356 | align="char"> | ||
357 | <para>fd is not a valid open file descriptor.</para> | ||
358 | </entry> | ||
359 | </row></tbody></tgroup></informaltable> | ||
360 | |||
361 | </section><section | ||
362 | role="subsection"><title>AUDIO_STOP</title> | ||
363 | <para>DESCRIPTION | ||
364 | </para> | ||
365 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
366 | align="char"> | ||
367 | <para>This ioctl call asks the Audio Device to stop playing the current stream.</para> | ||
368 | </entry> | ||
369 | </row></tbody></tgroup></informaltable> | ||
370 | <para>SYNOPSIS | ||
371 | </para> | ||
372 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
373 | align="char"> | ||
374 | <para>int ioctl(int fd, int request = AUDIO_STOP);</para> | ||
375 | </entry> | ||
376 | </row></tbody></tgroup></informaltable> | ||
377 | <para>PARAMETERS | ||
378 | </para> | ||
379 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
380 | align="char"> | ||
381 | <para>int fd</para> | ||
382 | </entry><entry | ||
383 | align="char"> | ||
384 | <para>File descriptor returned by a previous call to open().</para> | ||
385 | </entry> | ||
386 | </row><row><entry | ||
387 | align="char"> | ||
388 | <para>int request</para> | ||
389 | </entry><entry | ||
390 | align="char"> | ||
391 | <para>Equals AUDIO_STOP for this command.</para> | ||
392 | </entry> | ||
393 | </row></tbody></tgroup></informaltable> | ||
394 | <para>ERRORS | ||
395 | </para> | ||
396 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
397 | align="char"> | ||
398 | <para>EBADF</para> | ||
399 | </entry><entry | ||
400 | align="char"> | ||
401 | <para>fd is not a valid open file descriptor</para> | ||
402 | </entry> | ||
403 | </row><row><entry | ||
404 | align="char"> | ||
405 | <para>EINTERNAL</para> | ||
406 | </entry><entry | ||
407 | align="char"> | ||
408 | <para>Internal error.</para> | ||
409 | </entry> | ||
410 | </row></tbody></tgroup></informaltable> | ||
411 | |||
412 | </section><section | ||
413 | role="subsection"><title>AUDIO_PLAY</title> | ||
414 | <para>DESCRIPTION | ||
415 | </para> | ||
416 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
417 | align="char"> | ||
418 | <para>This ioctl call asks the Audio Device to start playing an audio stream from the | ||
419 | selected source.</para> | ||
420 | </entry> | ||
421 | </row></tbody></tgroup></informaltable> | ||
422 | <para>SYNOPSIS | ||
423 | </para> | ||
424 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
425 | align="char"> | ||
426 | <para>int ioctl(int fd, int request = AUDIO_PLAY);</para> | ||
427 | </entry> | ||
428 | </row></tbody></tgroup></informaltable> | ||
429 | <para>PARAMETERS | ||
430 | </para> | ||
431 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
432 | align="char"> | ||
433 | <para>int fd</para> | ||
434 | </entry><entry | ||
435 | align="char"> | ||
436 | <para>File descriptor returned by a previous call to open().</para> | ||
437 | </entry> | ||
438 | </row><row><entry | ||
439 | align="char"> | ||
440 | <para>int request</para> | ||
441 | </entry><entry | ||
442 | align="char"> | ||
443 | <para>Equals AUDIO_PLAY for this command.</para> | ||
444 | </entry> | ||
445 | </row></tbody></tgroup></informaltable> | ||
446 | <para>ERRORS | ||
447 | </para> | ||
448 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
449 | align="char"> | ||
450 | <para>EBADF</para> | ||
451 | </entry><entry | ||
452 | align="char"> | ||
453 | <para>fd is not a valid open file descriptor</para> | ||
454 | </entry> | ||
455 | </row><row><entry | ||
456 | align="char"> | ||
457 | <para>EINTERNAL</para> | ||
458 | </entry><entry | ||
459 | align="char"> | ||
460 | <para>Internal error.</para> | ||
461 | </entry> | ||
462 | </row></tbody></tgroup></informaltable> | ||
463 | |||
464 | </section><section | ||
465 | role="subsection"><title>AUDIO_PAUSE</title> | ||
466 | <para>DESCRIPTION | ||
467 | </para> | ||
468 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
469 | align="char"> | ||
470 | <para>This ioctl call suspends the audio stream being played. Decoding and playing | ||
471 | are paused. It is then possible to restart again decoding and playing process of | ||
472 | the audio stream using AUDIO_CONTINUE command.</para> | ||
473 | </entry> | ||
474 | </row><row><entry | ||
475 | align="char"> | ||
476 | <para>If AUDIO_SOURCE_MEMORY is selected in the ioctl call | ||
477 | AUDIO_SELECT_SOURCE, the DVB-subsystem will not decode (consume) | ||
478 | any more data until the ioctl call AUDIO_CONTINUE or AUDIO_PLAY is | ||
479 | performed.</para> | ||
480 | </entry> | ||
481 | </row></tbody></tgroup></informaltable> | ||
482 | <para>SYNOPSIS | ||
483 | </para> | ||
484 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
485 | align="char"> | ||
486 | <para>int ioctl(int fd, int request = AUDIO_PAUSE);</para> | ||
487 | </entry> | ||
488 | </row></tbody></tgroup></informaltable> | ||
489 | <para>PARAMETERS | ||
490 | </para> | ||
491 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
492 | align="char"> | ||
493 | <para>int fd</para> | ||
494 | </entry><entry | ||
495 | align="char"> | ||
496 | <para>File descriptor returned by a previous call to open().</para> | ||
497 | </entry> | ||
498 | </row><row><entry | ||
499 | align="char"> | ||
500 | <para>int request</para> | ||
501 | </entry><entry | ||
502 | align="char"> | ||
503 | <para>Equals AUDIO_PAUSE for this command.</para> | ||
504 | </entry> | ||
505 | </row></tbody></tgroup></informaltable> | ||
506 | <para>ERRORS | ||
507 | </para> | ||
508 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
509 | align="char"> | ||
510 | <para>EBADF</para> | ||
511 | </entry><entry | ||
512 | align="char"> | ||
513 | <para>fd is not a valid open file descriptor.</para> | ||
514 | </entry> | ||
515 | </row><row><entry | ||
516 | align="char"> | ||
517 | <para>EINTERNAL</para> | ||
518 | </entry><entry | ||
519 | align="char"> | ||
520 | <para>Internal error.</para> | ||
521 | </entry> | ||
522 | </row></tbody></tgroup></informaltable> | ||
523 | |||
524 | </section><section | ||
525 | role="subsection"><title>AUDIO_SELECT_SOURCE</title> | ||
526 | <para>DESCRIPTION | ||
527 | </para> | ||
528 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
529 | align="char"> | ||
530 | <para>This ioctl call informs the audio device which source shall be used | ||
531 | for the input data. The possible sources are demux or memory. If | ||
532 | AUDIO_SOURCE_MEMORY is selected, the data is fed to the Audio Device | ||
533 | through the write command.</para> | ||
534 | </entry> | ||
535 | </row></tbody></tgroup></informaltable> | ||
536 | <para>SYNOPSIS | ||
537 | </para> | ||
538 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
539 | align="char"> | ||
540 | <para>int ioctl(int fd, int request = AUDIO_SELECT_SOURCE, | ||
541 | audio_stream_source_t source);</para> | ||
542 | </entry> | ||
543 | </row></tbody></tgroup></informaltable> | ||
544 | <para>PARAMETERS | ||
545 | </para> | ||
546 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
547 | align="char"> | ||
548 | <para>int fd</para> | ||
549 | </entry><entry | ||
550 | align="char"> | ||
551 | <para>File descriptor returned by a previous call to open().</para> | ||
552 | </entry> | ||
553 | </row><row><entry | ||
554 | align="char"> | ||
555 | <para>int request</para> | ||
556 | </entry><entry | ||
557 | align="char"> | ||
558 | <para>Equals AUDIO_SELECT_SOURCE for this command.</para> | ||
559 | </entry> | ||
560 | </row><row><entry | ||
561 | align="char"> | ||
562 | <para>audio_stream_source_t | ||
563 | source</para> | ||
564 | </entry><entry | ||
565 | align="char"> | ||
566 | <para>Indicates the source that shall be used for the Audio | ||
567 | stream.</para> | ||
568 | </entry> | ||
569 | </row></tbody></tgroup></informaltable> | ||
570 | <para>ERRORS | ||
571 | </para> | ||
572 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
573 | align="char"> | ||
574 | <para>EBADF</para> | ||
575 | </entry><entry | ||
576 | align="char"> | ||
577 | <para>fd is not a valid open file descriptor.</para> | ||
578 | </entry> | ||
579 | </row><row><entry | ||
580 | align="char"> | ||
581 | <para>EINTERNAL</para> | ||
582 | </entry><entry | ||
583 | align="char"> | ||
584 | <para>Internal error.</para> | ||
585 | </entry> | ||
586 | </row><row><entry | ||
587 | align="char"> | ||
588 | <para>EINVAL</para> | ||
589 | </entry><entry | ||
590 | align="char"> | ||
591 | <para>Illegal input parameter.</para> | ||
592 | </entry> | ||
593 | </row></tbody></tgroup></informaltable> | ||
594 | |||
595 | </section><section | ||
596 | role="subsection"><title>AUDIO_SET_MUTE</title> | ||
597 | <para>DESCRIPTION | ||
598 | </para> | ||
599 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
600 | align="char"> | ||
601 | <para>This ioctl call asks the audio device to mute the stream that is currently being | ||
602 | played.</para> | ||
603 | </entry> | ||
604 | </row></tbody></tgroup></informaltable> | ||
605 | <para>SYNOPSIS | ||
606 | </para> | ||
607 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
608 | align="char"> | ||
609 | <para>int ioctl(int fd, int request = AUDIO_SET_MUTE, | ||
610 | boolean state);</para> | ||
611 | </entry> | ||
612 | </row></tbody></tgroup></informaltable> | ||
613 | <para>PARAMETERS | ||
614 | </para> | ||
615 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
616 | align="char"> | ||
617 | <para>int fd</para> | ||
618 | </entry><entry | ||
619 | align="char"> | ||
620 | <para>File descriptor returned by a previous call to open().</para> | ||
621 | </entry> | ||
622 | </row><row><entry | ||
623 | align="char"> | ||
624 | <para>int request</para> | ||
625 | </entry><entry | ||
626 | align="char"> | ||
627 | <para>Equals AUDIO_SET_MUTE for this command.</para> | ||
628 | </entry> | ||
629 | </row><row><entry | ||
630 | align="char"> | ||
631 | <para>boolean state</para> | ||
632 | </entry><entry | ||
633 | align="char"> | ||
634 | <para>Indicates if audio device shall mute or not.</para> | ||
635 | </entry> | ||
636 | </row><row><entry | ||
637 | align="char"> | ||
638 | </entry><entry | ||
639 | align="char"> | ||
640 | <para>TRUE Audio Mute</para> | ||
641 | </entry> | ||
642 | </row><row><entry | ||
643 | align="char"> | ||
644 | </entry><entry | ||
645 | align="char"> | ||
646 | <para>FALSE Audio Un-mute</para> | ||
647 | </entry> | ||
648 | </row></tbody></tgroup></informaltable> | ||
649 | <para>ERRORS | ||
650 | </para> | ||
651 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
652 | align="char"> | ||
653 | <para>EBADF</para> | ||
654 | </entry><entry | ||
655 | align="char"> | ||
656 | <para>fd is not a valid open file descriptor.</para> | ||
657 | </entry> | ||
658 | </row><row><entry | ||
659 | align="char"> | ||
660 | <para>EINTERNAL</para> | ||
661 | </entry><entry | ||
662 | align="char"> | ||
663 | <para>Internal error.</para> | ||
664 | </entry> | ||
665 | </row><row><entry | ||
666 | align="char"> | ||
667 | <para>EINVAL</para> | ||
668 | </entry><entry | ||
669 | align="char"> | ||
670 | <para>Illegal input parameter.</para> | ||
671 | </entry> | ||
672 | </row></tbody></tgroup></informaltable> | ||
673 | |||
674 | </section><section | ||
675 | role="subsection"><title>AUDIO_SET_AV_SYNC</title> | ||
676 | <para>DESCRIPTION | ||
677 | </para> | ||
678 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
679 | align="char"> | ||
680 | <para>This ioctl call asks the Audio Device to turn ON or OFF A/V synchronization.</para> | ||
681 | </entry> | ||
682 | </row></tbody></tgroup></informaltable> | ||
683 | <para>SYNOPSIS | ||
684 | </para> | ||
685 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
686 | align="char"> | ||
687 | <para>int ioctl(int fd, int request = AUDIO_SET_AV_SYNC, | ||
688 | boolean state);</para> | ||
689 | </entry> | ||
690 | </row></tbody></tgroup></informaltable> | ||
691 | <para>PARAMETERS | ||
692 | </para> | ||
693 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
694 | align="char"> | ||
695 | <para>int fd</para> | ||
696 | </entry><entry | ||
697 | align="char"> | ||
698 | <para>File descriptor returned by a previous call to open().</para> | ||
699 | </entry> | ||
700 | </row><row><entry | ||
701 | align="char"> | ||
702 | <para>int request</para> | ||
703 | </entry><entry | ||
704 | align="char"> | ||
705 | <para>Equals AUDIO_AV_SYNC for this command.</para> | ||
706 | </entry> | ||
707 | </row><row><entry | ||
708 | align="char"> | ||
709 | <para>boolean state</para> | ||
710 | </entry><entry | ||
711 | align="char"> | ||
712 | <para>Tells the DVB subsystem if A/V synchronization shall be | ||
713 | ON or OFF.</para> | ||
714 | </entry> | ||
715 | </row><row><entry | ||
716 | align="char"> | ||
717 | </entry><entry | ||
718 | align="char"> | ||
719 | <para>TRUE AV-sync ON</para> | ||
720 | </entry> | ||
721 | </row><row><entry | ||
722 | align="char"> | ||
723 | </entry><entry | ||
724 | align="char"> | ||
725 | <para>FALSE AV-sync OFF</para> | ||
726 | </entry> | ||
727 | </row></tbody></tgroup></informaltable> | ||
728 | <para>ERRORS | ||
729 | </para> | ||
730 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
731 | align="char"> | ||
732 | <para>EBADF</para> | ||
733 | </entry><entry | ||
734 | align="char"> | ||
735 | <para>fd is not a valid open file descriptor.</para> | ||
736 | </entry> | ||
737 | </row><row><entry | ||
738 | align="char"> | ||
739 | <para>EINTERNAL</para> | ||
740 | </entry><entry | ||
741 | align="char"> | ||
742 | <para>Internal error.</para> | ||
743 | </entry> | ||
744 | </row><row><entry | ||
745 | align="char"> | ||
746 | <para>EINVAL</para> | ||
747 | </entry><entry | ||
748 | align="char"> | ||
749 | <para>Illegal input parameter.</para> | ||
750 | </entry> | ||
751 | </row></tbody></tgroup></informaltable> | ||
752 | |||
753 | </section><section | ||
754 | role="subsection"><title>AUDIO_SET_BYPASS_MODE</title> | ||
755 | <para>DESCRIPTION | ||
756 | </para> | ||
757 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
758 | align="char"> | ||
759 | <para>This ioctl call asks the Audio Device to bypass the Audio decoder and forward | ||
760 | the stream without decoding. This mode shall be used if streams that can’t be | ||
761 | handled by the DVB system shall be decoded. Dolby DigitalTM streams are | ||
762 | automatically forwarded by the DVB subsystem if the hardware can handle it.</para> | ||
763 | </entry> | ||
764 | </row></tbody></tgroup></informaltable> | ||
765 | <para>SYNOPSIS | ||
766 | </para> | ||
767 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
768 | align="char"> | ||
769 | <para>int ioctl(int fd, int request = | ||
770 | AUDIO_SET_BYPASS_MODE, boolean mode);</para> | ||
771 | </entry> | ||
772 | </row></tbody></tgroup></informaltable> | ||
773 | <para>PARAMETERS | ||
774 | </para> | ||
775 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
776 | align="char"> | ||
777 | <para>int fd</para> | ||
778 | </entry><entry | ||
779 | align="char"> | ||
780 | <para>File descriptor returned by a previous call to open().</para> | ||
781 | </entry> | ||
782 | </row><row><entry | ||
783 | align="char"> | ||
784 | <para>int request</para> | ||
785 | </entry><entry | ||
786 | align="char"> | ||
787 | <para>Equals AUDIO_SET_BYPASS_MODE for this | ||
788 | command.</para> | ||
789 | </entry> | ||
790 | </row><row><entry | ||
791 | align="char"> | ||
792 | <para>boolean mode</para> | ||
793 | </entry><entry | ||
794 | align="char"> | ||
795 | <para>Enables or disables the decoding of the current Audio | ||
796 | stream in the DVB subsystem.</para> | ||
797 | </entry> | ||
798 | </row><row><entry | ||
799 | align="char"> | ||
800 | </entry><entry | ||
801 | align="char"> | ||
802 | <para>TRUE Bypass is disabled</para> | ||
803 | </entry> | ||
804 | </row><row><entry | ||
805 | align="char"> | ||
806 | </entry><entry | ||
807 | align="char"> | ||
808 | <para>FALSE Bypass is enabled</para> | ||
809 | </entry> | ||
810 | </row></tbody></tgroup></informaltable> | ||
811 | <para>ERRORS | ||
812 | </para> | ||
813 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
814 | align="char"> | ||
815 | <para>EBADF</para> | ||
816 | </entry><entry | ||
817 | align="char"> | ||
818 | <para>fd is not a valid open file descriptor.</para> | ||
819 | </entry> | ||
820 | </row><row><entry | ||
821 | align="char"> | ||
822 | <para>EINTERNAL</para> | ||
823 | </entry><entry | ||
824 | align="char"> | ||
825 | <para>Internal error.</para> | ||
826 | </entry> | ||
827 | </row><row><entry | ||
828 | align="char"> | ||
829 | <para>EINVAL</para> | ||
830 | </entry><entry | ||
831 | align="char"> | ||
832 | <para>Illegal input parameter.</para> | ||
833 | </entry> | ||
834 | </row></tbody></tgroup></informaltable> | ||
835 | |||
836 | </section><section | ||
837 | role="subsection"><title>AUDIO_CHANNEL_SELECT</title> | ||
838 | <para>DESCRIPTION | ||
839 | </para> | ||
840 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
841 | align="char"> | ||
842 | <para>This ioctl call asks the Audio Device to select the requested channel if possible.</para> | ||
843 | </entry> | ||
844 | </row></tbody></tgroup></informaltable> | ||
845 | <para>SYNOPSIS | ||
846 | </para> | ||
847 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
848 | align="char"> | ||
849 | <para>int ioctl(int fd, int request = | ||
850 | AUDIO_CHANNEL_SELECT, audio_channel_select_t);</para> | ||
851 | </entry> | ||
852 | </row></tbody></tgroup></informaltable> | ||
853 | <para>PARAMETERS | ||
854 | </para> | ||
855 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
856 | align="char"> | ||
857 | <para>int fd</para> | ||
858 | </entry><entry | ||
859 | align="char"> | ||
860 | <para>File descriptor returned by a previous call to open().</para> | ||
861 | </entry> | ||
862 | </row><row><entry | ||
863 | align="char"> | ||
864 | <para>int request</para> | ||
865 | </entry><entry | ||
866 | align="char"> | ||
867 | <para>Equals AUDIO_CHANNEL_SELECT for this | ||
868 | command.</para> | ||
869 | </entry> | ||
870 | </row><row><entry | ||
871 | align="char"> | ||
872 | <para>audio_channel_select_t | ||
873 | ch</para> | ||
874 | </entry><entry | ||
875 | align="char"> | ||
876 | <para>Select the output format of the audio (mono left/right, | ||
877 | stereo).</para> | ||
878 | </entry> | ||
879 | </row></tbody></tgroup></informaltable> | ||
880 | <para>ERRORS | ||
881 | </para> | ||
882 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
883 | align="char"> | ||
884 | <para>EBADF</para> | ||
885 | </entry><entry | ||
886 | align="char"> | ||
887 | <para>fd is not a valid open file descriptor.</para> | ||
888 | </entry> | ||
889 | </row><row><entry | ||
890 | align="char"> | ||
891 | <para>EINTERNAL</para> | ||
892 | </entry><entry | ||
893 | align="char"> | ||
894 | <para>Internal error.</para> | ||
895 | </entry> | ||
896 | </row><row><entry | ||
897 | align="char"> | ||
898 | <para>EINVAL</para> | ||
899 | </entry><entry | ||
900 | align="char"> | ||
901 | <para>Illegal input parameter ch.</para> | ||
902 | </entry> | ||
903 | </row></tbody></tgroup></informaltable> | ||
904 | |||
905 | </section><section | ||
906 | role="subsection"><title>AUDIO_GET_STATUS</title> | ||
907 | <para>DESCRIPTION | ||
908 | </para> | ||
909 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
910 | align="char"> | ||
911 | <para>This ioctl call asks the Audio Device to return the current state of the Audio | ||
912 | Device.</para> | ||
913 | </entry> | ||
914 | </row></tbody></tgroup></informaltable> | ||
915 | <para>SYNOPSIS | ||
916 | </para> | ||
917 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
918 | align="char"> | ||
919 | <para>int ioctl(int fd, int request = AUDIO_GET_STATUS, | ||
920 | struct audio_status ⋆status);</para> | ||
921 | </entry> | ||
922 | </row></tbody></tgroup></informaltable> | ||
923 | <para>PARAMETERS | ||
924 | </para> | ||
925 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
926 | align="char"> | ||
927 | <para>int fd</para> | ||
928 | </entry><entry | ||
929 | align="char"> | ||
930 | <para>File descriptor returned by a previous call to open().</para> | ||
931 | </entry> | ||
932 | </row><row><entry | ||
933 | align="char"> | ||
934 | <para>int request</para> | ||
935 | </entry><entry | ||
936 | align="char"> | ||
937 | <para>Equals AUDIO_GET_STATUS for this command.</para> | ||
938 | </entry> | ||
939 | </row><row><entry | ||
940 | align="char"> | ||
941 | <para>struct audio_status | ||
942 | *status</para> | ||
943 | </entry><entry | ||
944 | align="char"> | ||
945 | <para>Returns the current state of Audio Device.</para> | ||
946 | </entry> | ||
947 | </row></tbody></tgroup></informaltable> | ||
948 | <para>ERRORS | ||
949 | </para> | ||
950 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
951 | align="char"> | ||
952 | <para>EBADF</para> | ||
953 | </entry><entry | ||
954 | align="char"> | ||
955 | <para>fd is not a valid open file descriptor.</para> | ||
956 | </entry> | ||
957 | </row><row><entry | ||
958 | align="char"> | ||
959 | <para>EINTERNAL</para> | ||
960 | </entry><entry | ||
961 | align="char"> | ||
962 | <para>Internal error.</para> | ||
963 | </entry> | ||
964 | </row><row><entry | ||
965 | align="char"> | ||
966 | <para>EFAULT</para> | ||
967 | </entry><entry | ||
968 | align="char"> | ||
969 | <para>status points to invalid address.</para> | ||
970 | </entry> | ||
971 | </row></tbody></tgroup></informaltable> | ||
972 | |||
973 | </section><section | ||
974 | role="subsection"><title>AUDIO_GET_CAPABILITIES</title> | ||
975 | <para>DESCRIPTION | ||
976 | </para> | ||
977 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
978 | align="char"> | ||
979 | <para>This ioctl call asks the Audio Device to tell us about the decoding capabilities | ||
980 | of the audio hardware.</para> | ||
981 | </entry> | ||
982 | </row></tbody></tgroup></informaltable> | ||
983 | <para>SYNOPSIS | ||
984 | </para> | ||
985 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
986 | align="char"> | ||
987 | <para>int ioctl(int fd, int request = | ||
988 | AUDIO_GET_CAPABILITIES, unsigned int ⋆cap);</para> | ||
989 | </entry> | ||
990 | </row></tbody></tgroup></informaltable> | ||
991 | <para>PARAMETERS | ||
992 | </para> | ||
993 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
994 | align="char"> | ||
995 | <para>int fd</para> | ||
996 | </entry><entry | ||
997 | align="char"> | ||
998 | <para>File descriptor returned by a previous call to open().</para> | ||
999 | </entry> | ||
1000 | </row><row><entry | ||
1001 | align="char"> | ||
1002 | <para>int request</para> | ||
1003 | </entry><entry | ||
1004 | align="char"> | ||
1005 | <para>Equals AUDIO_GET_CAPABILITIES for this | ||
1006 | command.</para> | ||
1007 | </entry> | ||
1008 | </row><row><entry | ||
1009 | align="char"> | ||
1010 | <para>unsigned int *cap</para> | ||
1011 | </entry><entry | ||
1012 | align="char"> | ||
1013 | <para>Returns a bit array of supported sound formats.</para> | ||
1014 | </entry> | ||
1015 | </row></tbody></tgroup></informaltable> | ||
1016 | <para>ERRORS | ||
1017 | </para> | ||
1018 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1019 | align="char"> | ||
1020 | <para>EBADF</para> | ||
1021 | </entry><entry | ||
1022 | align="char"> | ||
1023 | <para>fd is not a valid open file descriptor.</para> | ||
1024 | </entry> | ||
1025 | </row><row><entry | ||
1026 | align="char"> | ||
1027 | <para>EINTERNAL</para> | ||
1028 | </entry><entry | ||
1029 | align="char"> | ||
1030 | <para>Internal error.</para> | ||
1031 | </entry> | ||
1032 | </row><row><entry | ||
1033 | align="char"> | ||
1034 | <para>EFAULT</para> | ||
1035 | </entry><entry | ||
1036 | align="char"> | ||
1037 | <para>cap points to an invalid address.</para> | ||
1038 | </entry> | ||
1039 | </row></tbody></tgroup></informaltable> | ||
1040 | |||
1041 | </section><section | ||
1042 | role="subsection"><title>AUDIO_CLEAR_BUFFER</title> | ||
1043 | <para>DESCRIPTION | ||
1044 | </para> | ||
1045 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1046 | align="char"> | ||
1047 | <para>This ioctl call asks the Audio Device to clear all software and hardware buffers | ||
1048 | of the audio decoder device.</para> | ||
1049 | </entry> | ||
1050 | </row></tbody></tgroup></informaltable> | ||
1051 | <para>SYNOPSIS | ||
1052 | </para> | ||
1053 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1054 | align="char"> | ||
1055 | <para>int ioctl(int fd, int request = AUDIO_CLEAR_BUFFER);</para> | ||
1056 | </entry> | ||
1057 | </row></tbody></tgroup></informaltable> | ||
1058 | <para>PARAMETERS | ||
1059 | </para> | ||
1060 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1061 | align="char"> | ||
1062 | <para>int fd</para> | ||
1063 | </entry><entry | ||
1064 | align="char"> | ||
1065 | <para>File descriptor returned by a previous call to open().</para> | ||
1066 | </entry> | ||
1067 | </row><row><entry | ||
1068 | align="char"> | ||
1069 | <para>int request</para> | ||
1070 | </entry><entry | ||
1071 | align="char"> | ||
1072 | <para>Equals AUDIO_CLEAR_BUFFER for this command.</para> | ||
1073 | </entry> | ||
1074 | </row></tbody></tgroup></informaltable> | ||
1075 | <para>ERRORS | ||
1076 | </para> | ||
1077 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1078 | align="char"> | ||
1079 | <para>EBADF</para> | ||
1080 | </entry><entry | ||
1081 | align="char"> | ||
1082 | <para>fd is not a valid open file descriptor.</para> | ||
1083 | </entry> | ||
1084 | </row><row><entry | ||
1085 | align="char"> | ||
1086 | <para>EINTERNAL</para> | ||
1087 | </entry><entry | ||
1088 | align="char"> | ||
1089 | <para>Internal error.</para> | ||
1090 | </entry> | ||
1091 | </row></tbody></tgroup></informaltable> | ||
1092 | |||
1093 | </section><section | ||
1094 | role="subsection"><title>AUDIO_SET_ID</title> | ||
1095 | <para>DESCRIPTION | ||
1096 | </para> | ||
1097 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1098 | align="char"> | ||
1099 | <para>This ioctl selects which sub-stream is to be decoded if a program or system | ||
1100 | stream is sent to the video device. If no audio stream type is set the id has to be | ||
1101 | in [0xC0,0xDF] for MPEG sound, in [0x80,0x87] for AC3 and in [0xA0,0xA7] | ||
1102 | for LPCM. More specifications may follow for other stream types. If the stream | ||
1103 | type is set the id just specifies the substream id of the audio stream and only | ||
1104 | the first 5 bits are recognized.</para> | ||
1105 | </entry> | ||
1106 | </row></tbody></tgroup></informaltable> | ||
1107 | <para>SYNOPSIS | ||
1108 | </para> | ||
1109 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1110 | align="char"> | ||
1111 | <para>int ioctl(int fd, int request = AUDIO_SET_ID, int | ||
1112 | id);</para> | ||
1113 | </entry> | ||
1114 | </row></tbody></tgroup></informaltable> | ||
1115 | <para>PARAMETERS | ||
1116 | </para> | ||
1117 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1118 | align="char"> | ||
1119 | <para>int fd</para> | ||
1120 | </entry><entry | ||
1121 | align="char"> | ||
1122 | <para>File descriptor returned by a previous call to open().</para> | ||
1123 | </entry> | ||
1124 | </row><row><entry | ||
1125 | align="char"> | ||
1126 | <para>int request</para> | ||
1127 | </entry><entry | ||
1128 | align="char"> | ||
1129 | <para>Equals AUDIO_SET_ID for this command.</para> | ||
1130 | </entry> | ||
1131 | </row><row><entry | ||
1132 | align="char"> | ||
1133 | <para>int id</para> | ||
1134 | </entry><entry | ||
1135 | align="char"> | ||
1136 | <para>audio sub-stream id</para> | ||
1137 | </entry> | ||
1138 | </row></tbody></tgroup></informaltable> | ||
1139 | <para>ERRORS | ||
1140 | </para> | ||
1141 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1142 | align="char"> | ||
1143 | <para>EBADF</para> | ||
1144 | </entry><entry | ||
1145 | align="char"> | ||
1146 | <para>fd is not a valid open file descriptor.</para> | ||
1147 | </entry> | ||
1148 | </row><row><entry | ||
1149 | align="char"> | ||
1150 | <para>EINTERNAL</para> | ||
1151 | </entry><entry | ||
1152 | align="char"> | ||
1153 | <para>Internal error.</para> | ||
1154 | </entry> | ||
1155 | </row><row><entry | ||
1156 | align="char"> | ||
1157 | <para>EINVAL</para> | ||
1158 | </entry><entry | ||
1159 | align="char"> | ||
1160 | <para>Invalid sub-stream id.</para> | ||
1161 | </entry> | ||
1162 | </row></tbody></tgroup></informaltable> | ||
1163 | |||
1164 | </section><section | ||
1165 | role="subsection"><title>AUDIO_SET_MIXER</title> | ||
1166 | <para>DESCRIPTION | ||
1167 | </para> | ||
1168 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1169 | align="char"> | ||
1170 | <para>This ioctl lets you adjust the mixer settings of the audio decoder.</para> | ||
1171 | </entry> | ||
1172 | </row></tbody></tgroup></informaltable> | ||
1173 | <para>SYNOPSIS | ||
1174 | </para> | ||
1175 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1176 | align="char"> | ||
1177 | <para>int ioctl(int fd, int request = AUDIO_SET_MIXER, | ||
1178 | audio_mixer_t ⋆mix);</para> | ||
1179 | </entry> | ||
1180 | </row></tbody></tgroup></informaltable> | ||
1181 | <para>PARAMETERS | ||
1182 | </para> | ||
1183 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1184 | align="char"> | ||
1185 | <para>int fd</para> | ||
1186 | </entry><entry | ||
1187 | align="char"> | ||
1188 | <para>File descriptor returned by a previous call to open().</para> | ||
1189 | </entry> | ||
1190 | </row><row><entry | ||
1191 | align="char"> | ||
1192 | <para>int request</para> | ||
1193 | </entry><entry | ||
1194 | align="char"> | ||
1195 | <para>Equals AUDIO_SET_ID for this command.</para> | ||
1196 | </entry> | ||
1197 | </row><row><entry | ||
1198 | align="char"> | ||
1199 | <para>audio_mixer_t *mix</para> | ||
1200 | </entry><entry | ||
1201 | align="char"> | ||
1202 | <para>mixer settings.</para> | ||
1203 | </entry> | ||
1204 | </row></tbody></tgroup></informaltable> | ||
1205 | <para>ERRORS | ||
1206 | </para> | ||
1207 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1208 | align="char"> | ||
1209 | <para>EBADF</para> | ||
1210 | </entry><entry | ||
1211 | align="char"> | ||
1212 | <para>fd is not a valid open file descriptor.</para> | ||
1213 | </entry> | ||
1214 | </row><row><entry | ||
1215 | align="char"> | ||
1216 | <para>EINTERNAL</para> | ||
1217 | </entry><entry | ||
1218 | align="char"> | ||
1219 | <para>Internal error.</para> | ||
1220 | </entry> | ||
1221 | </row><row><entry | ||
1222 | align="char"> | ||
1223 | <para>EFAULT</para> | ||
1224 | </entry><entry | ||
1225 | align="char"> | ||
1226 | <para>mix points to an invalid address.</para> | ||
1227 | </entry> | ||
1228 | </row></tbody></tgroup></informaltable> | ||
1229 | |||
1230 | </section><section | ||
1231 | role="subsection"><title>AUDIO_SET_STREAMTYPE</title> | ||
1232 | <para>DESCRIPTION | ||
1233 | </para> | ||
1234 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1235 | align="char"> | ||
1236 | <para>This ioctl tells the driver which kind of audio stream to expect. This is useful | ||
1237 | if the stream offers several audio sub-streams like LPCM and AC3.</para> | ||
1238 | </entry> | ||
1239 | </row></tbody></tgroup></informaltable> | ||
1240 | <para>SYNOPSIS | ||
1241 | </para> | ||
1242 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1243 | align="char"> | ||
1244 | <para>int ioctl(fd, int request = AUDIO_SET_STREAMTYPE, | ||
1245 | int type);</para> | ||
1246 | </entry> | ||
1247 | </row></tbody></tgroup></informaltable> | ||
1248 | <para>PARAMETERS | ||
1249 | </para> | ||
1250 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1251 | align="char"> | ||
1252 | <para>int fd</para> | ||
1253 | </entry><entry | ||
1254 | align="char"> | ||
1255 | <para>File descriptor returned by a previous call to open().</para> | ||
1256 | </entry> | ||
1257 | </row><row><entry | ||
1258 | align="char"> | ||
1259 | <para>int request</para> | ||
1260 | </entry><entry | ||
1261 | align="char"> | ||
1262 | <para>Equals AUDIO_SET_STREAMTYPE for this | ||
1263 | command.</para> | ||
1264 | </entry> | ||
1265 | </row><row><entry | ||
1266 | align="char"> | ||
1267 | <para>int type</para> | ||
1268 | </entry><entry | ||
1269 | align="char"> | ||
1270 | <para>stream type</para> | ||
1271 | </entry> | ||
1272 | </row></tbody></tgroup></informaltable> | ||
1273 | <para>ERRORS | ||
1274 | </para> | ||
1275 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1276 | align="char"> | ||
1277 | <para>EBADF</para> | ||
1278 | </entry><entry | ||
1279 | align="char"> | ||
1280 | <para>fd is not a valid open file descriptor</para> | ||
1281 | </entry> | ||
1282 | </row><row><entry | ||
1283 | align="char"> | ||
1284 | <para>EINVAL</para> | ||
1285 | </entry><entry | ||
1286 | align="char"> | ||
1287 | <para>type is not a valid or supported stream type.</para> | ||
1288 | </entry> | ||
1289 | </row></tbody></tgroup></informaltable> | ||
1290 | |||
1291 | </section><section | ||
1292 | role="subsection"><title>AUDIO_SET_EXT_ID</title> | ||
1293 | <para>DESCRIPTION | ||
1294 | </para> | ||
1295 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1296 | align="char"> | ||
1297 | <para>This ioctl can be used to set the extension id for MPEG streams in DVD | ||
1298 | playback. Only the first 3 bits are recognized.</para> | ||
1299 | </entry> | ||
1300 | </row></tbody></tgroup></informaltable> | ||
1301 | <para>SYNOPSIS | ||
1302 | </para> | ||
1303 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1304 | align="char"> | ||
1305 | <para>int ioctl(fd, int request = AUDIO_SET_EXT_ID, int | ||
1306 | id);</para> | ||
1307 | </entry> | ||
1308 | </row></tbody></tgroup></informaltable> | ||
1309 | <para>PARAMETERS | ||
1310 | </para> | ||
1311 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1312 | align="char"> | ||
1313 | <para>int fd</para> | ||
1314 | </entry><entry | ||
1315 | align="char"> | ||
1316 | <para>File descriptor returned by a previous call to open().</para> | ||
1317 | </entry> | ||
1318 | </row><row><entry | ||
1319 | align="char"> | ||
1320 | <para>int request</para> | ||
1321 | </entry><entry | ||
1322 | align="char"> | ||
1323 | <para>Equals AUDIO_SET_EXT_ID for this command.</para> | ||
1324 | </entry> | ||
1325 | </row><row><entry | ||
1326 | align="char"> | ||
1327 | <para>int id</para> | ||
1328 | </entry><entry | ||
1329 | align="char"> | ||
1330 | <para>audio sub_stream_id</para> | ||
1331 | </entry> | ||
1332 | </row></tbody></tgroup></informaltable> | ||
1333 | <para>ERRORS | ||
1334 | </para> | ||
1335 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1336 | align="char"> | ||
1337 | <para>EBADF</para> | ||
1338 | </entry><entry | ||
1339 | align="char"> | ||
1340 | <para>fd is not a valid open file descriptor</para> | ||
1341 | </entry> | ||
1342 | </row><row><entry | ||
1343 | align="char"> | ||
1344 | <para>EINVAL</para> | ||
1345 | </entry><entry | ||
1346 | align="char"> | ||
1347 | <para>id is not a valid id.</para> | ||
1348 | </entry> | ||
1349 | </row></tbody></tgroup></informaltable> | ||
1350 | |||
1351 | </section><section | ||
1352 | role="subsection"><title>AUDIO_SET_ATTRIBUTES</title> | ||
1353 | <para>DESCRIPTION | ||
1354 | </para> | ||
1355 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1356 | align="char"> | ||
1357 | <para>This ioctl is intended for DVD playback and allows you to set certain | ||
1358 | information about the audio stream.</para> | ||
1359 | </entry> | ||
1360 | </row></tbody></tgroup></informaltable> | ||
1361 | <para>SYNOPSIS | ||
1362 | </para> | ||
1363 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1364 | align="char"> | ||
1365 | <para>int ioctl(fd, int request = AUDIO_SET_ATTRIBUTES, | ||
1366 | audio_attributes_t attr );</para> | ||
1367 | </entry> | ||
1368 | </row></tbody></tgroup></informaltable> | ||
1369 | <para>PARAMETERS | ||
1370 | </para> | ||
1371 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1372 | align="char"> | ||
1373 | <para>int fd</para> | ||
1374 | </entry><entry | ||
1375 | align="char"> | ||
1376 | <para>File descriptor returned by a previous call to open().</para> | ||
1377 | </entry> | ||
1378 | </row><row><entry | ||
1379 | align="char"> | ||
1380 | <para>int request</para> | ||
1381 | </entry><entry | ||
1382 | align="char"> | ||
1383 | <para>Equals AUDIO_SET_ATTRIBUTES for this command.</para> | ||
1384 | </entry> | ||
1385 | </row><row><entry | ||
1386 | align="char"> | ||
1387 | <para>audio_attributes_t | ||
1388 | attr</para> | ||
1389 | </entry><entry | ||
1390 | align="char"> | ||
1391 | <para>audio attributes according to section ??</para> | ||
1392 | </entry> | ||
1393 | </row></tbody></tgroup></informaltable> | ||
1394 | <para>ERRORS | ||
1395 | </para> | ||
1396 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1397 | align="char"> | ||
1398 | <para>EBADF</para> | ||
1399 | </entry><entry | ||
1400 | align="char"> | ||
1401 | <para>fd is not a valid open file descriptor</para> | ||
1402 | </entry> | ||
1403 | </row><row><entry | ||
1404 | align="char"> | ||
1405 | <para>EINVAL</para> | ||
1406 | </entry><entry | ||
1407 | align="char"> | ||
1408 | <para>attr is not a valid or supported attribute setting.</para> | ||
1409 | </entry> | ||
1410 | </row></tbody></tgroup></informaltable> | ||
1411 | |||
1412 | </section><section | ||
1413 | role="subsection"><title>AUDIO_SET_KARAOKE</title> | ||
1414 | <para>DESCRIPTION | ||
1415 | </para> | ||
1416 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1417 | align="char"> | ||
1418 | <para>This ioctl allows one to set the mixer settings for a karaoke DVD.</para> | ||
1419 | </entry> | ||
1420 | </row></tbody></tgroup></informaltable> | ||
1421 | <para>SYNOPSIS | ||
1422 | </para> | ||
1423 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1424 | align="char"> | ||
1425 | <para>int ioctl(fd, int request = AUDIO_SET_STREAMTYPE, | ||
1426 | audio_karaoke_t ⋆karaoke);</para> | ||
1427 | </entry> | ||
1428 | </row></tbody></tgroup></informaltable> | ||
1429 | <para>PARAMETERS | ||
1430 | </para> | ||
1431 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1432 | align="char"> | ||
1433 | <para>int fd</para> | ||
1434 | </entry><entry | ||
1435 | align="char"> | ||
1436 | <para>File descriptor returned by a previous call to open().</para> | ||
1437 | </entry> | ||
1438 | </row><row><entry | ||
1439 | align="char"> | ||
1440 | <para>int request</para> | ||
1441 | </entry><entry | ||
1442 | align="char"> | ||
1443 | <para>Equals AUDIO_SET_STREAMTYPE for this | ||
1444 | command.</para> | ||
1445 | </entry> | ||
1446 | </row><row><entry | ||
1447 | align="char"> | ||
1448 | <para>audio_karaoke_t | ||
1449 | *karaoke</para> | ||
1450 | </entry><entry | ||
1451 | align="char"> | ||
1452 | <para>karaoke settings according to section ??.</para> | ||
1453 | </entry> | ||
1454 | </row></tbody></tgroup></informaltable> | ||
1455 | <para>ERRORS | ||
1456 | </para> | ||
1457 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1458 | align="char"> | ||
1459 | <para>EBADF</para> | ||
1460 | </entry><entry | ||
1461 | align="char"> | ||
1462 | <para>fd is not a valid open file descriptor</para> | ||
1463 | </entry> | ||
1464 | </row><row><entry | ||
1465 | align="char"> | ||
1466 | <para>EINVAL</para> | ||
1467 | </entry><entry | ||
1468 | align="char"> | ||
1469 | <para>karaoke is not a valid or supported karaoke setting.</para> | ||
1470 | </entry> | ||
1471 | </row></tbody></tgroup></informaltable> | ||
1472 | </section> | ||
1473 | </section> | ||
diff --git a/Documentation/DocBook/dvb/ca.xml b/Documentation/DocBook/dvb/ca.xml new file mode 100644 index 000000000000..b1f1d2fad654 --- /dev/null +++ b/Documentation/DocBook/dvb/ca.xml | |||
@@ -0,0 +1,221 @@ | |||
1 | <title>DVB CA Device</title> | ||
2 | <para>The DVB CA device controls the conditional access hardware. It can be accessed through | ||
3 | <emphasis role="tt">/dev/dvb/adapter0/ca0</emphasis>. Data types and and ioctl definitions can be accessed by | ||
4 | including <emphasis role="tt">linux/dvb/ca.h</emphasis> in your application. | ||
5 | </para> | ||
6 | |||
7 | <section id="ca_data_types"> | ||
8 | <title>CA Data Types</title> | ||
9 | |||
10 | |||
11 | <section id="ca_slot_info_t"> | ||
12 | <title>ca_slot_info_t</title> | ||
13 | <programlisting> | ||
14 | /⋆ slot interface types and info ⋆/ | ||
15 | |||
16 | typedef struct ca_slot_info_s { | ||
17 | int num; /⋆ slot number ⋆/ | ||
18 | |||
19 | int type; /⋆ CA interface this slot supports ⋆/ | ||
20 | #define CA_CI 1 /⋆ CI high level interface ⋆/ | ||
21 | #define CA_CI_LINK 2 /⋆ CI link layer level interface ⋆/ | ||
22 | #define CA_CI_PHYS 4 /⋆ CI physical layer level interface ⋆/ | ||
23 | #define CA_SC 128 /⋆ simple smart card interface ⋆/ | ||
24 | |||
25 | unsigned int flags; | ||
26 | #define CA_CI_MODULE_PRESENT 1 /⋆ module (or card) inserted ⋆/ | ||
27 | #define CA_CI_MODULE_READY 2 | ||
28 | } ca_slot_info_t; | ||
29 | </programlisting> | ||
30 | |||
31 | </section> | ||
32 | <section id="ca_descr_info_t"> | ||
33 | <title>ca_descr_info_t</title> | ||
34 | <programlisting> | ||
35 | typedef struct ca_descr_info_s { | ||
36 | unsigned int num; /⋆ number of available descramblers (keys) ⋆/ | ||
37 | unsigned int type; /⋆ type of supported scrambling system ⋆/ | ||
38 | #define CA_ECD 1 | ||
39 | #define CA_NDS 2 | ||
40 | #define CA_DSS 4 | ||
41 | } ca_descr_info_t; | ||
42 | </programlisting> | ||
43 | |||
44 | </section> | ||
45 | <section id="ca_cap_t"> | ||
46 | <title>ca_cap_t</title> | ||
47 | <programlisting> | ||
48 | typedef struct ca_cap_s { | ||
49 | unsigned int slot_num; /⋆ total number of CA card and module slots ⋆/ | ||
50 | unsigned int slot_type; /⋆ OR of all supported types ⋆/ | ||
51 | unsigned int descr_num; /⋆ total number of descrambler slots (keys) ⋆/ | ||
52 | unsigned int descr_type;/⋆ OR of all supported types ⋆/ | ||
53 | } ca_cap_t; | ||
54 | </programlisting> | ||
55 | |||
56 | </section> | ||
57 | <section id="ca_msg_t"> | ||
58 | <title>ca_msg_t</title> | ||
59 | <programlisting> | ||
60 | /⋆ a message to/from a CI-CAM ⋆/ | ||
61 | typedef struct ca_msg_s { | ||
62 | unsigned int index; | ||
63 | unsigned int type; | ||
64 | unsigned int length; | ||
65 | unsigned char msg[256]; | ||
66 | } ca_msg_t; | ||
67 | </programlisting> | ||
68 | |||
69 | </section> | ||
70 | <section id="ca_descr_t"> | ||
71 | <title>ca_descr_t</title> | ||
72 | <programlisting> | ||
73 | typedef struct ca_descr_s { | ||
74 | unsigned int index; | ||
75 | unsigned int parity; | ||
76 | unsigned char cw[8]; | ||
77 | } ca_descr_t; | ||
78 | </programlisting> | ||
79 | </section></section> | ||
80 | <section id="ca_function_calls"> | ||
81 | <title>CA Function Calls</title> | ||
82 | |||
83 | |||
84 | <section id="ca_fopen"> | ||
85 | <title>open()</title> | ||
86 | <para>DESCRIPTION | ||
87 | </para> | ||
88 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
89 | align="char"> | ||
90 | <para>This system call opens a named ca device (e.g. /dev/ost/ca) for subsequent use.</para> | ||
91 | <para>When an open() call has succeeded, the device will be ready for use. | ||
92 | The significance of blocking or non-blocking mode is described in the | ||
93 | documentation for functions where there is a difference. It does not affect the | ||
94 | semantics of the open() call itself. A device opened in blocking mode can later | ||
95 | be put into non-blocking mode (and vice versa) using the F_SETFL command | ||
96 | of the fcntl system call. This is a standard system call, documented in the Linux | ||
97 | manual page for fcntl. Only one user can open the CA Device in O_RDWR | ||
98 | mode. All other attempts to open the device in this mode will fail, and an error | ||
99 | code will be returned.</para> | ||
100 | </entry> | ||
101 | </row></tbody></tgroup></informaltable> | ||
102 | <para>SYNOPSIS | ||
103 | </para> | ||
104 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
105 | align="char"> | ||
106 | <para>int open(const char ⋆deviceName, int flags);</para> | ||
107 | </entry> | ||
108 | </row></tbody></tgroup></informaltable> | ||
109 | <para>PARAMETERS | ||
110 | </para> | ||
111 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
112 | align="char"> | ||
113 | <para>const char | ||
114 | *deviceName</para> | ||
115 | </entry><entry | ||
116 | align="char"> | ||
117 | <para>Name of specific video device.</para> | ||
118 | </entry> | ||
119 | </row><row><entry | ||
120 | align="char"> | ||
121 | <para>int flags</para> | ||
122 | </entry><entry | ||
123 | align="char"> | ||
124 | <para>A bit-wise OR of the following flags:</para> | ||
125 | </entry> | ||
126 | </row><row><entry | ||
127 | align="char"> | ||
128 | </entry><entry | ||
129 | align="char"> | ||
130 | <para>O_RDONLY read-only access</para> | ||
131 | </entry> | ||
132 | </row><row><entry | ||
133 | align="char"> | ||
134 | </entry><entry | ||
135 | align="char"> | ||
136 | <para>O_RDWR read/write access</para> | ||
137 | </entry> | ||
138 | </row><row><entry | ||
139 | align="char"> | ||
140 | </entry><entry | ||
141 | align="char"> | ||
142 | <para>O_NONBLOCK open in non-blocking mode</para> | ||
143 | </entry> | ||
144 | </row><row><entry | ||
145 | align="char"> | ||
146 | </entry><entry | ||
147 | align="char"> | ||
148 | <para>(blocking mode is the default)</para> | ||
149 | </entry> | ||
150 | </row></tbody></tgroup></informaltable> | ||
151 | <para>ERRORS | ||
152 | </para> | ||
153 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
154 | align="char"> | ||
155 | <para>ENODEV</para> | ||
156 | </entry><entry | ||
157 | align="char"> | ||
158 | <para>Device driver not loaded/available.</para> | ||
159 | </entry> | ||
160 | </row><row><entry | ||
161 | align="char"> | ||
162 | <para>EINTERNAL</para> | ||
163 | </entry><entry | ||
164 | align="char"> | ||
165 | <para>Internal error.</para> | ||
166 | </entry> | ||
167 | </row><row><entry | ||
168 | align="char"> | ||
169 | <para>EBUSY</para> | ||
170 | </entry><entry | ||
171 | align="char"> | ||
172 | <para>Device or resource busy.</para> | ||
173 | </entry> | ||
174 | </row><row><entry | ||
175 | align="char"> | ||
176 | <para>EINVAL</para> | ||
177 | </entry><entry | ||
178 | align="char"> | ||
179 | <para>Invalid argument.</para> | ||
180 | </entry> | ||
181 | </row></tbody></tgroup></informaltable> | ||
182 | |||
183 | </section> | ||
184 | <section id="ca_fclose"> | ||
185 | <title>close()</title> | ||
186 | <para>DESCRIPTION | ||
187 | </para> | ||
188 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
189 | align="char"> | ||
190 | <para>This system call closes a previously opened audio device.</para> | ||
191 | </entry> | ||
192 | </row></tbody></tgroup></informaltable> | ||
193 | <para>SYNOPSIS | ||
194 | </para> | ||
195 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
196 | align="char"> | ||
197 | <para>int close(int fd);</para> | ||
198 | </entry> | ||
199 | </row></tbody></tgroup></informaltable> | ||
200 | <para>PARAMETERS | ||
201 | </para> | ||
202 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
203 | align="char"> | ||
204 | <para>int fd</para> | ||
205 | </entry><entry | ||
206 | align="char"> | ||
207 | <para>File descriptor returned by a previous call to open().</para> | ||
208 | </entry> | ||
209 | </row></tbody></tgroup></informaltable> | ||
210 | <para>ERRORS | ||
211 | </para> | ||
212 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
213 | align="char"> | ||
214 | <para>EBADF</para> | ||
215 | </entry><entry | ||
216 | align="char"> | ||
217 | <para>fd is not a valid open file descriptor.</para> | ||
218 | </entry> | ||
219 | </row></tbody></tgroup></informaltable> | ||
220 | </section> | ||
221 | </section> | ||
diff --git a/Documentation/DocBook/dvb/demux.xml b/Documentation/DocBook/dvb/demux.xml new file mode 100644 index 000000000000..1b8c4e9835b9 --- /dev/null +++ b/Documentation/DocBook/dvb/demux.xml | |||
@@ -0,0 +1,973 @@ | |||
1 | <title>DVB Demux Device</title> | ||
2 | |||
3 | <para>The DVB demux device controls the filters of the DVB hardware/software. It can be | ||
4 | accessed through <emphasis role="tt">/dev/adapter0/demux0</emphasis>. Data types and and ioctl definitions can be | ||
5 | accessed by including <emphasis role="tt">linux/dvb/dmx.h</emphasis> in your application. | ||
6 | </para> | ||
7 | <section id="dmx_types"> | ||
8 | <title>Demux Data Types</title> | ||
9 | |||
10 | <section id="dmx_output_t"> | ||
11 | <title>dmx_output_t</title> | ||
12 | <programlisting> | ||
13 | typedef enum | ||
14 | { | ||
15 | DMX_OUT_DECODER, | ||
16 | DMX_OUT_TAP, | ||
17 | DMX_OUT_TS_TAP | ||
18 | } dmx_output_t; | ||
19 | </programlisting> | ||
20 | <para><emphasis role="tt">DMX_OUT_TAP</emphasis> delivers the stream output to the demux device on which the ioctl is | ||
21 | called. | ||
22 | </para> | ||
23 | <para><emphasis role="tt">DMX_OUT_TS_TAP</emphasis> routes output to the logical DVR device <emphasis role="tt">/dev/dvb/adapter0/dvr0</emphasis>, | ||
24 | which delivers a TS multiplexed from all filters for which <emphasis role="tt">DMX_OUT_TS_TAP</emphasis> was | ||
25 | specified. | ||
26 | </para> | ||
27 | </section> | ||
28 | |||
29 | <section id="dmx_input_t"> | ||
30 | <title>dmx_input_t</title> | ||
31 | <programlisting> | ||
32 | typedef enum | ||
33 | { | ||
34 | DMX_IN_FRONTEND, | ||
35 | DMX_IN_DVR | ||
36 | } dmx_input_t; | ||
37 | </programlisting> | ||
38 | </section> | ||
39 | |||
40 | <section id="dmx_pes_type_t"> | ||
41 | <title>dmx_pes_type_t</title> | ||
42 | <programlisting> | ||
43 | typedef enum | ||
44 | { | ||
45 | DMX_PES_AUDIO, | ||
46 | DMX_PES_VIDEO, | ||
47 | DMX_PES_TELETEXT, | ||
48 | DMX_PES_SUBTITLE, | ||
49 | DMX_PES_PCR, | ||
50 | DMX_PES_OTHER | ||
51 | } dmx_pes_type_t; | ||
52 | </programlisting> | ||
53 | </section> | ||
54 | |||
55 | <section id="dmx_event_t"> | ||
56 | <title>dmx_event_t</title> | ||
57 | <programlisting> | ||
58 | typedef enum | ||
59 | { | ||
60 | DMX_SCRAMBLING_EV, | ||
61 | DMX_FRONTEND_EV | ||
62 | } dmx_event_t; | ||
63 | </programlisting> | ||
64 | </section> | ||
65 | |||
66 | <section id="dmx_scrambling_status_t"> | ||
67 | <title>dmx_scrambling_status_t</title> | ||
68 | <programlisting> | ||
69 | typedef enum | ||
70 | { | ||
71 | DMX_SCRAMBLING_OFF, | ||
72 | DMX_SCRAMBLING_ON | ||
73 | } dmx_scrambling_status_t; | ||
74 | </programlisting> | ||
75 | </section> | ||
76 | |||
77 | <section id="dmx_filter"> | ||
78 | <title>struct dmx_filter</title> | ||
79 | <programlisting> | ||
80 | typedef struct dmx_filter | ||
81 | { | ||
82 | uint8_t filter[DMX_FILTER_SIZE]; | ||
83 | uint8_t mask[DMX_FILTER_SIZE]; | ||
84 | } dmx_filter_t; | ||
85 | </programlisting> | ||
86 | </section> | ||
87 | |||
88 | <section id="dmx_sct_filter_params"> | ||
89 | <title>struct dmx_sct_filter_params</title> | ||
90 | <programlisting> | ||
91 | struct dmx_sct_filter_params | ||
92 | { | ||
93 | uint16_t pid; | ||
94 | dmx_filter_t filter; | ||
95 | uint32_t timeout; | ||
96 | uint32_t flags; | ||
97 | #define DMX_CHECK_CRC 1 | ||
98 | #define DMX_ONESHOT 2 | ||
99 | #define DMX_IMMEDIATE_START 4 | ||
100 | }; | ||
101 | </programlisting> | ||
102 | </section> | ||
103 | |||
104 | <section id="dmx_pes_filter_params"> | ||
105 | <title>struct dmx_pes_filter_params</title> | ||
106 | <programlisting> | ||
107 | struct dmx_pes_filter_params | ||
108 | { | ||
109 | uint16_t pid; | ||
110 | dmx_input_t input; | ||
111 | dmx_output_t output; | ||
112 | dmx_pes_type_t pes_type; | ||
113 | uint32_t flags; | ||
114 | }; | ||
115 | </programlisting> | ||
116 | </section> | ||
117 | |||
118 | <section id="dmx_event"> | ||
119 | <title>struct dmx_event</title> | ||
120 | <programlisting> | ||
121 | struct dmx_event | ||
122 | { | ||
123 | dmx_event_t event; | ||
124 | time_t timeStamp; | ||
125 | union | ||
126 | { | ||
127 | dmx_scrambling_status_t scrambling; | ||
128 | } u; | ||
129 | }; | ||
130 | </programlisting> | ||
131 | </section> | ||
132 | |||
133 | <section id="dmx_stc"> | ||
134 | <title>struct dmx_stc</title> | ||
135 | <programlisting> | ||
136 | struct dmx_stc { | ||
137 | unsigned int num; /⋆ input : which STC? 0..N ⋆/ | ||
138 | unsigned int base; /⋆ output: divisor for stc to get 90 kHz clock ⋆/ | ||
139 | uint64_t stc; /⋆ output: stc in 'base'⋆90 kHz units ⋆/ | ||
140 | }; | ||
141 | </programlisting> | ||
142 | </section> | ||
143 | |||
144 | </section> | ||
145 | |||
146 | <section id="dmx_fcalls"> | ||
147 | <title>Demux Function Calls</title> | ||
148 | |||
149 | <section id="dmx_fopen"> | ||
150 | <title>open()</title> | ||
151 | <para>DESCRIPTION | ||
152 | </para> | ||
153 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
154 | align="char"> | ||
155 | <para>This system call, used with a device name of /dev/dvb/adapter0/demux0, | ||
156 | allocates a new filter and returns a handle which can be used for subsequent | ||
157 | control of that filter. This call has to be made for each filter to be used, i.e. every | ||
158 | returned file descriptor is a reference to a single filter. /dev/dvb/adapter0/dvr0 | ||
159 | is a logical device to be used for retrieving Transport Streams for digital | ||
160 | video recording. When reading from this device a transport stream containing | ||
161 | the packets from all PES filters set in the corresponding demux device | ||
162 | (/dev/dvb/adapter0/demux0) having the output set to DMX_OUT_TS_TAP. A | ||
163 | recorded Transport Stream is replayed by writing to this device. </para> | ||
164 | <para>The significance of blocking or non-blocking mode is described in the | ||
165 | documentation for functions where there is a difference. It does not affect the | ||
166 | semantics of the open() call itself. A device opened in blocking mode can later | ||
167 | be put into non-blocking mode (and vice versa) using the F_SETFL command | ||
168 | of the fcntl system call.</para> | ||
169 | </entry> | ||
170 | </row></tbody></tgroup></informaltable> | ||
171 | <para>SYNOPSIS | ||
172 | </para> | ||
173 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
174 | align="char"> | ||
175 | <para>int open(const char ⋆deviceName, int flags);</para> | ||
176 | </entry> | ||
177 | </row></tbody></tgroup></informaltable> | ||
178 | <para>PARAMETERS | ||
179 | </para> | ||
180 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
181 | align="char"> | ||
182 | <para>const char | ||
183 | *deviceName</para> | ||
184 | </entry><entry | ||
185 | align="char"> | ||
186 | <para>Name of demux device.</para> | ||
187 | </entry> | ||
188 | </row><row><entry | ||
189 | align="char"> | ||
190 | <para>int flags</para> | ||
191 | </entry><entry | ||
192 | align="char"> | ||
193 | <para>A bit-wise OR of the following flags:</para> | ||
194 | </entry> | ||
195 | </row><row><entry | ||
196 | align="char"> | ||
197 | </entry><entry | ||
198 | align="char"> | ||
199 | <para>O_RDWR read/write access</para> | ||
200 | </entry> | ||
201 | </row><row><entry | ||
202 | align="char"> | ||
203 | </entry><entry | ||
204 | align="char"> | ||
205 | <para>O_NONBLOCK open in non-blocking mode</para> | ||
206 | </entry> | ||
207 | </row><row><entry | ||
208 | align="char"> | ||
209 | </entry><entry | ||
210 | align="char"> | ||
211 | <para>(blocking mode is the default)</para> | ||
212 | </entry> | ||
213 | </row></tbody></tgroup></informaltable> | ||
214 | <para>ERRORS | ||
215 | </para> | ||
216 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
217 | align="char"> | ||
218 | <para>ENODEV</para> | ||
219 | </entry><entry | ||
220 | align="char"> | ||
221 | <para>Device driver not loaded/available.</para> | ||
222 | </entry> | ||
223 | </row><row><entry | ||
224 | align="char"> | ||
225 | <para>EINVAL</para> | ||
226 | </entry><entry | ||
227 | align="char"> | ||
228 | <para>Invalid argument.</para> | ||
229 | </entry> | ||
230 | </row><row><entry | ||
231 | align="char"> | ||
232 | <para>EMFILE</para> | ||
233 | </entry><entry | ||
234 | align="char"> | ||
235 | <para>“Too many open files”, i.e. no more filters available.</para> | ||
236 | </entry> | ||
237 | </row><row><entry | ||
238 | align="char"> | ||
239 | <para>ENOMEM</para> | ||
240 | </entry><entry | ||
241 | align="char"> | ||
242 | <para>The driver failed to allocate enough memory.</para> | ||
243 | </entry> | ||
244 | </row></tbody></tgroup></informaltable> | ||
245 | </section> | ||
246 | |||
247 | <section id="dmx_fclose"> | ||
248 | <title>close()</title> | ||
249 | <para>DESCRIPTION | ||
250 | </para> | ||
251 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
252 | align="char"> | ||
253 | <para>This system call deactivates and deallocates a filter that was previously | ||
254 | allocated via the open() call.</para> | ||
255 | </entry> | ||
256 | </row></tbody></tgroup></informaltable> | ||
257 | <para>SYNOPSIS | ||
258 | </para> | ||
259 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
260 | align="char"> | ||
261 | <para>int close(int fd);</para> | ||
262 | </entry> | ||
263 | </row></tbody></tgroup></informaltable> | ||
264 | <para>PARAMETERS | ||
265 | </para> | ||
266 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
267 | align="char"> | ||
268 | <para>int fd</para> | ||
269 | </entry><entry | ||
270 | align="char"> | ||
271 | <para>File descriptor returned by a previous call to open().</para> | ||
272 | </entry> | ||
273 | </row></tbody></tgroup></informaltable> | ||
274 | <para>ERRORS | ||
275 | </para> | ||
276 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
277 | align="char"> | ||
278 | <para>EBADF</para> | ||
279 | </entry><entry | ||
280 | align="char"> | ||
281 | <para>fd is not a valid open file descriptor.</para> | ||
282 | </entry> | ||
283 | </row></tbody></tgroup></informaltable> | ||
284 | </section> | ||
285 | |||
286 | <section id="dmx_fread"> | ||
287 | <title>read()</title> | ||
288 | <para>DESCRIPTION | ||
289 | </para> | ||
290 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
291 | align="char"> | ||
292 | <para>This system call returns filtered data, which might be section or PES data. The | ||
293 | filtered data is transferred from the driver’s internal circular buffer to buf. The | ||
294 | maximum amount of data to be transferred is implied by count.</para> | ||
295 | </entry> | ||
296 | </row><row><entry | ||
297 | align="char"> | ||
298 | <para>When returning section data the driver always tries to return a complete single | ||
299 | section (even though buf would provide buffer space for more data). If the size | ||
300 | of the buffer is smaller than the section as much as possible will be returned, | ||
301 | and the remaining data will be provided in subsequent calls.</para> | ||
302 | </entry> | ||
303 | </row><row><entry | ||
304 | align="char"> | ||
305 | <para>The size of the internal buffer is 2 * 4096 bytes (the size of two maximum | ||
306 | sized sections) by default. The size of this buffer may be changed by using the | ||
307 | DMX_SET_BUFFER_SIZE function. If the buffer is not large enough, or if | ||
308 | the read operations are not performed fast enough, this may result in a buffer | ||
309 | overflow error. In this case EOVERFLOW will be returned, and the circular | ||
310 | buffer will be emptied. This call is blocking if there is no data to return, i.e. the | ||
311 | process will be put to sleep waiting for data, unless the O_NONBLOCK flag | ||
312 | is specified.</para> | ||
313 | </entry> | ||
314 | </row><row><entry | ||
315 | align="char"> | ||
316 | <para>Note that in order to be able to read, the filtering process has to be started | ||
317 | by defining either a section or a PES filter by means of the ioctl functions, | ||
318 | and then starting the filtering process via the DMX_START ioctl function | ||
319 | or by setting the DMX_IMMEDIATE_START flag. If the reading is done | ||
320 | from a logical DVR demux device, the data will constitute a Transport Stream | ||
321 | including the packets from all PES filters in the corresponding demux device | ||
322 | /dev/dvb/adapter0/demux0 having the output set to DMX_OUT_TS_TAP.</para> | ||
323 | </entry> | ||
324 | </row></tbody></tgroup></informaltable> | ||
325 | <para>SYNOPSIS | ||
326 | </para> | ||
327 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
328 | align="char"> | ||
329 | <para>size_t read(int fd, void ⋆buf, size_t count);</para> | ||
330 | </entry> | ||
331 | </row></tbody></tgroup></informaltable> | ||
332 | <para>PARAMETERS | ||
333 | </para> | ||
334 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
335 | align="char"> | ||
336 | <para>int fd</para> | ||
337 | </entry><entry | ||
338 | align="char"> | ||
339 | <para>File descriptor returned by a previous call to open().</para> | ||
340 | </entry> | ||
341 | </row><row><entry | ||
342 | align="char"> | ||
343 | <para>void *buf</para> | ||
344 | </entry><entry | ||
345 | align="char"> | ||
346 | <para>Pointer to the buffer to be used for returned filtered data.</para> | ||
347 | </entry> | ||
348 | </row><row><entry | ||
349 | align="char"> | ||
350 | <para>size_t count</para> | ||
351 | </entry><entry | ||
352 | align="char"> | ||
353 | <para>Size of buf.</para> | ||
354 | </entry> | ||
355 | </row></tbody></tgroup></informaltable> | ||
356 | <para>ERRORS | ||
357 | </para> | ||
358 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
359 | align="char"> | ||
360 | <para>EWOULDBLOCK</para> | ||
361 | </entry><entry | ||
362 | align="char"> | ||
363 | <para>No data to return and O_NONBLOCK was specified.</para> | ||
364 | </entry> | ||
365 | </row><row><entry | ||
366 | align="char"> | ||
367 | <para>EBADF</para> | ||
368 | </entry><entry | ||
369 | align="char"> | ||
370 | <para>fd is not a valid open file descriptor.</para> | ||
371 | </entry> | ||
372 | </row><row><entry | ||
373 | align="char"> | ||
374 | <para>ECRC</para> | ||
375 | </entry><entry | ||
376 | align="char"> | ||
377 | <para>Last section had a CRC error - no data returned. The | ||
378 | buffer is flushed.</para> | ||
379 | </entry> | ||
380 | </row><row><entry | ||
381 | align="char"> | ||
382 | <para>EOVERFLOW</para> | ||
383 | </entry><entry | ||
384 | align="char"> | ||
385 | </entry> | ||
386 | </row><row><entry | ||
387 | align="char"> | ||
388 | </entry><entry | ||
389 | align="char"> | ||
390 | <para>The filtered data was not read from the buffer in due | ||
391 | time, resulting in non-read data being lost. The buffer is | ||
392 | flushed.</para> | ||
393 | </entry> | ||
394 | </row><row><entry | ||
395 | align="char"> | ||
396 | <para>ETIMEDOUT</para> | ||
397 | </entry><entry | ||
398 | align="char"> | ||
399 | <para>The section was not loaded within the stated timeout | ||
400 | period. See ioctl DMX_SET_FILTER for how to set a | ||
401 | timeout.</para> | ||
402 | </entry> | ||
403 | </row><row><entry | ||
404 | align="char"> | ||
405 | <para>EFAULT</para> | ||
406 | </entry><entry | ||
407 | align="char"> | ||
408 | <para>The driver failed to write to the callers buffer due to an | ||
409 | invalid *buf pointer.</para> | ||
410 | </entry> | ||
411 | </row></tbody></tgroup></informaltable> | ||
412 | </section> | ||
413 | |||
414 | <section id="dmx_fwrite"> | ||
415 | <title>write()</title> | ||
416 | <para>DESCRIPTION | ||
417 | </para> | ||
418 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
419 | align="char"> | ||
420 | <para>This system call is only provided by the logical device /dev/dvb/adapter0/dvr0, | ||
421 | associated with the physical demux device that provides the actual DVR | ||
422 | functionality. It is used for replay of a digitally recorded Transport Stream. | ||
423 | Matching filters have to be defined in the corresponding physical demux | ||
424 | device, /dev/dvb/adapter0/demux0. The amount of data to be transferred is | ||
425 | implied by count.</para> | ||
426 | </entry> | ||
427 | </row></tbody></tgroup></informaltable> | ||
428 | <para>SYNOPSIS | ||
429 | </para> | ||
430 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
431 | align="char"> | ||
432 | <para>ssize_t write(int fd, const void ⋆buf, size_t | ||
433 | count);</para> | ||
434 | </entry> | ||
435 | </row></tbody></tgroup></informaltable> | ||
436 | <para>PARAMETERS | ||
437 | </para> | ||
438 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
439 | align="char"> | ||
440 | <para>int fd</para> | ||
441 | </entry><entry | ||
442 | align="char"> | ||
443 | <para>File descriptor returned by a previous call to open().</para> | ||
444 | </entry> | ||
445 | </row><row><entry | ||
446 | align="char"> | ||
447 | <para>void *buf</para> | ||
448 | </entry><entry | ||
449 | align="char"> | ||
450 | <para>Pointer to the buffer containing the Transport Stream.</para> | ||
451 | </entry> | ||
452 | </row><row><entry | ||
453 | align="char"> | ||
454 | <para>size_t count</para> | ||
455 | </entry><entry | ||
456 | align="char"> | ||
457 | <para>Size of buf.</para> | ||
458 | </entry> | ||
459 | </row></tbody></tgroup></informaltable> | ||
460 | <para>ERRORS | ||
461 | </para> | ||
462 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
463 | align="char"> | ||
464 | <para>EWOULDBLOCK</para> | ||
465 | </entry><entry | ||
466 | align="char"> | ||
467 | <para>No data was written. This | ||
468 | might happen if O_NONBLOCK was specified and there | ||
469 | is no more buffer space available (if O_NONBLOCK is | ||
470 | not specified the function will block until buffer space is | ||
471 | available).</para> | ||
472 | </entry> | ||
473 | </row><row><entry | ||
474 | align="char"> | ||
475 | <para>EBUSY</para> | ||
476 | </entry><entry | ||
477 | align="char"> | ||
478 | <para>This error code indicates that there are conflicting | ||
479 | requests. The corresponding demux device is setup to | ||
480 | receive data from the front- end. Make sure that these | ||
481 | filters are stopped and that the filters with input set to | ||
482 | DMX_IN_DVR are started.</para> | ||
483 | </entry> | ||
484 | </row><row><entry | ||
485 | align="char"> | ||
486 | <para>EBADF</para> | ||
487 | </entry><entry | ||
488 | align="char"> | ||
489 | <para>fd is not a valid open file descriptor.</para> | ||
490 | </entry> | ||
491 | </row></tbody></tgroup></informaltable> | ||
492 | </section> | ||
493 | |||
494 | <section id="dmx_start"> | ||
495 | <title>DMX_START</title> | ||
496 | <para>DESCRIPTION | ||
497 | </para> | ||
498 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
499 | align="char"> | ||
500 | <para>This ioctl call is used to start the actual filtering operation defined via the ioctl | ||
501 | calls DMX_SET_FILTER or DMX_SET_PES_FILTER.</para> | ||
502 | </entry> | ||
503 | </row></tbody></tgroup></informaltable> | ||
504 | <para>SYNOPSIS | ||
505 | </para> | ||
506 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
507 | align="char"> | ||
508 | <para>int ioctl( int fd, int request = DMX_START);</para> | ||
509 | </entry> | ||
510 | </row></tbody></tgroup></informaltable> | ||
511 | <para>PARAMETERS | ||
512 | </para> | ||
513 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
514 | align="char"> | ||
515 | <para>int fd</para> | ||
516 | </entry><entry | ||
517 | align="char"> | ||
518 | <para>File descriptor returned by a previous call to open().</para> | ||
519 | </entry> | ||
520 | </row><row><entry | ||
521 | align="char"> | ||
522 | <para>int request</para> | ||
523 | </entry><entry | ||
524 | align="char"> | ||
525 | <para>Equals DMX_START for this command.</para> | ||
526 | </entry> | ||
527 | </row></tbody></tgroup></informaltable> | ||
528 | <para>ERRORS | ||
529 | </para> | ||
530 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
531 | align="char"> | ||
532 | <para>EBADF</para> | ||
533 | </entry><entry | ||
534 | align="char"> | ||
535 | <para>fd is not a valid file descriptor.</para> | ||
536 | </entry> | ||
537 | </row><row><entry | ||
538 | align="char"> | ||
539 | <para>EINVAL</para> | ||
540 | </entry><entry | ||
541 | align="char"> | ||
542 | <para>Invalid argument, i.e. no filtering parameters provided via | ||
543 | the DMX_SET_FILTER or DMX_SET_PES_FILTER | ||
544 | functions.</para> | ||
545 | </entry> | ||
546 | </row><row><entry | ||
547 | align="char"> | ||
548 | <para>EBUSY</para> | ||
549 | </entry><entry | ||
550 | align="char"> | ||
551 | <para>This error code indicates that there are conflicting | ||
552 | requests. There are active filters filtering data from | ||
553 | another input source. Make sure that these filters are | ||
554 | stopped before starting this filter.</para> | ||
555 | </entry> | ||
556 | </row></tbody></tgroup></informaltable> | ||
557 | </section> | ||
558 | |||
559 | <section id="dmx_stop"> | ||
560 | <title>DMX_STOP</title> | ||
561 | <para>DESCRIPTION | ||
562 | </para> | ||
563 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
564 | align="char"> | ||
565 | <para>This ioctl call is used to stop the actual filtering operation defined via the | ||
566 | ioctl calls DMX_SET_FILTER or DMX_SET_PES_FILTER and started via | ||
567 | the DMX_START command.</para> | ||
568 | </entry> | ||
569 | </row></tbody></tgroup></informaltable> | ||
570 | <para>SYNOPSIS | ||
571 | </para> | ||
572 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
573 | align="char"> | ||
574 | <para>int ioctl( int fd, int request = DMX_STOP);</para> | ||
575 | </entry> | ||
576 | </row></tbody></tgroup></informaltable> | ||
577 | <para>PARAMETERS | ||
578 | </para> | ||
579 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
580 | align="char"> | ||
581 | <para>int fd</para> | ||
582 | </entry><entry | ||
583 | align="char"> | ||
584 | <para>File descriptor returned by a previous call to open().</para> | ||
585 | </entry> | ||
586 | </row><row><entry | ||
587 | align="char"> | ||
588 | <para>int request</para> | ||
589 | </entry><entry | ||
590 | align="char"> | ||
591 | <para>Equals DMX_STOP for this command.</para> | ||
592 | </entry> | ||
593 | </row></tbody></tgroup></informaltable> | ||
594 | <para>ERRORS | ||
595 | </para> | ||
596 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
597 | align="char"> | ||
598 | <para>EBADF</para> | ||
599 | </entry><entry | ||
600 | align="char"> | ||
601 | <para>fd is not a valid file descriptor.</para> | ||
602 | </entry> | ||
603 | </row></tbody></tgroup></informaltable> | ||
604 | </section> | ||
605 | |||
606 | <section id="dmx_set_filter"> | ||
607 | <title>DMX_SET_FILTER</title> | ||
608 | <para>DESCRIPTION | ||
609 | </para> | ||
610 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
611 | align="char"> | ||
612 | <para>This ioctl call sets up a filter according to the filter and mask parameters | ||
613 | provided. A timeout may be defined stating number of seconds to wait for a | ||
614 | section to be loaded. A value of 0 means that no timeout should be applied. | ||
615 | Finally there is a flag field where it is possible to state whether a section should | ||
616 | be CRC-checked, whether the filter should be a ”one-shot” filter, i.e. if the | ||
617 | filtering operation should be stopped after the first section is received, and | ||
618 | whether the filtering operation should be started immediately (without waiting | ||
619 | for a DMX_START ioctl call). If a filter was previously set-up, this filter will | ||
620 | be canceled, and the receive buffer will be flushed.</para> | ||
621 | </entry> | ||
622 | </row></tbody></tgroup></informaltable> | ||
623 | <para>SYNOPSIS | ||
624 | </para> | ||
625 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
626 | align="char"> | ||
627 | <para>int ioctl( int fd, int request = DMX_SET_FILTER, | ||
628 | struct dmx_sct_filter_params ⋆params);</para> | ||
629 | </entry> | ||
630 | </row></tbody></tgroup></informaltable> | ||
631 | <para>PARAMETERS | ||
632 | </para> | ||
633 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
634 | align="char"> | ||
635 | <para>int fd</para> | ||
636 | </entry><entry | ||
637 | align="char"> | ||
638 | <para>File descriptor returned by a previous call to open().</para> | ||
639 | </entry> | ||
640 | </row><row><entry | ||
641 | align="char"> | ||
642 | <para>int request</para> | ||
643 | </entry><entry | ||
644 | align="char"> | ||
645 | <para>Equals DMX_SET_FILTER for this command.</para> | ||
646 | </entry> | ||
647 | </row><row><entry | ||
648 | align="char"> | ||
649 | <para>struct | ||
650 | dmx_sct_filter_params | ||
651 | *params</para> | ||
652 | </entry><entry | ||
653 | align="char"> | ||
654 | <para>Pointer to structure containing filter parameters.</para> | ||
655 | </entry> | ||
656 | </row></tbody></tgroup></informaltable> | ||
657 | <para>ERRORS | ||
658 | </para> | ||
659 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
660 | align="char"> | ||
661 | <para>EBADF</para> | ||
662 | </entry><entry | ||
663 | align="char"> | ||
664 | <para>fd is not a valid file descriptor.</para> | ||
665 | </entry> | ||
666 | </row><row><entry | ||
667 | align="char"> | ||
668 | <para>EINVAL</para> | ||
669 | </entry><entry | ||
670 | align="char"> | ||
671 | <para>Invalid argument.</para> | ||
672 | </entry> | ||
673 | </row></tbody></tgroup></informaltable> | ||
674 | </section> | ||
675 | |||
676 | <section id="dmx_set_pes_filter"> | ||
677 | <title>DMX_SET_PES_FILTER</title> | ||
678 | <para>DESCRIPTION | ||
679 | </para> | ||
680 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
681 | align="char"> | ||
682 | <para>This ioctl call sets up a PES filter according to the parameters provided. By a | ||
683 | PES filter is meant a filter that is based just on the packet identifier (PID), i.e. | ||
684 | no PES header or payload filtering capability is supported.</para> | ||
685 | </entry> | ||
686 | </row><row><entry | ||
687 | align="char"> | ||
688 | <para>The transport stream destination for the filtered output may be set. Also the | ||
689 | PES type may be stated in order to be able to e.g. direct a video stream directly | ||
690 | to the video decoder. Finally there is a flag field where it is possible to state | ||
691 | whether the filtering operation should be started immediately (without waiting | ||
692 | for a DMX_START ioctl call). If a filter was previously set-up, this filter will | ||
693 | be cancelled, and the receive buffer will be flushed.</para> | ||
694 | </entry> | ||
695 | </row></tbody></tgroup></informaltable> | ||
696 | <para>SYNOPSIS | ||
697 | </para> | ||
698 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
699 | align="char"> | ||
700 | <para>int ioctl( int fd, int request = DMX_SET_PES_FILTER, | ||
701 | struct dmx_pes_filter_params ⋆params);</para> | ||
702 | </entry> | ||
703 | </row></tbody></tgroup></informaltable> | ||
704 | <para>PARAMETERS | ||
705 | </para> | ||
706 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
707 | align="char"> | ||
708 | <para>int fd</para> | ||
709 | </entry><entry | ||
710 | align="char"> | ||
711 | <para>File descriptor returned by a previous call to open().</para> | ||
712 | </entry> | ||
713 | </row><row><entry | ||
714 | align="char"> | ||
715 | <para>int request</para> | ||
716 | </entry><entry | ||
717 | align="char"> | ||
718 | <para>Equals DMX_SET_PES_FILTER for this command.</para> | ||
719 | </entry> | ||
720 | </row><row><entry | ||
721 | align="char"> | ||
722 | <para>struct | ||
723 | dmx_pes_filter_params | ||
724 | *params</para> | ||
725 | </entry><entry | ||
726 | align="char"> | ||
727 | <para>Pointer to structure containing filter parameters.</para> | ||
728 | </entry> | ||
729 | </row></tbody></tgroup></informaltable> | ||
730 | <para>ERRORS | ||
731 | </para> | ||
732 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
733 | align="char"> | ||
734 | <para>EBADF</para> | ||
735 | </entry><entry | ||
736 | align="char"> | ||
737 | <para>fd is not a valid file descriptor.</para> | ||
738 | </entry> | ||
739 | </row><row><entry | ||
740 | align="char"> | ||
741 | <para>EINVAL</para> | ||
742 | </entry><entry | ||
743 | align="char"> | ||
744 | <para>Invalid argument.</para> | ||
745 | </entry> | ||
746 | </row><row><entry | ||
747 | align="char"> | ||
748 | <para>EBUSY</para> | ||
749 | </entry><entry | ||
750 | align="char"> | ||
751 | <para>This error code indicates that there are conflicting | ||
752 | requests. There are active filters filtering data from | ||
753 | another input source. Make sure that these filters are | ||
754 | stopped before starting this filter.</para> | ||
755 | </entry> | ||
756 | </row></tbody></tgroup></informaltable> | ||
757 | </section> | ||
758 | |||
759 | <section id="dms_set_buffer_size"> | ||
760 | <title>DMX_SET_BUFFER_SIZE</title> | ||
761 | <para>DESCRIPTION | ||
762 | </para> | ||
763 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
764 | align="char"> | ||
765 | <para>This ioctl call is used to set the size of the circular buffer used for filtered data. | ||
766 | The default size is two maximum sized sections, i.e. if this function is not called | ||
767 | a buffer size of 2 * 4096 bytes will be used.</para> | ||
768 | </entry> | ||
769 | </row></tbody></tgroup></informaltable> | ||
770 | <para>SYNOPSIS | ||
771 | </para> | ||
772 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
773 | align="char"> | ||
774 | <para>int ioctl( int fd, int request = | ||
775 | DMX_SET_BUFFER_SIZE, unsigned long size);</para> | ||
776 | </entry> | ||
777 | </row></tbody></tgroup></informaltable> | ||
778 | <para>PARAMETERS | ||
779 | </para> | ||
780 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
781 | align="char"> | ||
782 | <para>int fd</para> | ||
783 | </entry><entry | ||
784 | align="char"> | ||
785 | <para>File descriptor returned by a previous call to open().</para> | ||
786 | </entry> | ||
787 | </row><row><entry | ||
788 | align="char"> | ||
789 | <para>int request</para> | ||
790 | </entry><entry | ||
791 | align="char"> | ||
792 | <para>Equals DMX_SET_BUFFER_SIZE for this command.</para> | ||
793 | </entry> | ||
794 | </row><row><entry | ||
795 | align="char"> | ||
796 | <para>unsigned long size</para> | ||
797 | </entry><entry | ||
798 | align="char"> | ||
799 | <para>Size of circular buffer.</para> | ||
800 | </entry> | ||
801 | </row></tbody></tgroup></informaltable> | ||
802 | <para>ERRORS | ||
803 | </para> | ||
804 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
805 | align="char"> | ||
806 | <para>EBADF</para> | ||
807 | </entry><entry | ||
808 | align="char"> | ||
809 | <para>fd is not a valid file descriptor.</para> | ||
810 | </entry> | ||
811 | </row><row><entry | ||
812 | align="char"> | ||
813 | <para>ENOMEM</para> | ||
814 | </entry><entry | ||
815 | align="char"> | ||
816 | <para>The driver was not able to allocate a buffer of the | ||
817 | requested size.</para> | ||
818 | </entry> | ||
819 | </row></tbody></tgroup></informaltable> | ||
820 | </section> | ||
821 | |||
822 | <section id="dmx_get_event"> | ||
823 | <title>DMX_GET_EVENT</title> | ||
824 | <para>DESCRIPTION | ||
825 | </para> | ||
826 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
827 | align="char"> | ||
828 | <para>This ioctl call returns an event if available. If an event is not available, | ||
829 | the behavior depends on whether the device is in blocking or non-blocking | ||
830 | mode. In the latter case, the call fails immediately with errno set to | ||
831 | EWOULDBLOCK. In the former case, the call blocks until an event becomes | ||
832 | available.</para> | ||
833 | </entry> | ||
834 | </row><row><entry | ||
835 | align="char"> | ||
836 | <para>The standard Linux poll() and/or select() system calls can be used with the | ||
837 | device file descriptor to watch for new events. For select(), the file descriptor | ||
838 | should be included in the exceptfds argument, and for poll(), POLLPRI should | ||
839 | be specified as the wake-up condition. Only the latest event for each filter is | ||
840 | saved.</para> | ||
841 | </entry> | ||
842 | </row></tbody></tgroup></informaltable> | ||
843 | <para>SYNOPSIS | ||
844 | </para> | ||
845 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
846 | align="char"> | ||
847 | <para>int ioctl( int fd, int request = DMX_GET_EVENT, | ||
848 | struct dmx_event ⋆ev);</para> | ||
849 | </entry> | ||
850 | </row></tbody></tgroup></informaltable> | ||
851 | <para>PARAMETERS | ||
852 | </para> | ||
853 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
854 | align="char"> | ||
855 | <para>int fd</para> | ||
856 | </entry><entry | ||
857 | align="char"> | ||
858 | <para>File descriptor returned by a previous call to open().</para> | ||
859 | </entry> | ||
860 | </row><row><entry | ||
861 | align="char"> | ||
862 | <para>int request</para> | ||
863 | </entry><entry | ||
864 | align="char"> | ||
865 | <para>Equals DMX_GET_EVENT for this command.</para> | ||
866 | </entry> | ||
867 | </row><row><entry | ||
868 | align="char"> | ||
869 | <para>struct dmx_event *ev</para> | ||
870 | </entry><entry | ||
871 | align="char"> | ||
872 | <para>Pointer to the location where the event is to be stored.</para> | ||
873 | </entry> | ||
874 | </row></tbody></tgroup></informaltable> | ||
875 | <para>ERRORS | ||
876 | </para> | ||
877 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
878 | align="char"> | ||
879 | <para>EBADF</para> | ||
880 | </entry><entry | ||
881 | align="char"> | ||
882 | <para>fd is not a valid file descriptor.</para> | ||
883 | </entry> | ||
884 | </row><row><entry | ||
885 | align="char"> | ||
886 | <para>EFAULT</para> | ||
887 | </entry><entry | ||
888 | align="char"> | ||
889 | <para>ev points to an invalid address.</para> | ||
890 | </entry> | ||
891 | </row><row><entry | ||
892 | align="char"> | ||
893 | <para>EWOULDBLOCK</para> | ||
894 | </entry><entry | ||
895 | align="char"> | ||
896 | <para>There is no event pending, and the device is in | ||
897 | non-blocking mode.</para> | ||
898 | </entry> | ||
899 | </row></tbody></tgroup></informaltable> | ||
900 | </section> | ||
901 | |||
902 | <section id="dmx_get_stc"> | ||
903 | <title>DMX_GET_STC</title> | ||
904 | <para>DESCRIPTION | ||
905 | </para> | ||
906 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
907 | align="char"> | ||
908 | <para>This ioctl call returns the current value of the system time counter (which is driven | ||
909 | by a PES filter of type DMX_PES_PCR). Some hardware supports more than one | ||
910 | STC, so you must specify which one by setting the num field of stc before the ioctl | ||
911 | (range 0...n). The result is returned in form of a ratio with a 64 bit numerator | ||
912 | and a 32 bit denominator, so the real 90kHz STC value is stc->stc / | ||
913 | stc->base | ||
914 | .</para> | ||
915 | </entry> | ||
916 | </row></tbody></tgroup></informaltable> | ||
917 | <para>SYNOPSIS | ||
918 | </para> | ||
919 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
920 | align="char"> | ||
921 | <para>int ioctl( int fd, int request = DMX_GET_STC, struct | ||
922 | dmx_stc ⋆stc);</para> | ||
923 | </entry> | ||
924 | </row></tbody></tgroup></informaltable> | ||
925 | <para>PARAMETERS | ||
926 | </para> | ||
927 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
928 | align="char"> | ||
929 | <para>int fd</para> | ||
930 | </entry><entry | ||
931 | align="char"> | ||
932 | <para>File descriptor returned by a previous call to open().</para> | ||
933 | </entry> | ||
934 | </row><row><entry | ||
935 | align="char"> | ||
936 | <para>int request</para> | ||
937 | </entry><entry | ||
938 | align="char"> | ||
939 | <para>Equals DMX_GET_STC for this command.</para> | ||
940 | </entry> | ||
941 | </row><row><entry | ||
942 | align="char"> | ||
943 | <para>struct dmx_stc *stc</para> | ||
944 | </entry><entry | ||
945 | align="char"> | ||
946 | <para>Pointer to the location where the stc is to be stored.</para> | ||
947 | </entry> | ||
948 | </row></tbody></tgroup></informaltable> | ||
949 | <para>ERRORS | ||
950 | </para> | ||
951 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
952 | align="char"> | ||
953 | <para>EBADF</para> | ||
954 | </entry><entry | ||
955 | align="char"> | ||
956 | <para>fd is not a valid file descriptor.</para> | ||
957 | </entry> | ||
958 | </row><row><entry | ||
959 | align="char"> | ||
960 | <para>EFAULT</para> | ||
961 | </entry><entry | ||
962 | align="char"> | ||
963 | <para>stc points to an invalid address.</para> | ||
964 | </entry> | ||
965 | </row><row><entry | ||
966 | align="char"> | ||
967 | <para>EINVAL</para> | ||
968 | </entry><entry | ||
969 | align="char"> | ||
970 | <para>Invalid stc number.</para> | ||
971 | </entry> | ||
972 | </row></tbody></tgroup></informaltable> | ||
973 | </section></section> | ||
diff --git a/Documentation/DocBook/dvb/dvbapi.xml b/Documentation/DocBook/dvb/dvbapi.xml new file mode 100644 index 000000000000..d53ca4e98e84 --- /dev/null +++ b/Documentation/DocBook/dvb/dvbapi.xml | |||
@@ -0,0 +1,79 @@ | |||
1 | <partinfo> | ||
2 | <authorgroup> | ||
3 | <author> | ||
4 | <firstname>Ralph</firstname> | ||
5 | <surname>Metzler</surname> | ||
6 | <othername role="mi">J. K.</othername> | ||
7 | <affiliation><address><email>rjkm@metzlerbros.de</email></address></affiliation> | ||
8 | </author> | ||
9 | <author> | ||
10 | <firstname>Marcus</firstname> | ||
11 | <surname>Metzler</surname> | ||
12 | <othername role="mi">O. C.</othername> | ||
13 | <affiliation><address><email>rjkm@metzlerbros.de</email></address></affiliation> | ||
14 | </author> | ||
15 | <author> | ||
16 | <firstname>Mauro</firstname> | ||
17 | <surname>Chehab</surname> | ||
18 | <othername role="mi">Carvalho</othername> | ||
19 | <affiliation><address><email>mchehab@redhat.com</email></address></affiliation> | ||
20 | <contrib>Ported document to Docbook XML.</contrib> | ||
21 | </author> | ||
22 | </authorgroup> | ||
23 | <copyright> | ||
24 | <year>2002</year> | ||
25 | <year>2003</year> | ||
26 | <year>2009</year> | ||
27 | <holder>Convergence GmbH</holder> | ||
28 | </copyright> | ||
29 | |||
30 | <revhistory> | ||
31 | <!-- Put document revisions here, newest first. --> | ||
32 | <revision> | ||
33 | <revnumber>2.0.0</revnumber> | ||
34 | <date>2009-09-06</date> | ||
35 | <authorinitials>mcc</authorinitials> | ||
36 | <revremark>Conversion from LaTex to DocBook XML. The | ||
37 | contents is the same as the original LaTex version.</revremark> | ||
38 | </revision> | ||
39 | <revision> | ||
40 | <revnumber>1.0.0</revnumber> | ||
41 | <date>2003-07-24</date> | ||
42 | <authorinitials>rjkm</authorinitials> | ||
43 | <revremark>Initial revision on LaTEX.</revremark> | ||
44 | </revision> | ||
45 | </revhistory> | ||
46 | </partinfo> | ||
47 | |||
48 | |||
49 | <title>LINUX DVB API</title> | ||
50 | <subtitle>Version 3</subtitle> | ||
51 | <!-- ADD THE CHAPTERS HERE --> | ||
52 | <chapter id="dvb_introdution"> | ||
53 | &sub-intro; | ||
54 | </chapter> | ||
55 | <chapter id="dvb_frontend"> | ||
56 | &sub-frontend; | ||
57 | </chapter> | ||
58 | <chapter id="dvb_demux"> | ||
59 | &sub-demux; | ||
60 | </chapter> | ||
61 | <chapter id="dvb_video"> | ||
62 | &sub-video; | ||
63 | </chapter> | ||
64 | <chapter id="dvb_audio"> | ||
65 | &sub-audio; | ||
66 | </chapter> | ||
67 | <chapter id="dvb_ca"> | ||
68 | &sub-ca; | ||
69 | </chapter> | ||
70 | <chapter id="dvb_net"> | ||
71 | &sub-net; | ||
72 | </chapter> | ||
73 | <chapter id="dvb_kdapi"> | ||
74 | &sub-kdapi; | ||
75 | </chapter> | ||
76 | <chapter id="dvb_examples"> | ||
77 | &sub-examples; | ||
78 | </chapter> | ||
79 | <!-- END OF CHAPTERS --> | ||
diff --git a/Documentation/DocBook/dvb/dvbstb.pdf b/Documentation/DocBook/dvb/dvbstb.pdf new file mode 100644 index 000000000000..0fa75d90c3eb --- /dev/null +++ b/Documentation/DocBook/dvb/dvbstb.pdf | |||
Binary files differ | |||
diff --git a/Documentation/DocBook/dvb/dvbstb.png b/Documentation/DocBook/dvb/dvbstb.png new file mode 100644 index 000000000000..9b8f372e7afd --- /dev/null +++ b/Documentation/DocBook/dvb/dvbstb.png | |||
Binary files differ | |||
diff --git a/Documentation/DocBook/dvb/examples.xml b/Documentation/DocBook/dvb/examples.xml new file mode 100644 index 000000000000..b89dceda6048 --- /dev/null +++ b/Documentation/DocBook/dvb/examples.xml | |||
@@ -0,0 +1,365 @@ | |||
1 | <title>Examples</title> | ||
2 | <para>In this section we would like to present some examples for using the DVB API. | ||
3 | </para> | ||
4 | <para>Maintainer note: This section is out of date. Please refer to the sample programs packaged | ||
5 | with the driver distribution from <emphasis role="tt">http://linuxtv.org/</emphasis>. | ||
6 | </para> | ||
7 | |||
8 | <section id="tuning"> | ||
9 | <title>Tuning</title> | ||
10 | <para>We will start with a generic tuning subroutine that uses the frontend and SEC, as well as | ||
11 | the demux devices. The example is given for QPSK tuners, but can easily be adjusted for | ||
12 | QAM. | ||
13 | </para> | ||
14 | <programlisting> | ||
15 | #include <sys/ioctl.h> | ||
16 | #include <stdio.h> | ||
17 | #include <stdint.h> | ||
18 | #include <sys/types.h> | ||
19 | #include <sys/stat.h> | ||
20 | #include <fcntl.h> | ||
21 | #include <time.h> | ||
22 | #include <unistd.h> | ||
23 | |||
24 | #include <linux/dvb/dmx.h> | ||
25 | #include <linux/dvb/frontend.h> | ||
26 | #include <linux/dvb/sec.h> | ||
27 | #include <sys/poll.h> | ||
28 | |||
29 | #define DMX "/dev/dvb/adapter0/demux1" | ||
30 | #define FRONT "/dev/dvb/adapter0/frontend1" | ||
31 | #define SEC "/dev/dvb/adapter0/sec1" | ||
32 | |||
33 | /⋆ routine for checking if we have a signal and other status information⋆/ | ||
34 | int FEReadStatus(int fd, fe_status_t ⋆stat) | ||
35 | { | ||
36 | int ans; | ||
37 | |||
38 | if ( (ans = ioctl(fd,FE_READ_STATUS,stat) < 0)){ | ||
39 | perror("FE READ STATUS: "); | ||
40 | return -1; | ||
41 | } | ||
42 | |||
43 | if (⋆stat & FE_HAS_POWER) | ||
44 | printf("FE HAS POWER\n"); | ||
45 | |||
46 | if (⋆stat & FE_HAS_SIGNAL) | ||
47 | printf("FE HAS SIGNAL\n"); | ||
48 | |||
49 | if (⋆stat & FE_SPECTRUM_INV) | ||
50 | printf("SPEKTRUM INV\n"); | ||
51 | |||
52 | return 0; | ||
53 | } | ||
54 | |||
55 | |||
56 | /⋆ tune qpsk ⋆/ | ||
57 | /⋆ freq: frequency of transponder ⋆/ | ||
58 | /⋆ vpid, apid, tpid: PIDs of video, audio and teletext TS packets ⋆/ | ||
59 | /⋆ diseqc: DiSEqC address of the used LNB ⋆/ | ||
60 | /⋆ pol: Polarisation ⋆/ | ||
61 | /⋆ srate: Symbol Rate ⋆/ | ||
62 | /⋆ fec. FEC ⋆/ | ||
63 | /⋆ lnb_lof1: local frequency of lower LNB band ⋆/ | ||
64 | /⋆ lnb_lof2: local frequency of upper LNB band ⋆/ | ||
65 | /⋆ lnb_slof: switch frequency of LNB ⋆/ | ||
66 | |||
67 | int set_qpsk_channel(int freq, int vpid, int apid, int tpid, | ||
68 | int diseqc, int pol, int srate, int fec, int lnb_lof1, | ||
69 | int lnb_lof2, int lnb_slof) | ||
70 | { | ||
71 | struct secCommand scmd; | ||
72 | struct secCmdSequence scmds; | ||
73 | struct dmx_pes_filter_params pesFilterParams; | ||
74 | FrontendParameters frp; | ||
75 | struct pollfd pfd[1]; | ||
76 | FrontendEvent event; | ||
77 | int demux1, demux2, demux3, front; | ||
78 | |||
79 | frequency = (uint32_t) freq; | ||
80 | symbolrate = (uint32_t) srate; | ||
81 | |||
82 | if((front = open(FRONT,O_RDWR)) < 0){ | ||
83 | perror("FRONTEND DEVICE: "); | ||
84 | return -1; | ||
85 | } | ||
86 | |||
87 | if((sec = open(SEC,O_RDWR)) < 0){ | ||
88 | perror("SEC DEVICE: "); | ||
89 | return -1; | ||
90 | } | ||
91 | |||
92 | if (demux1 < 0){ | ||
93 | if ((demux1=open(DMX, O_RDWR|O_NONBLOCK)) | ||
94 | < 0){ | ||
95 | perror("DEMUX DEVICE: "); | ||
96 | return -1; | ||
97 | } | ||
98 | } | ||
99 | |||
100 | if (demux2 < 0){ | ||
101 | if ((demux2=open(DMX, O_RDWR|O_NONBLOCK)) | ||
102 | < 0){ | ||
103 | perror("DEMUX DEVICE: "); | ||
104 | return -1; | ||
105 | } | ||
106 | } | ||
107 | |||
108 | if (demux3 < 0){ | ||
109 | if ((demux3=open(DMX, O_RDWR|O_NONBLOCK)) | ||
110 | < 0){ | ||
111 | perror("DEMUX DEVICE: "); | ||
112 | return -1; | ||
113 | } | ||
114 | } | ||
115 | |||
116 | if (freq < lnb_slof) { | ||
117 | frp.Frequency = (freq - lnb_lof1); | ||
118 | scmds.continuousTone = SEC_TONE_OFF; | ||
119 | } else { | ||
120 | frp.Frequency = (freq - lnb_lof2); | ||
121 | scmds.continuousTone = SEC_TONE_ON; | ||
122 | } | ||
123 | frp.Inversion = INVERSION_AUTO; | ||
124 | if (pol) scmds.voltage = SEC_VOLTAGE_18; | ||
125 | else scmds.voltage = SEC_VOLTAGE_13; | ||
126 | |||
127 | scmd.type=0; | ||
128 | scmd.u.diseqc.addr=0x10; | ||
129 | scmd.u.diseqc.cmd=0x38; | ||
130 | scmd.u.diseqc.numParams=1; | ||
131 | scmd.u.diseqc.params[0] = 0xF0 | ((diseqc ⋆ 4) & 0x0F) | | ||
132 | (scmds.continuousTone == SEC_TONE_ON ? 1 : 0) | | ||
133 | (scmds.voltage==SEC_VOLTAGE_18 ? 2 : 0); | ||
134 | |||
135 | scmds.miniCommand=SEC_MINI_NONE; | ||
136 | scmds.numCommands=1; | ||
137 | scmds.commands=&scmd; | ||
138 | if (ioctl(sec, SEC_SEND_SEQUENCE, &scmds) < 0){ | ||
139 | perror("SEC SEND: "); | ||
140 | return -1; | ||
141 | } | ||
142 | |||
143 | if (ioctl(sec, SEC_SEND_SEQUENCE, &scmds) < 0){ | ||
144 | perror("SEC SEND: "); | ||
145 | return -1; | ||
146 | } | ||
147 | |||
148 | frp.u.qpsk.SymbolRate = srate; | ||
149 | frp.u.qpsk.FEC_inner = fec; | ||
150 | |||
151 | if (ioctl(front, FE_SET_FRONTEND, &frp) < 0){ | ||
152 | perror("QPSK TUNE: "); | ||
153 | return -1; | ||
154 | } | ||
155 | |||
156 | pfd[0].fd = front; | ||
157 | pfd[0].events = POLLIN; | ||
158 | |||
159 | if (poll(pfd,1,3000)){ | ||
160 | if (pfd[0].revents & POLLIN){ | ||
161 | printf("Getting QPSK event\n"); | ||
162 | if ( ioctl(front, FE_GET_EVENT, &event) | ||
163 | |||
164 | == -EOVERFLOW){ | ||
165 | perror("qpsk get event"); | ||
166 | return -1; | ||
167 | } | ||
168 | printf("Received "); | ||
169 | switch(event.type){ | ||
170 | case FE_UNEXPECTED_EV: | ||
171 | printf("unexpected event\n"); | ||
172 | return -1; | ||
173 | case FE_FAILURE_EV: | ||
174 | printf("failure event\n"); | ||
175 | return -1; | ||
176 | |||
177 | case FE_COMPLETION_EV: | ||
178 | printf("completion event\n"); | ||
179 | } | ||
180 | } | ||
181 | } | ||
182 | |||
183 | |||
184 | pesFilterParams.pid = vpid; | ||
185 | pesFilterParams.input = DMX_IN_FRONTEND; | ||
186 | pesFilterParams.output = DMX_OUT_DECODER; | ||
187 | pesFilterParams.pes_type = DMX_PES_VIDEO; | ||
188 | pesFilterParams.flags = DMX_IMMEDIATE_START; | ||
189 | if (ioctl(demux1, DMX_SET_PES_FILTER, &pesFilterParams) < 0){ | ||
190 | perror("set_vpid"); | ||
191 | return -1; | ||
192 | } | ||
193 | |||
194 | pesFilterParams.pid = apid; | ||
195 | pesFilterParams.input = DMX_IN_FRONTEND; | ||
196 | pesFilterParams.output = DMX_OUT_DECODER; | ||
197 | pesFilterParams.pes_type = DMX_PES_AUDIO; | ||
198 | pesFilterParams.flags = DMX_IMMEDIATE_START; | ||
199 | if (ioctl(demux2, DMX_SET_PES_FILTER, &pesFilterParams) < 0){ | ||
200 | perror("set_apid"); | ||
201 | return -1; | ||
202 | } | ||
203 | |||
204 | pesFilterParams.pid = tpid; | ||
205 | pesFilterParams.input = DMX_IN_FRONTEND; | ||
206 | pesFilterParams.output = DMX_OUT_DECODER; | ||
207 | pesFilterParams.pes_type = DMX_PES_TELETEXT; | ||
208 | pesFilterParams.flags = DMX_IMMEDIATE_START; | ||
209 | if (ioctl(demux3, DMX_SET_PES_FILTER, &pesFilterParams) < 0){ | ||
210 | perror("set_tpid"); | ||
211 | return -1; | ||
212 | } | ||
213 | |||
214 | return has_signal(fds); | ||
215 | } | ||
216 | |||
217 | </programlisting> | ||
218 | <para>The program assumes that you are using a universal LNB and a standard DiSEqC | ||
219 | switch with up to 4 addresses. Of course, you could build in some more checking if | ||
220 | tuning was successful and maybe try to repeat the tuning process. Depending on the | ||
221 | external hardware, i.e. LNB and DiSEqC switch, and weather conditions this may be | ||
222 | necessary. | ||
223 | </para> | ||
224 | </section> | ||
225 | |||
226 | <section id="the_dvr_device"> | ||
227 | <title>The DVR device</title> | ||
228 | <para>The following program code shows how to use the DVR device for recording. | ||
229 | </para> | ||
230 | <programlisting> | ||
231 | #include <sys/ioctl.h> | ||
232 | #include <stdio.h> | ||
233 | #include <stdint.h> | ||
234 | #include <sys/types.h> | ||
235 | #include <sys/stat.h> | ||
236 | #include <fcntl.h> | ||
237 | #include <time.h> | ||
238 | #include <unistd.h> | ||
239 | |||
240 | #include <linux/dvb/dmx.h> | ||
241 | #include <linux/dvb/video.h> | ||
242 | #include <sys/poll.h> | ||
243 | #define DVR "/dev/dvb/adapter0/dvr1" | ||
244 | #define AUDIO "/dev/dvb/adapter0/audio1" | ||
245 | #define VIDEO "/dev/dvb/adapter0/video1" | ||
246 | |||
247 | #define BUFFY (188⋆20) | ||
248 | #define MAX_LENGTH (1024⋆1024⋆5) /⋆ record 5MB ⋆/ | ||
249 | |||
250 | |||
251 | /⋆ switch the demuxes to recording, assuming the transponder is tuned ⋆/ | ||
252 | |||
253 | /⋆ demux1, demux2: file descriptor of video and audio filters ⋆/ | ||
254 | /⋆ vpid, apid: PIDs of video and audio channels ⋆/ | ||
255 | |||
256 | int switch_to_record(int demux1, int demux2, uint16_t vpid, uint16_t apid) | ||
257 | { | ||
258 | struct dmx_pes_filter_params pesFilterParams; | ||
259 | |||
260 | if (demux1 < 0){ | ||
261 | if ((demux1=open(DMX, O_RDWR|O_NONBLOCK)) | ||
262 | < 0){ | ||
263 | perror("DEMUX DEVICE: "); | ||
264 | return -1; | ||
265 | } | ||
266 | } | ||
267 | |||
268 | if (demux2 < 0){ | ||
269 | if ((demux2=open(DMX, O_RDWR|O_NONBLOCK)) | ||
270 | < 0){ | ||
271 | perror("DEMUX DEVICE: "); | ||
272 | return -1; | ||
273 | } | ||
274 | } | ||
275 | |||
276 | pesFilterParams.pid = vpid; | ||
277 | pesFilterParams.input = DMX_IN_FRONTEND; | ||
278 | pesFilterParams.output = DMX_OUT_TS_TAP; | ||
279 | pesFilterParams.pes_type = DMX_PES_VIDEO; | ||
280 | pesFilterParams.flags = DMX_IMMEDIATE_START; | ||
281 | if (ioctl(demux1, DMX_SET_PES_FILTER, &pesFilterParams) < 0){ | ||
282 | perror("DEMUX DEVICE"); | ||
283 | return -1; | ||
284 | } | ||
285 | pesFilterParams.pid = apid; | ||
286 | pesFilterParams.input = DMX_IN_FRONTEND; | ||
287 | pesFilterParams.output = DMX_OUT_TS_TAP; | ||
288 | pesFilterParams.pes_type = DMX_PES_AUDIO; | ||
289 | pesFilterParams.flags = DMX_IMMEDIATE_START; | ||
290 | if (ioctl(demux2, DMX_SET_PES_FILTER, &pesFilterParams) < 0){ | ||
291 | perror("DEMUX DEVICE"); | ||
292 | return -1; | ||
293 | } | ||
294 | return 0; | ||
295 | } | ||
296 | |||
297 | /⋆ start recording MAX_LENGTH , assuming the transponder is tuned ⋆/ | ||
298 | |||
299 | /⋆ demux1, demux2: file descriptor of video and audio filters ⋆/ | ||
300 | /⋆ vpid, apid: PIDs of video and audio channels ⋆/ | ||
301 | int record_dvr(int demux1, int demux2, uint16_t vpid, uint16_t apid) | ||
302 | { | ||
303 | int i; | ||
304 | int len; | ||
305 | int written; | ||
306 | uint8_t buf[BUFFY]; | ||
307 | uint64_t length; | ||
308 | struct pollfd pfd[1]; | ||
309 | int dvr, dvr_out; | ||
310 | |||
311 | /⋆ open dvr device ⋆/ | ||
312 | if ((dvr = open(DVR, O_RDONLY|O_NONBLOCK)) < 0){ | ||
313 | perror("DVR DEVICE"); | ||
314 | return -1; | ||
315 | } | ||
316 | |||
317 | /⋆ switch video and audio demuxes to dvr ⋆/ | ||
318 | printf ("Switching dvr on\n"); | ||
319 | i = switch_to_record(demux1, demux2, vpid, apid); | ||
320 | printf("finished: "); | ||
321 | |||
322 | printf("Recording %2.0f MB of test file in TS format\n", | ||
323 | MAX_LENGTH/(1024.0⋆1024.0)); | ||
324 | length = 0; | ||
325 | |||
326 | /⋆ open output file ⋆/ | ||
327 | if ((dvr_out = open(DVR_FILE,O_WRONLY|O_CREAT | ||
328 | |O_TRUNC, S_IRUSR|S_IWUSR | ||
329 | |S_IRGRP|S_IWGRP|S_IROTH| | ||
330 | S_IWOTH)) < 0){ | ||
331 | perror("Can't open file for dvr test"); | ||
332 | return -1; | ||
333 | } | ||
334 | |||
335 | pfd[0].fd = dvr; | ||
336 | pfd[0].events = POLLIN; | ||
337 | |||
338 | /⋆ poll for dvr data and write to file ⋆/ | ||
339 | while (length < MAX_LENGTH ) { | ||
340 | if (poll(pfd,1,1)){ | ||
341 | if (pfd[0].revents & POLLIN){ | ||
342 | len = read(dvr, buf, BUFFY); | ||
343 | if (len < 0){ | ||
344 | perror("recording"); | ||
345 | return -1; | ||
346 | } | ||
347 | if (len > 0){ | ||
348 | written = 0; | ||
349 | while (written < len) | ||
350 | written += | ||
351 | write (dvr_out, | ||
352 | buf, len); | ||
353 | length += len; | ||
354 | printf("written %2.0f MB\r", | ||
355 | length/1024./1024.); | ||
356 | } | ||
357 | } | ||
358 | } | ||
359 | } | ||
360 | return 0; | ||
361 | } | ||
362 | |||
363 | </programlisting> | ||
364 | |||
365 | </section> | ||
diff --git a/Documentation/DocBook/dvb/frontend.xml b/Documentation/DocBook/dvb/frontend.xml new file mode 100644 index 000000000000..91a749f70cb8 --- /dev/null +++ b/Documentation/DocBook/dvb/frontend.xml | |||
@@ -0,0 +1,1765 @@ | |||
1 | <title>DVB Frontend API</title> | ||
2 | |||
3 | <para>The DVB frontend device controls the tuner and DVB demodulator | ||
4 | hardware. It can be accessed through <emphasis | ||
5 | role="tt">/dev/dvb/adapter0/frontend0</emphasis>. Data types and and | ||
6 | ioctl definitions can be accessed by including <emphasis | ||
7 | role="tt">linux/dvb/frontend.h</emphasis> in your application.</para> | ||
8 | |||
9 | <para>DVB frontends come in three varieties: DVB-S (satellite), DVB-C | ||
10 | (cable) and DVB-T (terrestrial). Transmission via the internet (DVB-IP) | ||
11 | is not yet handled by this API but a future extension is possible. For | ||
12 | DVB-S the frontend device also supports satellite equipment control | ||
13 | (SEC) via DiSEqC and V-SEC protocols. The DiSEqC (digital SEC) | ||
14 | specification is available from Eutelsat <emphasis | ||
15 | role="tt">http://www.eutelsat.org/</emphasis>.</para> | ||
16 | |||
17 | <para>Note that the DVB API may also be used for MPEG decoder-only PCI | ||
18 | cards, in which case there exists no frontend device.</para> | ||
19 | |||
20 | <section id="frontend_types"> | ||
21 | <title>Frontend Data Types</title> | ||
22 | |||
23 | <section id="frontend_type"> | ||
24 | <title>frontend type</title> | ||
25 | |||
26 | <para>For historical reasons frontend types are named after the type of modulation used in | ||
27 | transmission.</para> | ||
28 | <programlisting> | ||
29 | typedef enum fe_type { | ||
30 | FE_QPSK, /⋆ DVB-S ⋆/ | ||
31 | FE_QAM, /⋆ DVB-C ⋆/ | ||
32 | FE_OFDM /⋆ DVB-T ⋆/ | ||
33 | } fe_type_t; | ||
34 | </programlisting> | ||
35 | |||
36 | </section> | ||
37 | |||
38 | <section id="frontend_caps"> | ||
39 | <title>frontend capabilities</title> | ||
40 | |||
41 | <para>Capabilities describe what a frontend can do. Some capabilities can only be supported for | ||
42 | a specific frontend type.</para> | ||
43 | <programlisting> | ||
44 | typedef enum fe_caps { | ||
45 | FE_IS_STUPID = 0, | ||
46 | FE_CAN_INVERSION_AUTO = 0x1, | ||
47 | FE_CAN_FEC_1_2 = 0x2, | ||
48 | FE_CAN_FEC_2_3 = 0x4, | ||
49 | FE_CAN_FEC_3_4 = 0x8, | ||
50 | FE_CAN_FEC_4_5 = 0x10, | ||
51 | FE_CAN_FEC_5_6 = 0x20, | ||
52 | FE_CAN_FEC_6_7 = 0x40, | ||
53 | FE_CAN_FEC_7_8 = 0x80, | ||
54 | FE_CAN_FEC_8_9 = 0x100, | ||
55 | FE_CAN_FEC_AUTO = 0x200, | ||
56 | FE_CAN_QPSK = 0x400, | ||
57 | FE_CAN_QAM_16 = 0x800, | ||
58 | FE_CAN_QAM_32 = 0x1000, | ||
59 | FE_CAN_QAM_64 = 0x2000, | ||
60 | FE_CAN_QAM_128 = 0x4000, | ||
61 | FE_CAN_QAM_256 = 0x8000, | ||
62 | FE_CAN_QAM_AUTO = 0x10000, | ||
63 | FE_CAN_TRANSMISSION_MODE_AUTO = 0x20000, | ||
64 | FE_CAN_BANDWIDTH_AUTO = 0x40000, | ||
65 | FE_CAN_GUARD_INTERVAL_AUTO = 0x80000, | ||
66 | FE_CAN_HIERARCHY_AUTO = 0x100000, | ||
67 | FE_CAN_MUTE_TS = 0x80000000, | ||
68 | FE_CAN_CLEAN_SETUP = 0x40000000 | ||
69 | } fe_caps_t; | ||
70 | </programlisting> | ||
71 | </section> | ||
72 | |||
73 | <section id="frontend_info"> | ||
74 | <title>frontend information</title> | ||
75 | |||
76 | <para>Information about the frontend ca be queried with FE_GET_INFO.</para> | ||
77 | |||
78 | <programlisting> | ||
79 | struct dvb_frontend_info { | ||
80 | char name[128]; | ||
81 | fe_type_t type; | ||
82 | uint32_t frequency_min; | ||
83 | uint32_t frequency_max; | ||
84 | uint32_t frequency_stepsize; | ||
85 | uint32_t frequency_tolerance; | ||
86 | uint32_t symbol_rate_min; | ||
87 | uint32_t symbol_rate_max; | ||
88 | uint32_t symbol_rate_tolerance; /⋆ ppm ⋆/ | ||
89 | uint32_t notifier_delay; /⋆ ms ⋆/ | ||
90 | fe_caps_t caps; | ||
91 | }; | ||
92 | </programlisting> | ||
93 | </section> | ||
94 | |||
95 | <section id="frontend_diseqc"> | ||
96 | <title>diseqc master command</title> | ||
97 | |||
98 | <para>A message sent from the frontend to DiSEqC capable equipment.</para> | ||
99 | <programlisting> | ||
100 | struct dvb_diseqc_master_cmd { | ||
101 | uint8_t msg [6]; /⋆ { framing, address, command, data[3] } ⋆/ | ||
102 | uint8_t msg_len; /⋆ valid values are 3...6 ⋆/ | ||
103 | }; | ||
104 | </programlisting> | ||
105 | </section> | ||
106 | <section role="subsection"> | ||
107 | <title>diseqc slave reply</title> | ||
108 | |||
109 | <para>A reply to the frontend from DiSEqC 2.0 capable equipment.</para> | ||
110 | <programlisting> | ||
111 | struct dvb_diseqc_slave_reply { | ||
112 | uint8_t msg [4]; /⋆ { framing, data [3] } ⋆/ | ||
113 | uint8_t msg_len; /⋆ valid values are 0...4, 0 means no msg ⋆/ | ||
114 | int timeout; /⋆ return from ioctl after timeout ms with ⋆/ | ||
115 | }; /⋆ errorcode when no message was received ⋆/ | ||
116 | </programlisting> | ||
117 | </section> | ||
118 | |||
119 | <section id="frontend_diseqc_slave_reply"> | ||
120 | <title>diseqc slave reply</title> | ||
121 | <para>The voltage is usually used with non-DiSEqC capable LNBs to switch the polarzation | ||
122 | (horizontal/vertical). When using DiSEqC epuipment this voltage has to be switched | ||
123 | consistently to the DiSEqC commands as described in the DiSEqC spec.</para> | ||
124 | <programlisting> | ||
125 | typedef enum fe_sec_voltage { | ||
126 | SEC_VOLTAGE_13, | ||
127 | SEC_VOLTAGE_18 | ||
128 | } fe_sec_voltage_t; | ||
129 | </programlisting> | ||
130 | </section> | ||
131 | |||
132 | <section id="frontend_sec_tone"> | ||
133 | <title>SEC continuous tone</title> | ||
134 | |||
135 | <para>The continous 22KHz tone is usually used with non-DiSEqC capable LNBs to switch the | ||
136 | high/low band of a dual-band LNB. When using DiSEqC epuipment this voltage has to | ||
137 | be switched consistently to the DiSEqC commands as described in the DiSEqC | ||
138 | spec.</para> | ||
139 | <programlisting> | ||
140 | typedef enum fe_sec_tone_mode { | ||
141 | SEC_TONE_ON, | ||
142 | SEC_TONE_OFF | ||
143 | } fe_sec_tone_mode_t; | ||
144 | </programlisting> | ||
145 | </section> | ||
146 | |||
147 | <section id="frontend_sec_burst"> | ||
148 | <title>SEC tone burst</title> | ||
149 | |||
150 | <para>The 22KHz tone burst is usually used with non-DiSEqC capable switches to select | ||
151 | between two connected LNBs/satellites. When using DiSEqC epuipment this voltage has to | ||
152 | be switched consistently to the DiSEqC commands as described in the DiSEqC | ||
153 | spec.</para> | ||
154 | <programlisting> | ||
155 | typedef enum fe_sec_mini_cmd { | ||
156 | SEC_MINI_A, | ||
157 | SEC_MINI_B | ||
158 | } fe_sec_mini_cmd_t; | ||
159 | </programlisting> | ||
160 | |||
161 | <para></para> | ||
162 | </section> | ||
163 | |||
164 | <section id="frontend_status"> | ||
165 | <title>frontend status</title> | ||
166 | <para>Several functions of the frontend device use the fe_status data type defined | ||
167 | by</para> | ||
168 | <programlisting> | ||
169 | typedef enum fe_status { | ||
170 | FE_HAS_SIGNAL = 0x01, /⋆ found something above the noise level ⋆/ | ||
171 | FE_HAS_CARRIER = 0x02, /⋆ found a DVB signal ⋆/ | ||
172 | FE_HAS_VITERBI = 0x04, /⋆ FEC is stable ⋆/ | ||
173 | FE_HAS_SYNC = 0x08, /⋆ found sync bytes ⋆/ | ||
174 | FE_HAS_LOCK = 0x10, /⋆ everything's working... ⋆/ | ||
175 | FE_TIMEDOUT = 0x20, /⋆ no lock within the last ~2 seconds ⋆/ | ||
176 | FE_REINIT = 0x40 /⋆ frontend was reinitialized, ⋆/ | ||
177 | } fe_status_t; /⋆ application is recommned to reset ⋆/ | ||
178 | </programlisting> | ||
179 | <para>to indicate the current state and/or state changes of the frontend hardware. | ||
180 | </para> | ||
181 | |||
182 | </section> | ||
183 | |||
184 | <section id="frontend_params"> | ||
185 | <title>frontend parameters</title> | ||
186 | <para>The kind of parameters passed to the frontend device for tuning depend on | ||
187 | the kind of hardware you are using. All kinds of parameters are combined as an | ||
188 | union in the FrontendParameters structure:</para> | ||
189 | <programlisting> | ||
190 | struct dvb_frontend_parameters { | ||
191 | uint32_t frequency; /⋆ (absolute) frequency in Hz for QAM/OFDM ⋆/ | ||
192 | /⋆ intermediate frequency in kHz for QPSK ⋆/ | ||
193 | fe_spectral_inversion_t inversion; | ||
194 | union { | ||
195 | struct dvb_qpsk_parameters qpsk; | ||
196 | struct dvb_qam_parameters qam; | ||
197 | struct dvb_ofdm_parameters ofdm; | ||
198 | } u; | ||
199 | }; | ||
200 | </programlisting> | ||
201 | <para>For satellite QPSK frontends you have to use the <constant>QPSKParameters</constant> member defined by</para> | ||
202 | <programlisting> | ||
203 | struct dvb_qpsk_parameters { | ||
204 | uint32_t symbol_rate; /⋆ symbol rate in Symbols per second ⋆/ | ||
205 | fe_code_rate_t fec_inner; /⋆ forward error correction (see above) ⋆/ | ||
206 | }; | ||
207 | </programlisting> | ||
208 | <para>for cable QAM frontend you use the <constant>QAMParameters</constant> structure</para> | ||
209 | <programlisting> | ||
210 | struct dvb_qam_parameters { | ||
211 | uint32_t symbol_rate; /⋆ symbol rate in Symbols per second ⋆/ | ||
212 | fe_code_rate_t fec_inner; /⋆ forward error correction (see above) ⋆/ | ||
213 | fe_modulation_t modulation; /⋆ modulation type (see above) ⋆/ | ||
214 | }; | ||
215 | </programlisting> | ||
216 | <para>DVB-T frontends are supported by the <constant>OFDMParamters</constant> structure | ||
217 | </para> | ||
218 | <programlisting> | ||
219 | struct dvb_ofdm_parameters { | ||
220 | fe_bandwidth_t bandwidth; | ||
221 | fe_code_rate_t code_rate_HP; /⋆ high priority stream code rate ⋆/ | ||
222 | fe_code_rate_t code_rate_LP; /⋆ low priority stream code rate ⋆/ | ||
223 | fe_modulation_t constellation; /⋆ modulation type (see above) ⋆/ | ||
224 | fe_transmit_mode_t transmission_mode; | ||
225 | fe_guard_interval_t guard_interval; | ||
226 | fe_hierarchy_t hierarchy_information; | ||
227 | }; | ||
228 | </programlisting> | ||
229 | <para>In the case of QPSK frontends the <constant>Frequency</constant> field specifies the intermediate | ||
230 | frequency, i.e. the offset which is effectively added to the local oscillator frequency (LOF) of | ||
231 | the LNB. The intermediate frequency has to be specified in units of kHz. For QAM and | ||
232 | OFDM frontends the Frequency specifies the absolute frequency and is given in | ||
233 | Hz. | ||
234 | </para> | ||
235 | <para>The Inversion field can take one of these values: | ||
236 | </para> | ||
237 | <programlisting> | ||
238 | typedef enum fe_spectral_inversion { | ||
239 | INVERSION_OFF, | ||
240 | INVERSION_ON, | ||
241 | INVERSION_AUTO | ||
242 | } fe_spectral_inversion_t; | ||
243 | </programlisting> | ||
244 | <para>It indicates if spectral inversion should be presumed or not. In the automatic setting | ||
245 | (<constant>INVERSION_AUTO</constant>) the hardware will try to figure out the correct setting by | ||
246 | itself. | ||
247 | </para> | ||
248 | <para>The possible values for the <constant>FEC_inner</constant> field are | ||
249 | </para> | ||
250 | <programlisting> | ||
251 | typedef enum fe_code_rate { | ||
252 | FEC_NONE = 0, | ||
253 | FEC_1_2, | ||
254 | FEC_2_3, | ||
255 | FEC_3_4, | ||
256 | FEC_4_5, | ||
257 | FEC_5_6, | ||
258 | FEC_6_7, | ||
259 | FEC_7_8, | ||
260 | FEC_8_9, | ||
261 | FEC_AUTO | ||
262 | } fe_code_rate_t; | ||
263 | </programlisting> | ||
264 | <para>which correspond to error correction rates of 1/2, 2/3, etc., no error correction or auto | ||
265 | detection. | ||
266 | </para> | ||
267 | <para>For cable and terrestrial frontends (QAM and OFDM) one also has to specify the quadrature | ||
268 | modulation mode which can be one of the following: | ||
269 | </para> | ||
270 | <programlisting> | ||
271 | typedef enum fe_modulation { | ||
272 | QPSK, | ||
273 | QAM_16, | ||
274 | QAM_32, | ||
275 | QAM_64, | ||
276 | QAM_128, | ||
277 | QAM_256, | ||
278 | QAM_AUTO | ||
279 | } fe_modulation_t; | ||
280 | </programlisting> | ||
281 | <para>Finally, there are several more parameters for OFDM: | ||
282 | </para> | ||
283 | <programlisting> | ||
284 | typedef enum fe_transmit_mode { | ||
285 | TRANSMISSION_MODE_2K, | ||
286 | TRANSMISSION_MODE_8K, | ||
287 | TRANSMISSION_MODE_AUTO | ||
288 | } fe_transmit_mode_t; | ||
289 | </programlisting> | ||
290 | <programlisting> | ||
291 | typedef enum fe_bandwidth { | ||
292 | BANDWIDTH_8_MHZ, | ||
293 | BANDWIDTH_7_MHZ, | ||
294 | BANDWIDTH_6_MHZ, | ||
295 | BANDWIDTH_AUTO | ||
296 | } fe_bandwidth_t; | ||
297 | </programlisting> | ||
298 | <programlisting> | ||
299 | typedef enum fe_guard_interval { | ||
300 | GUARD_INTERVAL_1_32, | ||
301 | GUARD_INTERVAL_1_16, | ||
302 | GUARD_INTERVAL_1_8, | ||
303 | GUARD_INTERVAL_1_4, | ||
304 | GUARD_INTERVAL_AUTO | ||
305 | } fe_guard_interval_t; | ||
306 | </programlisting> | ||
307 | <programlisting> | ||
308 | typedef enum fe_hierarchy { | ||
309 | HIERARCHY_NONE, | ||
310 | HIERARCHY_1, | ||
311 | HIERARCHY_2, | ||
312 | HIERARCHY_4, | ||
313 | HIERARCHY_AUTO | ||
314 | } fe_hierarchy_t; | ||
315 | </programlisting> | ||
316 | |||
317 | </section> | ||
318 | |||
319 | <section id="frontend_events"> | ||
320 | <title>frontend events</title> | ||
321 | <programlisting> | ||
322 | struct dvb_frontend_event { | ||
323 | fe_status_t status; | ||
324 | struct dvb_frontend_parameters parameters; | ||
325 | }; | ||
326 | </programlisting> | ||
327 | </section> | ||
328 | </section> | ||
329 | |||
330 | |||
331 | <section id="frontend_fcalls"> | ||
332 | <title>Frontend Function Calls</title> | ||
333 | |||
334 | <section id="frontend_f_open"> | ||
335 | <title>open()</title> | ||
336 | <para>DESCRIPTION</para> | ||
337 | <informaltable><tgroup cols="1"><tbody><row> | ||
338 | <entry align="char"> | ||
339 | <para>This system call opens a named frontend device (/dev/dvb/adapter0/frontend0) | ||
340 | for subsequent use. Usually the first thing to do after a successful open is to | ||
341 | find out the frontend type with FE_GET_INFO.</para> | ||
342 | <para>The device can be opened in read-only mode, which only allows monitoring of | ||
343 | device status and statistics, or read/write mode, which allows any kind of use | ||
344 | (e.g. performing tuning operations.) | ||
345 | </para> | ||
346 | <para>In a system with multiple front-ends, it is usually the case that multiple devices | ||
347 | cannot be open in read/write mode simultaneously. As long as a front-end | ||
348 | device is opened in read/write mode, other open() calls in read/write mode will | ||
349 | either fail or block, depending on whether non-blocking or blocking mode was | ||
350 | specified. A front-end device opened in blocking mode can later be put into | ||
351 | non-blocking mode (and vice versa) using the F_SETFL command of the fcntl | ||
352 | system call. This is a standard system call, documented in the Linux manual | ||
353 | page for fcntl. When an open() call has succeeded, the device will be ready | ||
354 | for use in the specified mode. This implies that the corresponding hardware is | ||
355 | powered up, and that other front-ends may have been powered down to make | ||
356 | that possible.</para> | ||
357 | </entry> | ||
358 | </row></tbody></tgroup></informaltable> | ||
359 | |||
360 | <para>SYNOPSIS</para> | ||
361 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
362 | align="char"> | ||
363 | <para>int open(const char ⋆deviceName, int flags);</para> | ||
364 | </entry> | ||
365 | </row></tbody></tgroup></informaltable> | ||
366 | <para>PARAMETERS | ||
367 | </para> | ||
368 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
369 | align="char"> | ||
370 | <para>const char | ||
371 | *deviceName</para> | ||
372 | </entry><entry | ||
373 | align="char"> | ||
374 | <para>Name of specific video device.</para> | ||
375 | </entry> | ||
376 | </row><row><entry | ||
377 | align="char"> | ||
378 | <para>int flags</para> | ||
379 | </entry><entry | ||
380 | align="char"> | ||
381 | <para>A bit-wise OR of the following flags:</para> | ||
382 | </entry> | ||
383 | </row><row><entry | ||
384 | align="char"> | ||
385 | </entry><entry | ||
386 | align="char"> | ||
387 | <para>O_RDONLY read-only access</para> | ||
388 | </entry> | ||
389 | </row><row><entry | ||
390 | align="char"> | ||
391 | </entry><entry | ||
392 | align="char"> | ||
393 | <para>O_RDWR read/write access</para> | ||
394 | </entry> | ||
395 | </row><row><entry | ||
396 | align="char"> | ||
397 | </entry><entry | ||
398 | align="char"> | ||
399 | <para>O_NONBLOCK open in non-blocking mode</para> | ||
400 | </entry> | ||
401 | </row><row><entry | ||
402 | align="char"> | ||
403 | </entry><entry | ||
404 | align="char"> | ||
405 | <para>(blocking mode is the default)</para> | ||
406 | </entry> | ||
407 | </row></tbody></tgroup></informaltable> | ||
408 | <para>ERRORS | ||
409 | </para> | ||
410 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
411 | align="char"> | ||
412 | <para>ENODEV</para> | ||
413 | </entry><entry | ||
414 | align="char"> | ||
415 | <para>Device driver not loaded/available.</para> | ||
416 | </entry> | ||
417 | </row><row><entry | ||
418 | align="char"> | ||
419 | <para>EINTERNAL</para> | ||
420 | </entry><entry | ||
421 | align="char"> | ||
422 | <para>Internal error.</para> | ||
423 | </entry> | ||
424 | </row><row><entry | ||
425 | align="char"> | ||
426 | <para>EBUSY</para> | ||
427 | </entry><entry | ||
428 | align="char"> | ||
429 | <para>Device or resource busy.</para> | ||
430 | </entry> | ||
431 | </row><row><entry | ||
432 | align="char"> | ||
433 | <para>EINVAL</para> | ||
434 | </entry><entry | ||
435 | align="char"> | ||
436 | <para>Invalid argument.</para> | ||
437 | </entry> | ||
438 | </row></tbody></tgroup></informaltable> | ||
439 | </section> | ||
440 | |||
441 | <section id="frontend_f_close"> | ||
442 | <title>close()</title> | ||
443 | <para>DESCRIPTION | ||
444 | </para> | ||
445 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
446 | align="char"> | ||
447 | <para>This system call closes a previously opened front-end device. After closing | ||
448 | a front-end device, its corresponding hardware might be powered down | ||
449 | automatically.</para> | ||
450 | </entry> | ||
451 | </row></tbody></tgroup></informaltable> | ||
452 | <para>SYNOPSIS | ||
453 | </para> | ||
454 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
455 | align="char"> | ||
456 | <para>int close(int fd);</para> | ||
457 | </entry> | ||
458 | </row></tbody></tgroup></informaltable> | ||
459 | <para>PARAMETERS | ||
460 | </para> | ||
461 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
462 | align="char"> | ||
463 | <para>int fd</para> | ||
464 | </entry><entry | ||
465 | align="char"> | ||
466 | <para>File descriptor returned by a previous call to open().</para> | ||
467 | </entry> | ||
468 | </row></tbody></tgroup></informaltable> | ||
469 | <para>ERRORS | ||
470 | </para> | ||
471 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
472 | align="char"> | ||
473 | <para>EBADF</para> | ||
474 | </entry><entry | ||
475 | align="char"> | ||
476 | <para>fd is not a valid open file descriptor.</para> | ||
477 | </entry> | ||
478 | </row></tbody></tgroup></informaltable> | ||
479 | </section> | ||
480 | |||
481 | <section id="frontend_read_status"> | ||
482 | <title>FE_READ_STATUS</title> | ||
483 | <para>DESCRIPTION | ||
484 | </para> | ||
485 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
486 | align="char"> | ||
487 | <para>This ioctl call returns status information about the front-end. This call only | ||
488 | requires read-only access to the device.</para> | ||
489 | </entry> | ||
490 | </row></tbody></tgroup></informaltable> | ||
491 | <para>SYNOPSIS | ||
492 | </para> | ||
493 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
494 | align="char"> | ||
495 | <para>int ioctl(int fd, int request = FE_READ_STATUS, | ||
496 | fe_status_t ⋆status);</para> | ||
497 | </entry> | ||
498 | </row></tbody></tgroup></informaltable> | ||
499 | <para>PARAMETERS | ||
500 | </para> | ||
501 | |||
502 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
503 | align="char"> | ||
504 | <para>int fd</para> | ||
505 | </entry><entry | ||
506 | align="char"> | ||
507 | <para>File descriptor returned by a previous call to open().</para> | ||
508 | </entry> | ||
509 | </row><row><entry | ||
510 | align="char"> | ||
511 | <para>int request</para> | ||
512 | </entry><entry | ||
513 | align="char"> | ||
514 | <para>Equals FE_READ_STATUS for this command.</para> | ||
515 | </entry> | ||
516 | </row><row><entry | ||
517 | align="char"> | ||
518 | <para>struct fe_status_t | ||
519 | *status</para> | ||
520 | </entry><entry | ||
521 | align="char"> | ||
522 | <para>Points to the location where the front-end status word is | ||
523 | to be stored.</para> | ||
524 | </entry> | ||
525 | </row></tbody></tgroup></informaltable> | ||
526 | <para>ERRORS | ||
527 | </para> | ||
528 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
529 | align="char"> | ||
530 | <para>EBADF</para> | ||
531 | </entry><entry | ||
532 | align="char"> | ||
533 | <para>fd is not a valid open file descriptor.</para> | ||
534 | </entry> | ||
535 | </row><row><entry | ||
536 | align="char"> | ||
537 | <para>EFAULT</para> | ||
538 | </entry><entry | ||
539 | align="char"> | ||
540 | <para>status points to invalid address.</para> | ||
541 | </entry> | ||
542 | </row></tbody></tgroup></informaltable> | ||
543 | </section> | ||
544 | |||
545 | <section id="frontend_read_ber"> | ||
546 | <title>FE_READ_BER</title> | ||
547 | <para>DESCRIPTION | ||
548 | </para> | ||
549 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
550 | align="char"> | ||
551 | <para>This ioctl call returns the bit error rate for the signal currently | ||
552 | received/demodulated by the front-end. For this command, read-only access to | ||
553 | the device is sufficient.</para> | ||
554 | </entry> | ||
555 | </row></tbody></tgroup></informaltable> | ||
556 | <para>SYNOPSIS | ||
557 | </para> | ||
558 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
559 | align="char"> | ||
560 | <para>int ioctl(int fd, int request = FE_READ_BER, | ||
561 | uint32_t ⋆ber);</para> | ||
562 | </entry> | ||
563 | </row></tbody></tgroup></informaltable> | ||
564 | <para>PARAMETERS | ||
565 | </para> | ||
566 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
567 | align="char"> | ||
568 | <para>int fd</para> | ||
569 | </entry><entry | ||
570 | align="char"> | ||
571 | <para>File descriptor returned by a previous call to open().</para> | ||
572 | </entry> | ||
573 | </row><row><entry | ||
574 | align="char"> | ||
575 | <para>int request</para> | ||
576 | </entry><entry | ||
577 | align="char"> | ||
578 | <para>Equals FE_READ_BER for this command.</para> | ||
579 | </entry> | ||
580 | </row><row><entry | ||
581 | align="char"> | ||
582 | <para>uint32_t *ber</para> | ||
583 | </entry><entry | ||
584 | align="char"> | ||
585 | <para>The bit error rate is stored into *ber.</para> | ||
586 | </entry> | ||
587 | </row></tbody></tgroup></informaltable> | ||
588 | <para>ERRORS | ||
589 | </para> | ||
590 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
591 | align="char"> | ||
592 | <para>EBADF</para> | ||
593 | </entry><entry | ||
594 | align="char"> | ||
595 | <para>fd is not a valid open file descriptor.</para> | ||
596 | </entry> | ||
597 | </row><row><entry | ||
598 | align="char"> | ||
599 | <para>EFAULT</para> | ||
600 | </entry><entry | ||
601 | align="char"> | ||
602 | <para>ber points to invalid address.</para> | ||
603 | </entry> | ||
604 | </row><row><entry | ||
605 | align="char"> | ||
606 | <para>ENOSIGNAL</para> | ||
607 | </entry><entry | ||
608 | align="char"> | ||
609 | <para>There is no signal, thus no meaningful bit error rate. Also | ||
610 | returned if the front-end is not turned on.</para> | ||
611 | </entry> | ||
612 | </row><row><entry | ||
613 | align="char"> | ||
614 | <para>ENOSYS</para> | ||
615 | </entry><entry | ||
616 | align="char"> | ||
617 | <para>Function not available for this device.</para> | ||
618 | </entry> | ||
619 | </row></tbody></tgroup></informaltable> | ||
620 | </section> | ||
621 | |||
622 | <section id="frontend_read_snr"> | ||
623 | <title>FE_READ_SNR</title> | ||
624 | |||
625 | <para>DESCRIPTION | ||
626 | </para> | ||
627 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
628 | align="char"> | ||
629 | <para>This ioctl call returns the signal-to-noise ratio for the signal currently received | ||
630 | by the front-end. For this command, read-only access to the device is sufficient.</para> | ||
631 | </entry> | ||
632 | </row></tbody></tgroup></informaltable> | ||
633 | <para>SYNOPSIS | ||
634 | </para> | ||
635 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
636 | align="char"> | ||
637 | <para>int ioctl(int fd, int request = FE_READ_SNR, int16_t | ||
638 | ⋆snr);</para> | ||
639 | </entry> | ||
640 | </row></tbody></tgroup></informaltable> | ||
641 | <para>PARAMETERS | ||
642 | </para> | ||
643 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
644 | align="char"> | ||
645 | <para>int fd</para> | ||
646 | </entry><entry | ||
647 | align="char"> | ||
648 | <para>File descriptor returned by a previous call to open().</para> | ||
649 | </entry> | ||
650 | </row><row><entry | ||
651 | align="char"> | ||
652 | <para>int request</para> | ||
653 | </entry><entry | ||
654 | align="char"> | ||
655 | <para>Equals FE_READ_SNR for this command.</para> | ||
656 | </entry> | ||
657 | </row><row><entry | ||
658 | align="char"> | ||
659 | <para>int16_t *snr</para> | ||
660 | </entry><entry | ||
661 | align="char"> | ||
662 | <para>The signal-to-noise ratio is stored into *snr.</para> | ||
663 | </entry> | ||
664 | </row></tbody></tgroup></informaltable> | ||
665 | |||
666 | <para>ERRORS | ||
667 | </para> | ||
668 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
669 | align="char"> | ||
670 | <para>EBADF</para> | ||
671 | </entry><entry | ||
672 | align="char"> | ||
673 | <para>fd is not a valid open file descriptor.</para> | ||
674 | </entry> | ||
675 | </row><row><entry | ||
676 | align="char"> | ||
677 | <para>EFAULT</para> | ||
678 | </entry><entry | ||
679 | align="char"> | ||
680 | <para>snr points to invalid address.</para> | ||
681 | </entry> | ||
682 | </row><row><entry | ||
683 | align="char"> | ||
684 | <para>ENOSIGNAL</para> | ||
685 | </entry><entry | ||
686 | align="char"> | ||
687 | <para>There is no signal, thus no meaningful signal strength | ||
688 | value. Also returned if front-end is not turned on.</para> | ||
689 | </entry> | ||
690 | </row><row><entry | ||
691 | align="char"> | ||
692 | <para>ENOSYS</para> | ||
693 | </entry><entry | ||
694 | align="char"> | ||
695 | <para>Function not available for this device.</para> | ||
696 | </entry> | ||
697 | </row></tbody></tgroup></informaltable> | ||
698 | </section> | ||
699 | |||
700 | <section id="frontend_read_signal_strength"> | ||
701 | <title>FE_READ_SIGNAL_STRENGTH</title> | ||
702 | <para>DESCRIPTION | ||
703 | </para> | ||
704 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
705 | align="char"> | ||
706 | <para>This ioctl call returns the signal strength value for the signal currently received | ||
707 | by the front-end. For this command, read-only access to the device is sufficient.</para> | ||
708 | </entry> | ||
709 | </row></tbody></tgroup></informaltable> | ||
710 | <para>SYNOPSIS | ||
711 | </para> | ||
712 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
713 | align="char"> | ||
714 | <para>int ioctl( int fd, int request = | ||
715 | FE_READ_SIGNAL_STRENGTH, int16_t ⋆strength);</para> | ||
716 | </entry> | ||
717 | </row></tbody></tgroup></informaltable> | ||
718 | |||
719 | <para>PARAMETERS | ||
720 | </para> | ||
721 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
722 | align="char"> | ||
723 | <para>int fd</para> | ||
724 | </entry><entry | ||
725 | align="char"> | ||
726 | <para>File descriptor returned by a previous call to open().</para> | ||
727 | </entry> | ||
728 | </row><row><entry | ||
729 | align="char"> | ||
730 | <para>int request</para> | ||
731 | </entry><entry | ||
732 | align="char"> | ||
733 | <para>Equals FE_READ_SIGNAL_STRENGTH for this | ||
734 | command.</para> | ||
735 | </entry> | ||
736 | </row><row><entry | ||
737 | align="char"> | ||
738 | <para>int16_t *strength</para> | ||
739 | </entry><entry | ||
740 | align="char"> | ||
741 | <para>The signal strength value is stored into *strength.</para> | ||
742 | </entry> | ||
743 | </row></tbody></tgroup></informaltable> | ||
744 | <para>ERRORS | ||
745 | </para> | ||
746 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
747 | align="char"> | ||
748 | <para>EBADF</para> | ||
749 | </entry><entry | ||
750 | align="char"> | ||
751 | <para>fd is not a valid open file descriptor.</para> | ||
752 | </entry> | ||
753 | </row><row><entry | ||
754 | align="char"> | ||
755 | <para>EFAULT</para> | ||
756 | </entry><entry | ||
757 | align="char"> | ||
758 | <para>status points to invalid address.</para> | ||
759 | </entry> | ||
760 | </row><row><entry | ||
761 | align="char"> | ||
762 | <para>ENOSIGNAL</para> | ||
763 | </entry><entry | ||
764 | align="char"> | ||
765 | <para>There is no signal, thus no meaningful signal strength | ||
766 | value. Also returned if front-end is not turned on.</para> | ||
767 | </entry> | ||
768 | </row><row><entry | ||
769 | align="char"> | ||
770 | <para>ENOSYS</para> | ||
771 | </entry><entry | ||
772 | align="char"> | ||
773 | <para>Function not available for this device.</para> | ||
774 | </entry> | ||
775 | </row></tbody></tgroup></informaltable> | ||
776 | </section> | ||
777 | |||
778 | <section id="frontend_read_ub"> | ||
779 | <title>FE_READ_UNCORRECTED_BLOCKS</title> | ||
780 | <para>DESCRIPTION | ||
781 | </para> | ||
782 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
783 | align="char"> | ||
784 | <para>This ioctl call returns the number of uncorrected blocks detected by the device | ||
785 | driver during its lifetime. For meaningful measurements, the increment in block | ||
786 | count during a specific time interval should be calculated. For this command, | ||
787 | read-only access to the device is sufficient.</para> | ||
788 | </entry> | ||
789 | </row><row><entry | ||
790 | align="char"> | ||
791 | <para>Note that the counter will wrap to zero after its maximum count has been | ||
792 | reached.</para> | ||
793 | </entry> | ||
794 | </row></tbody></tgroup></informaltable> | ||
795 | <para>SYNOPSIS | ||
796 | </para> | ||
797 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
798 | align="char"> | ||
799 | <para>int ioctl( int fd, int request = | ||
800 | FE_READ_UNCORRECTED_BLOCKS, uint32_t ⋆ublocks);</para> | ||
801 | </entry> | ||
802 | </row></tbody></tgroup></informaltable> | ||
803 | <para>PARAMETERS | ||
804 | </para> | ||
805 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
806 | align="char"> | ||
807 | <para>int fd</para> | ||
808 | </entry><entry | ||
809 | align="char"> | ||
810 | <para>File descriptor returned by a previous call to open().</para> | ||
811 | </entry> | ||
812 | </row><row><entry | ||
813 | align="char"> | ||
814 | <para>int request</para> | ||
815 | </entry><entry | ||
816 | align="char"> | ||
817 | <para>Equals FE_READ_UNCORRECTED_BLOCKS for this | ||
818 | command.</para> | ||
819 | </entry> | ||
820 | </row><row><entry | ||
821 | align="char"> | ||
822 | <para>uint32_t *ublocks</para> | ||
823 | </entry><entry | ||
824 | align="char"> | ||
825 | <para>The total number of uncorrected blocks seen by the driver | ||
826 | so far.</para> | ||
827 | </entry> | ||
828 | </row></tbody></tgroup></informaltable> | ||
829 | <para>ERRORS | ||
830 | </para> | ||
831 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
832 | align="char"> | ||
833 | <para>EBADF</para> | ||
834 | </entry><entry | ||
835 | align="char"> | ||
836 | <para>fd is not a valid open file descriptor.</para> | ||
837 | </entry> | ||
838 | </row><row><entry | ||
839 | align="char"> | ||
840 | <para>EFAULT</para> | ||
841 | </entry><entry | ||
842 | align="char"> | ||
843 | <para>ublocks points to invalid address.</para> | ||
844 | </entry> | ||
845 | </row><row><entry | ||
846 | align="char"> | ||
847 | <para>ENOSYS</para> | ||
848 | </entry><entry | ||
849 | align="char"> | ||
850 | <para>Function not available for this device.</para> | ||
851 | </entry> | ||
852 | </row></tbody></tgroup></informaltable> | ||
853 | </section> | ||
854 | |||
855 | <section id="frontend_set_fe"> | ||
856 | <title>FE_SET_FRONTEND</title> | ||
857 | <para>DESCRIPTION | ||
858 | </para> | ||
859 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
860 | align="char"> | ||
861 | <para>This ioctl call starts a tuning operation using specified parameters. The result | ||
862 | of this call will be successful if the parameters were valid and the tuning could | ||
863 | be initiated. The result of the tuning operation in itself, however, will arrive | ||
864 | asynchronously as an event (see documentation for FE_GET_EVENT and | ||
865 | FrontendEvent.) If a new FE_SET_FRONTEND operation is initiated before | ||
866 | the previous one was completed, the previous operation will be aborted in favor | ||
867 | of the new one. This command requires read/write access to the device.</para> | ||
868 | </entry> | ||
869 | </row></tbody></tgroup></informaltable> | ||
870 | |||
871 | <para>SYNOPSIS | ||
872 | </para> | ||
873 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
874 | align="char"> | ||
875 | <para>int ioctl(int fd, int request = FE_SET_FRONTEND, | ||
876 | struct dvb_frontend_parameters ⋆p);</para> | ||
877 | </entry> | ||
878 | </row></tbody></tgroup></informaltable> | ||
879 | <para>PARAMETERS | ||
880 | </para> | ||
881 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
882 | align="char"> | ||
883 | <para>int fd</para> | ||
884 | </entry><entry | ||
885 | align="char"> | ||
886 | <para>File descriptor returned by a previous call to open().</para> | ||
887 | </entry> | ||
888 | </row><row><entry | ||
889 | align="char"> | ||
890 | <para>int request</para> | ||
891 | </entry><entry | ||
892 | align="char"> | ||
893 | <para>Equals FE_SET_FRONTEND for this command.</para> | ||
894 | </entry> | ||
895 | </row><row><entry | ||
896 | align="char"> | ||
897 | <para>struct | ||
898 | dvb_frontend_parameters | ||
899 | *p</para> | ||
900 | </entry><entry | ||
901 | align="char"> | ||
902 | <para>Points to parameters for tuning operation.</para> | ||
903 | </entry> | ||
904 | </row></tbody></tgroup></informaltable> | ||
905 | <para>ERRORS | ||
906 | </para> | ||
907 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
908 | align="char"> | ||
909 | <para>EBADF</para> | ||
910 | </entry><entry | ||
911 | align="char"> | ||
912 | <para>fd is not a valid open file descriptor.</para> | ||
913 | </entry> | ||
914 | </row><row><entry | ||
915 | align="char"> | ||
916 | <para>EFAULT</para> | ||
917 | </entry><entry | ||
918 | align="char"> | ||
919 | <para>p points to invalid address.</para> | ||
920 | </entry> | ||
921 | </row><row><entry | ||
922 | align="char"> | ||
923 | <para>EINVAL</para> | ||
924 | </entry><entry | ||
925 | align="char"> | ||
926 | <para>Maximum supported symbol rate reached.</para> | ||
927 | </entry> | ||
928 | </row></tbody></tgroup></informaltable> | ||
929 | </section> | ||
930 | |||
931 | <section id="frontend_get_fe"> | ||
932 | <title>FE_GET_FRONTEND</title> | ||
933 | <para>DESCRIPTION | ||
934 | </para> | ||
935 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
936 | align="char"> | ||
937 | <para>This ioctl call queries the currently effective frontend parameters. For this | ||
938 | command, read-only access to the device is sufficient.</para> | ||
939 | </entry> | ||
940 | </row></tbody></tgroup></informaltable> | ||
941 | |||
942 | <para>SYNOPSIS | ||
943 | </para> | ||
944 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
945 | align="char"> | ||
946 | <para>int ioctl(int fd, int request = FE_GET_FRONTEND, | ||
947 | struct dvb_frontend_parameters ⋆p);</para> | ||
948 | </entry> | ||
949 | </row></tbody></tgroup></informaltable> | ||
950 | |||
951 | <para>PARAMETERS | ||
952 | </para> | ||
953 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
954 | align="char"> | ||
955 | <para>int fd</para> | ||
956 | </entry><entry | ||
957 | align="char"> | ||
958 | <para>File descriptor returned by a previous call to open().</para> | ||
959 | </entry> | ||
960 | </row><row><entry | ||
961 | align="char"> | ||
962 | <para>int request</para> | ||
963 | </entry><entry | ||
964 | align="char"> | ||
965 | <para>Equals FE_SET_FRONTEND for this command.</para> | ||
966 | </entry> | ||
967 | </row><row><entry | ||
968 | align="char"> | ||
969 | <para>struct | ||
970 | dvb_frontend_parameters | ||
971 | *p</para> | ||
972 | </entry><entry | ||
973 | align="char"> | ||
974 | <para>Points to parameters for tuning operation.</para> | ||
975 | </entry> | ||
976 | </row></tbody></tgroup></informaltable> | ||
977 | |||
978 | <para>ERRORS | ||
979 | </para> | ||
980 | |||
981 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
982 | align="char"> | ||
983 | <para>EBADF</para> | ||
984 | </entry><entry | ||
985 | align="char"> | ||
986 | <para>fd is not a valid open file descriptor.</para> | ||
987 | </entry> | ||
988 | </row><row><entry | ||
989 | align="char"> | ||
990 | <para>EFAULT</para> | ||
991 | </entry><entry | ||
992 | align="char"> | ||
993 | <para>p points to invalid address.</para> | ||
994 | </entry> | ||
995 | </row><row><entry | ||
996 | align="char"> | ||
997 | <para>EINVAL</para> | ||
998 | </entry><entry | ||
999 | align="char"> | ||
1000 | <para>Maximum supported symbol rate reached.</para> | ||
1001 | </entry> | ||
1002 | </row></tbody></tgroup></informaltable> | ||
1003 | |||
1004 | </section> | ||
1005 | |||
1006 | <section id="frontend_get_event"> | ||
1007 | <title>FE_GET_EVENT</title> | ||
1008 | <para>DESCRIPTION | ||
1009 | </para> | ||
1010 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1011 | align="char"> | ||
1012 | <para>This ioctl call returns a frontend event if available. If an event is not | ||
1013 | available, the behavior depends on whether the device is in blocking or | ||
1014 | non-blocking mode. In the latter case, the call fails immediately with errno | ||
1015 | set to EWOULDBLOCK. In the former case, the call blocks until an event | ||
1016 | becomes available.</para> | ||
1017 | </entry> | ||
1018 | </row><row><entry | ||
1019 | align="char"> | ||
1020 | <para>The standard Linux poll() and/or select() system calls can be used with the | ||
1021 | device file descriptor to watch for new events. For select(), the file descriptor | ||
1022 | should be included in the exceptfds argument, and for poll(), POLLPRI should | ||
1023 | be specified as the wake-up condition. Since the event queue allocated is | ||
1024 | rather small (room for 8 events), the queue must be serviced regularly to avoid | ||
1025 | overflow. If an overflow happens, the oldest event is discarded from the queue, | ||
1026 | and an error (EOVERFLOW) occurs the next time the queue is read. After | ||
1027 | reporting the error condition in this fashion, subsequent FE_GET_EVENT | ||
1028 | calls will return events from the queue as usual.</para> | ||
1029 | </entry> | ||
1030 | </row><row><entry | ||
1031 | align="char"> | ||
1032 | <para>For the sake of implementation simplicity, this command requires read/write | ||
1033 | access to the device.</para> | ||
1034 | </entry> | ||
1035 | </row></tbody></tgroup></informaltable> | ||
1036 | |||
1037 | <para>SYNOPSIS | ||
1038 | </para> | ||
1039 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1040 | align="char"> | ||
1041 | <para>int ioctl(int fd, int request = QPSK_GET_EVENT, | ||
1042 | struct dvb_frontend_event ⋆ev);</para> | ||
1043 | </entry> | ||
1044 | </row></tbody></tgroup></informaltable> | ||
1045 | |||
1046 | <para>PARAMETERS | ||
1047 | </para> | ||
1048 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1049 | align="char"> | ||
1050 | <para>int fd</para> | ||
1051 | </entry><entry | ||
1052 | align="char"> | ||
1053 | <para>File descriptor returned by a previous call to open().</para> | ||
1054 | </entry> | ||
1055 | </row><row><entry | ||
1056 | align="char"> | ||
1057 | <para>int request</para> | ||
1058 | </entry><entry | ||
1059 | align="char"> | ||
1060 | <para>Equals FE_GET_EVENT for this command.</para> | ||
1061 | </entry> | ||
1062 | </row><row><entry | ||
1063 | align="char"> | ||
1064 | <para>struct | ||
1065 | dvb_frontend_event | ||
1066 | *ev</para> | ||
1067 | </entry><entry | ||
1068 | align="char"> | ||
1069 | <para>Points to the location where the event,</para> | ||
1070 | </entry> | ||
1071 | </row><row><entry | ||
1072 | align="char"> | ||
1073 | </entry><entry | ||
1074 | align="char"> | ||
1075 | <para>if any, is to be stored.</para> | ||
1076 | </entry> | ||
1077 | </row></tbody></tgroup></informaltable> | ||
1078 | |||
1079 | <para>ERRORS | ||
1080 | </para> | ||
1081 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1082 | align="char"> | ||
1083 | <para>EBADF</para> | ||
1084 | </entry><entry | ||
1085 | align="char"> | ||
1086 | <para>fd is not a valid open file descriptor.</para> | ||
1087 | </entry> | ||
1088 | </row><row><entry | ||
1089 | align="char"> | ||
1090 | <para>EFAULT</para> | ||
1091 | </entry><entry | ||
1092 | align="char"> | ||
1093 | <para>ev points to invalid address.</para> | ||
1094 | </entry> | ||
1095 | </row><row><entry | ||
1096 | align="char"> | ||
1097 | <para>EWOULDBLOCK</para> | ||
1098 | </entry><entry | ||
1099 | align="char"> | ||
1100 | <para>There is no event pending, and the device is in | ||
1101 | non-blocking mode.</para> | ||
1102 | </entry> | ||
1103 | </row><row><entry | ||
1104 | align="char"> | ||
1105 | <para>EOVERFLOW</para> | ||
1106 | </entry><entry | ||
1107 | align="char"> | ||
1108 | </entry> | ||
1109 | </row><row><entry | ||
1110 | align="char"> | ||
1111 | </entry><entry | ||
1112 | align="char"> | ||
1113 | <para>Overflow in event queue - one or more events were lost.</para> | ||
1114 | </entry> | ||
1115 | </row></tbody></tgroup></informaltable> | ||
1116 | </section> | ||
1117 | |||
1118 | <section id="frontend_get_info"> | ||
1119 | <title>FE_GET_INFO</title> | ||
1120 | <para>DESCRIPTION | ||
1121 | </para> | ||
1122 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1123 | align="char"> | ||
1124 | <para>This ioctl call returns information about the front-end. This call only requires | ||
1125 | read-only access to the device.</para> | ||
1126 | </entry> | ||
1127 | </row></tbody></tgroup></informaltable> | ||
1128 | <para>SYNOPSIS | ||
1129 | </para> | ||
1130 | |||
1131 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1132 | align="char"> | ||
1133 | <para> int ioctl(int fd, int request = FE_GET_INFO, struct | ||
1134 | dvb_frontend_info ⋆info);</para> | ||
1135 | </entry> | ||
1136 | </row></tbody></tgroup></informaltable> | ||
1137 | <para>PARAMETERS | ||
1138 | </para> | ||
1139 | |||
1140 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1141 | align="char"> | ||
1142 | <para>int fd</para> | ||
1143 | </entry><entry | ||
1144 | align="char"> | ||
1145 | <para>File descriptor returned by a previous call to open().</para> | ||
1146 | </entry> | ||
1147 | </row><row><entry | ||
1148 | align="char"> | ||
1149 | <para>int request</para> | ||
1150 | </entry><entry | ||
1151 | align="char"> | ||
1152 | <para>Equals FE_GET_INFO for this command.</para> | ||
1153 | </entry> | ||
1154 | </row><row><entry | ||
1155 | align="char"> | ||
1156 | <para>struct | ||
1157 | dvb_frontend_info | ||
1158 | *info</para> | ||
1159 | </entry><entry | ||
1160 | align="char"> | ||
1161 | <para>Points to the location where the front-end information is | ||
1162 | to be stored.</para> | ||
1163 | </entry> | ||
1164 | </row></tbody></tgroup></informaltable> | ||
1165 | <para>ERRORS | ||
1166 | </para> | ||
1167 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1168 | align="char"> | ||
1169 | <para>EBADF</para> | ||
1170 | </entry><entry | ||
1171 | align="char"> | ||
1172 | <para>fd is not a valid open file descriptor.</para> | ||
1173 | </entry> | ||
1174 | </row><row><entry | ||
1175 | align="char"> | ||
1176 | <para>EFAULT</para> | ||
1177 | </entry><entry | ||
1178 | align="char"> | ||
1179 | <para>info points to invalid address.</para> | ||
1180 | </entry> | ||
1181 | </row></tbody></tgroup></informaltable> | ||
1182 | </section> | ||
1183 | |||
1184 | <section id="frontend_diseqc_reset_overload"> | ||
1185 | <title>FE_DISEQC_RESET_OVERLOAD</title> | ||
1186 | <para>DESCRIPTION | ||
1187 | </para> | ||
1188 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1189 | align="char"> | ||
1190 | <para>If the bus has been automatically powered off due to power overload, this ioctl | ||
1191 | call restores the power to the bus. The call requires read/write access to the | ||
1192 | device. This call has no effect if the device is manually powered off. Not all | ||
1193 | DVB adapters support this ioctl.</para> | ||
1194 | </entry> | ||
1195 | </row></tbody></tgroup></informaltable> | ||
1196 | |||
1197 | <para>SYNOPSIS | ||
1198 | </para> | ||
1199 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1200 | align="char"> | ||
1201 | <para>int ioctl(int fd, int request = | ||
1202 | FE_DISEQC_RESET_OVERLOAD);</para> | ||
1203 | </entry> | ||
1204 | </row></tbody></tgroup></informaltable> | ||
1205 | <para>PARAMETERS | ||
1206 | </para> | ||
1207 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1208 | align="char"> | ||
1209 | <para>int fd</para> | ||
1210 | </entry><entry | ||
1211 | align="char"> | ||
1212 | <para>File descriptor returned by a previous call to open().</para> | ||
1213 | </entry> | ||
1214 | </row><row><entry | ||
1215 | align="char"> | ||
1216 | <para>int request</para> | ||
1217 | </entry><entry | ||
1218 | align="char"> | ||
1219 | <para>Equals FE_DISEQC_RESET_OVERLOAD for this | ||
1220 | command.</para> | ||
1221 | </entry> | ||
1222 | </row></tbody></tgroup></informaltable> | ||
1223 | |||
1224 | <para>ERRORS | ||
1225 | </para> | ||
1226 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1227 | align="char"> | ||
1228 | <para>EBADF</para> | ||
1229 | </entry><entry | ||
1230 | align="char"> | ||
1231 | <para>fd is not a valid file descriptor.</para> | ||
1232 | </entry> | ||
1233 | </row><row><entry | ||
1234 | align="char"> | ||
1235 | <para>EPERM</para> | ||
1236 | </entry><entry | ||
1237 | align="char"> | ||
1238 | <para>Permission denied (needs read/write access).</para> | ||
1239 | </entry> | ||
1240 | </row><row><entry | ||
1241 | align="char"> | ||
1242 | <para>EINTERNAL</para> | ||
1243 | </entry><entry | ||
1244 | align="char"> | ||
1245 | <para>Internal error in the device driver.</para> | ||
1246 | </entry> | ||
1247 | </row></tbody></tgroup></informaltable> | ||
1248 | </section> | ||
1249 | |||
1250 | <section id="frontend_diseqc_send_master_cmd"> | ||
1251 | <title>FE_DISEQC_SEND_MASTER_CMD</title> | ||
1252 | <para>DESCRIPTION | ||
1253 | </para> | ||
1254 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1255 | align="char"> | ||
1256 | <para>This ioctl call is used to send a a DiSEqC command.</para> | ||
1257 | </entry> | ||
1258 | </row></tbody></tgroup></informaltable> | ||
1259 | <para>SYNOPSIS | ||
1260 | </para> | ||
1261 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1262 | align="char"> | ||
1263 | <para>int ioctl(int fd, int request = | ||
1264 | FE_DISEQC_SEND_MASTER_CMD, struct | ||
1265 | dvb_diseqc_master_cmd ⋆cmd);</para> | ||
1266 | </entry> | ||
1267 | </row></tbody></tgroup></informaltable> | ||
1268 | |||
1269 | <para>PARAMETERS | ||
1270 | </para> | ||
1271 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1272 | align="char"> | ||
1273 | <para>int fd</para> | ||
1274 | </entry><entry | ||
1275 | align="char"> | ||
1276 | <para>File descriptor returned by a previous call to open().</para> | ||
1277 | </entry> | ||
1278 | </row><row><entry | ||
1279 | align="char"> | ||
1280 | <para>int request</para> | ||
1281 | </entry><entry | ||
1282 | align="char"> | ||
1283 | <para>Equals FE_DISEQC_SEND_MASTER_CMD for this | ||
1284 | command.</para> | ||
1285 | </entry> | ||
1286 | </row><row><entry | ||
1287 | align="char"> | ||
1288 | <para>struct | ||
1289 | dvb_diseqc_master_cmd | ||
1290 | *cmd</para> | ||
1291 | </entry><entry | ||
1292 | align="char"> | ||
1293 | <para>Pointer to the command to be transmitted.</para> | ||
1294 | </entry> | ||
1295 | </row></tbody></tgroup></informaltable> | ||
1296 | |||
1297 | <para>ERRORS | ||
1298 | </para> | ||
1299 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1300 | align="char"> | ||
1301 | <para>EBADF</para> | ||
1302 | </entry><entry | ||
1303 | align="char"> | ||
1304 | <para>fd is not a valid file descriptor.</para> | ||
1305 | </entry> | ||
1306 | </row><row><entry | ||
1307 | align="char"> | ||
1308 | <para>EFAULT</para> | ||
1309 | </entry><entry | ||
1310 | align="char"> | ||
1311 | <para>Seq points to an invalid address.</para> | ||
1312 | </entry> | ||
1313 | </row><row><entry | ||
1314 | align="char"> | ||
1315 | <para>EINVAL</para> | ||
1316 | </entry><entry | ||
1317 | align="char"> | ||
1318 | <para>The data structure referred to by seq is invalid in some | ||
1319 | way.</para> | ||
1320 | </entry> | ||
1321 | </row><row><entry | ||
1322 | align="char"> | ||
1323 | <para>EPERM</para> | ||
1324 | </entry><entry | ||
1325 | align="char"> | ||
1326 | <para>Permission denied (needs read/write access).</para> | ||
1327 | </entry> | ||
1328 | </row><row><entry | ||
1329 | align="char"> | ||
1330 | <para>EINTERNAL</para> | ||
1331 | </entry><entry | ||
1332 | align="char"> | ||
1333 | <para>Internal error in the device driver.</para> | ||
1334 | </entry> | ||
1335 | </row></tbody></tgroup></informaltable> | ||
1336 | </section> | ||
1337 | |||
1338 | <section id="frontend_diseqc_recv_slave_reply"> | ||
1339 | <title>FE_DISEQC_RECV_SLAVE_REPLY</title> | ||
1340 | <para>DESCRIPTION | ||
1341 | </para> | ||
1342 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1343 | align="char"> | ||
1344 | <para>This ioctl call is used to receive reply to a DiSEqC 2.0 command.</para> | ||
1345 | </entry> | ||
1346 | </row></tbody></tgroup></informaltable> | ||
1347 | |||
1348 | <para>SYNOPSIS | ||
1349 | </para> | ||
1350 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1351 | align="char"> | ||
1352 | <para>int ioctl(int fd, int request = | ||
1353 | FE_DISEQC_RECV_SLAVE_REPLY, struct | ||
1354 | dvb_diseqc_slave_reply ⋆reply);</para> | ||
1355 | </entry> | ||
1356 | </row></tbody></tgroup></informaltable> | ||
1357 | |||
1358 | <para>PARAMETERS | ||
1359 | </para> | ||
1360 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1361 | align="char"> | ||
1362 | <para>int fd</para> | ||
1363 | </entry><entry | ||
1364 | align="char"> | ||
1365 | <para>File descriptor returned by a previous call to open().</para> | ||
1366 | </entry> | ||
1367 | </row><row><entry | ||
1368 | align="char"> | ||
1369 | <para>int request</para> | ||
1370 | </entry><entry | ||
1371 | align="char"> | ||
1372 | <para>Equals FE_DISEQC_RECV_SLAVE_REPLY for this | ||
1373 | command.</para> | ||
1374 | </entry> | ||
1375 | </row><row><entry | ||
1376 | align="char"> | ||
1377 | <para>struct | ||
1378 | dvb_diseqc_slave_reply | ||
1379 | *reply</para> | ||
1380 | </entry><entry | ||
1381 | align="char"> | ||
1382 | <para>Pointer to the command to be received.</para> | ||
1383 | </entry> | ||
1384 | </row></tbody></tgroup></informaltable> | ||
1385 | <para>ERRORS | ||
1386 | </para> | ||
1387 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1388 | align="char"> | ||
1389 | <para>EBADF</para> | ||
1390 | </entry><entry | ||
1391 | align="char"> | ||
1392 | <para>fd is not a valid file descriptor.</para> | ||
1393 | </entry> | ||
1394 | </row><row><entry | ||
1395 | align="char"> | ||
1396 | <para>EFAULT</para> | ||
1397 | </entry><entry | ||
1398 | align="char"> | ||
1399 | <para>Seq points to an invalid address.</para> | ||
1400 | </entry> | ||
1401 | </row><row><entry | ||
1402 | align="char"> | ||
1403 | <para>EINVAL</para> | ||
1404 | </entry><entry | ||
1405 | align="char"> | ||
1406 | <para>The data structure referred to by seq is invalid in some | ||
1407 | way.</para> | ||
1408 | </entry> | ||
1409 | </row><row><entry | ||
1410 | align="char"> | ||
1411 | <para>EPERM</para> | ||
1412 | </entry><entry | ||
1413 | align="char"> | ||
1414 | <para>Permission denied (needs read/write access).</para> | ||
1415 | </entry> | ||
1416 | </row><row><entry | ||
1417 | align="char"> | ||
1418 | <para>EINTERNAL</para> | ||
1419 | </entry><entry | ||
1420 | align="char"> | ||
1421 | <para>Internal error in the device driver.</para> | ||
1422 | </entry> | ||
1423 | </row></tbody></tgroup></informaltable> | ||
1424 | </section> | ||
1425 | |||
1426 | <section id="frontend_diseqc_send_burst"> | ||
1427 | <title>FE_DISEQC_SEND_BURST</title> | ||
1428 | <para>DESCRIPTION | ||
1429 | </para> | ||
1430 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1431 | align="char"> | ||
1432 | <para>This ioctl call is used to send a 22KHz tone burst.</para> | ||
1433 | </entry> | ||
1434 | </row></tbody></tgroup></informaltable> | ||
1435 | |||
1436 | <para>SYNOPSIS | ||
1437 | </para> | ||
1438 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1439 | align="char"> | ||
1440 | <para>int ioctl(int fd, int request = | ||
1441 | FE_DISEQC_SEND_BURST, fe_sec_mini_cmd_t burst);</para> | ||
1442 | </entry> | ||
1443 | </row></tbody></tgroup></informaltable> | ||
1444 | |||
1445 | <para>PARAMETERS | ||
1446 | </para> | ||
1447 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1448 | align="char"> | ||
1449 | <para>int fd</para> | ||
1450 | </entry><entry | ||
1451 | align="char"> | ||
1452 | <para>File descriptor returned by a previous call to open().</para> | ||
1453 | </entry> | ||
1454 | </row><row><entry | ||
1455 | align="char"> | ||
1456 | <para>int request</para> | ||
1457 | </entry><entry | ||
1458 | align="char"> | ||
1459 | <para>Equals FE_DISEQC_SEND_BURST for this command.</para> | ||
1460 | </entry> | ||
1461 | </row><row><entry | ||
1462 | align="char"> | ||
1463 | <para>fe_sec_mini_cmd_t | ||
1464 | burst</para> | ||
1465 | </entry><entry | ||
1466 | align="char"> | ||
1467 | <para>burst A or B.</para> | ||
1468 | </entry> | ||
1469 | </row></tbody></tgroup></informaltable> | ||
1470 | |||
1471 | <para>ERRORS | ||
1472 | </para> | ||
1473 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1474 | align="char"> | ||
1475 | <para>EBADF</para> | ||
1476 | </entry><entry | ||
1477 | align="char"> | ||
1478 | <para>fd is not a valid file descriptor.</para> | ||
1479 | </entry> | ||
1480 | </row><row><entry | ||
1481 | align="char"> | ||
1482 | <para>EFAULT</para> | ||
1483 | </entry><entry | ||
1484 | align="char"> | ||
1485 | <para>Seq points to an invalid address.</para> | ||
1486 | </entry> | ||
1487 | </row><row><entry | ||
1488 | align="char"> | ||
1489 | <para>EINVAL</para> | ||
1490 | </entry><entry | ||
1491 | align="char"> | ||
1492 | <para>The data structure referred to by seq is invalid in some | ||
1493 | way.</para> | ||
1494 | </entry> | ||
1495 | </row><row><entry | ||
1496 | align="char"> | ||
1497 | <para>EPERM</para> | ||
1498 | </entry><entry | ||
1499 | align="char"> | ||
1500 | <para>Permission denied (needs read/write access).</para> | ||
1501 | </entry> | ||
1502 | </row><row><entry | ||
1503 | align="char"> | ||
1504 | <para>EINTERNAL</para> | ||
1505 | </entry><entry | ||
1506 | align="char"> | ||
1507 | <para>Internal error in the device driver.</para> | ||
1508 | </entry> | ||
1509 | </row></tbody></tgroup></informaltable> | ||
1510 | </section> | ||
1511 | |||
1512 | <section id="frontend_set_tone"> | ||
1513 | <title>FE_SET_TONE</title> | ||
1514 | <para>DESCRIPTION | ||
1515 | </para> | ||
1516 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1517 | align="char"> | ||
1518 | <para>This call is used to set the generation of the continuous 22kHz tone. This call | ||
1519 | requires read/write permissions.</para> | ||
1520 | </entry> | ||
1521 | </row></tbody></tgroup></informaltable> | ||
1522 | <para>SYNOPSIS | ||
1523 | </para> | ||
1524 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1525 | align="char"> | ||
1526 | <para>int ioctl(int fd, int request = FE_SET_TONE, | ||
1527 | fe_sec_tone_mode_t tone);</para> | ||
1528 | </entry> | ||
1529 | </row></tbody></tgroup></informaltable> | ||
1530 | <para>PARAMETERS | ||
1531 | </para> | ||
1532 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1533 | align="char"> | ||
1534 | <para>int fd</para> | ||
1535 | </entry><entry | ||
1536 | align="char"> | ||
1537 | <para>File descriptor returned by a previous call to open().</para> | ||
1538 | </entry> | ||
1539 | </row><row><entry | ||
1540 | align="char"> | ||
1541 | <para>int request</para> | ||
1542 | </entry><entry | ||
1543 | align="char"> | ||
1544 | <para>Equals FE_SET_TONE for this command.</para> | ||
1545 | </entry> | ||
1546 | </row><row><entry | ||
1547 | align="char"> | ||
1548 | <para>fe_sec_tone_mode_t | ||
1549 | tone</para> | ||
1550 | </entry><entry | ||
1551 | align="char"> | ||
1552 | <para>The requested tone generation mode (on/off).</para> | ||
1553 | </entry> | ||
1554 | </row></tbody></tgroup></informaltable> | ||
1555 | <para>ERRORS | ||
1556 | </para> | ||
1557 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1558 | align="char"> | ||
1559 | <para>ENODEV</para> | ||
1560 | </entry><entry | ||
1561 | align="char"> | ||
1562 | <para>Device driver not loaded/available.</para> | ||
1563 | </entry> | ||
1564 | </row><row><entry | ||
1565 | align="char"> | ||
1566 | <para>EBUSY</para> | ||
1567 | </entry><entry | ||
1568 | align="char"> | ||
1569 | <para>Device or resource busy.</para> | ||
1570 | </entry> | ||
1571 | </row><row><entry | ||
1572 | align="char"> | ||
1573 | <para>EINVAL</para> | ||
1574 | </entry><entry | ||
1575 | align="char"> | ||
1576 | <para>Invalid argument.</para> | ||
1577 | </entry> | ||
1578 | </row><row><entry | ||
1579 | align="char"> | ||
1580 | <para>EPERM</para> | ||
1581 | </entry><entry | ||
1582 | align="char"> | ||
1583 | <para>File not opened with read permissions.</para> | ||
1584 | </entry> | ||
1585 | </row><row><entry | ||
1586 | align="char"> | ||
1587 | <para>EINTERNAL</para> | ||
1588 | </entry><entry | ||
1589 | align="char"> | ||
1590 | <para>Internal error in the device driver.</para> | ||
1591 | </entry> | ||
1592 | </row></tbody></tgroup></informaltable> | ||
1593 | </section> | ||
1594 | |||
1595 | <section id="fe_set_voltage"> | ||
1596 | <title>FE_SET_VOLTAGE</title> | ||
1597 | <para>DESCRIPTION | ||
1598 | </para> | ||
1599 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1600 | align="char"> | ||
1601 | <para>This call is used to set the bus voltage. This call requires read/write | ||
1602 | permissions.</para> | ||
1603 | </entry> | ||
1604 | </row></tbody></tgroup></informaltable> | ||
1605 | <para>SYNOPSIS | ||
1606 | </para> | ||
1607 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1608 | align="char"> | ||
1609 | <para>int ioctl(int fd, int request = FE_SET_VOLTAGE, | ||
1610 | fe_sec_voltage_t voltage);</para> | ||
1611 | </entry> | ||
1612 | </row></tbody></tgroup></informaltable> | ||
1613 | |||
1614 | <para>PARAMETERS | ||
1615 | </para> | ||
1616 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1617 | align="char"> | ||
1618 | <para>int fd</para> | ||
1619 | </entry><entry | ||
1620 | align="char"> | ||
1621 | <para>File descriptor returned by a previous call to open().</para> | ||
1622 | </entry> | ||
1623 | </row><row><entry | ||
1624 | align="char"> | ||
1625 | <para>int request</para> | ||
1626 | </entry><entry | ||
1627 | align="char"> | ||
1628 | <para>Equals FE_SET_VOLTAGE for this command.</para> | ||
1629 | </entry> | ||
1630 | </row><row><entry | ||
1631 | align="char"> | ||
1632 | <para>fe_sec_voltage_t | ||
1633 | voltage</para> | ||
1634 | </entry><entry | ||
1635 | align="char"> | ||
1636 | <para>The requested bus voltage.</para> | ||
1637 | </entry> | ||
1638 | </row></tbody></tgroup></informaltable> | ||
1639 | |||
1640 | <para>ERRORS | ||
1641 | </para> | ||
1642 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1643 | align="char"> | ||
1644 | <para>ENODEV</para> | ||
1645 | </entry><entry | ||
1646 | align="char"> | ||
1647 | <para>Device driver not loaded/available.</para> | ||
1648 | </entry> | ||
1649 | </row><row><entry | ||
1650 | align="char"> | ||
1651 | <para>EBUSY</para> | ||
1652 | </entry><entry | ||
1653 | align="char"> | ||
1654 | <para>Device or resource busy.</para> | ||
1655 | </entry> | ||
1656 | </row><row><entry | ||
1657 | align="char"> | ||
1658 | <para>EINVAL</para> | ||
1659 | </entry><entry | ||
1660 | align="char"> | ||
1661 | <para>Invalid argument.</para> | ||
1662 | </entry> | ||
1663 | </row><row><entry | ||
1664 | align="char"> | ||
1665 | <para>EPERM</para> | ||
1666 | </entry><entry | ||
1667 | align="char"> | ||
1668 | <para>File not opened with read permissions.</para> | ||
1669 | </entry> | ||
1670 | </row><row><entry | ||
1671 | align="char"> | ||
1672 | <para>EINTERNAL</para> | ||
1673 | </entry><entry | ||
1674 | align="char"> | ||
1675 | <para>Internal error in the device driver.</para> | ||
1676 | </entry> | ||
1677 | </row></tbody></tgroup></informaltable> | ||
1678 | </section> | ||
1679 | |||
1680 | <section id="frontend_enable_high_lnb_volt"> | ||
1681 | <title>FE_ENABLE_HIGH_LNB_VOLTAGE</title> | ||
1682 | <para>DESCRIPTION | ||
1683 | </para> | ||
1684 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1685 | align="char"> | ||
1686 | <para>If high != 0 enables slightly higher voltages instead of 13/18V (to compensate | ||
1687 | for long cables). This call requires read/write permissions. Not all DVB | ||
1688 | adapters support this ioctl.</para> | ||
1689 | </entry> | ||
1690 | </row></tbody></tgroup></informaltable> | ||
1691 | |||
1692 | <para>SYNOPSIS | ||
1693 | </para> | ||
1694 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1695 | align="char"> | ||
1696 | <para>int ioctl(int fd, int request = | ||
1697 | FE_ENABLE_HIGH_LNB_VOLTAGE, int high);</para> | ||
1698 | </entry> | ||
1699 | </row></tbody></tgroup></informaltable> | ||
1700 | |||
1701 | <para>PARAMETERS | ||
1702 | </para> | ||
1703 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1704 | align="char"> | ||
1705 | <para>int fd</para> | ||
1706 | </entry><entry | ||
1707 | align="char"> | ||
1708 | <para>File descriptor returned by a previous call to open().</para> | ||
1709 | </entry> | ||
1710 | </row><row><entry | ||
1711 | align="char"> | ||
1712 | <para>int request</para> | ||
1713 | </entry><entry | ||
1714 | align="char"> | ||
1715 | <para>Equals FE_SET_VOLTAGE for this command.</para> | ||
1716 | </entry> | ||
1717 | </row><row><entry | ||
1718 | align="char"> | ||
1719 | <para>int high</para> | ||
1720 | </entry><entry | ||
1721 | align="char"> | ||
1722 | <para>The requested bus voltage.</para> | ||
1723 | </entry> | ||
1724 | </row></tbody></tgroup></informaltable> | ||
1725 | |||
1726 | <para>ERRORS | ||
1727 | </para> | ||
1728 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1729 | align="char"> | ||
1730 | <para>ENODEV</para> | ||
1731 | </entry><entry | ||
1732 | align="char"> | ||
1733 | <para>Device driver not loaded/available.</para> | ||
1734 | </entry> | ||
1735 | </row><row><entry | ||
1736 | align="char"> | ||
1737 | <para>EBUSY</para> | ||
1738 | </entry><entry | ||
1739 | align="char"> | ||
1740 | <para>Device or resource busy.</para> | ||
1741 | </entry> | ||
1742 | </row><row><entry | ||
1743 | align="char"> | ||
1744 | <para>EINVAL</para> | ||
1745 | </entry><entry | ||
1746 | align="char"> | ||
1747 | <para>Invalid argument.</para> | ||
1748 | </entry> | ||
1749 | </row><row><entry | ||
1750 | align="char"> | ||
1751 | <para>EPERM</para> | ||
1752 | </entry><entry | ||
1753 | align="char"> | ||
1754 | <para>File not opened with read permissions.</para> | ||
1755 | </entry> | ||
1756 | </row><row><entry | ||
1757 | align="char"> | ||
1758 | <para>EINTERNAL</para> | ||
1759 | </entry><entry | ||
1760 | align="char"> | ||
1761 | <para>Internal error in the device driver.</para> | ||
1762 | </entry> | ||
1763 | </row></tbody></tgroup></informaltable> | ||
1764 | </section> | ||
1765 | </section> | ||
diff --git a/Documentation/DocBook/dvb/intro.xml b/Documentation/DocBook/dvb/intro.xml new file mode 100644 index 000000000000..83676c44e8ae --- /dev/null +++ b/Documentation/DocBook/dvb/intro.xml | |||
@@ -0,0 +1,191 @@ | |||
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 | ||
13 | <emphasis role="tt">http://www.dvb.org/</emphasis> and/or | ||
14 | <emphasis role="tt">http://www.etsi.org/</emphasis>.</para> | ||
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 | ||
34 | available to all Linux developers and published it on <emphasis | ||
35 | role="tt">http://www.linuxtv.org/</emphasis> in September 2000. | ||
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 | |||
diff --git a/Documentation/DocBook/dvb/kdapi.xml b/Documentation/DocBook/dvb/kdapi.xml new file mode 100644 index 000000000000..6c67481eaa4b --- /dev/null +++ b/Documentation/DocBook/dvb/kdapi.xml | |||
@@ -0,0 +1,2309 @@ | |||
1 | <title>Kernel Demux API</title> | ||
2 | <para>The kernel demux API defines a driver-internal interface for registering low-level, | ||
3 | hardware specific driver to a hardware independent demux layer. It is only of interest for | ||
4 | DVB device driver writers. The header file for this API is named <emphasis role="tt">demux.h</emphasis> and located in | ||
5 | <emphasis role="tt">drivers/media/dvb/dvb-core</emphasis>. | ||
6 | </para> | ||
7 | <para>Maintainer note: This section must be reviewed. It is probably out of date. | ||
8 | </para> | ||
9 | |||
10 | <section id="kernel_demux_data_types"> | ||
11 | <title>Kernel Demux Data Types</title> | ||
12 | |||
13 | |||
14 | <section id="dmx_success_t"> | ||
15 | <title>dmx_success_t</title> | ||
16 | <programlisting> | ||
17 | typedef enum { | ||
18 | DMX_OK = 0, /⋆ Received Ok ⋆/ | ||
19 | DMX_LENGTH_ERROR, /⋆ Incorrect length ⋆/ | ||
20 | DMX_OVERRUN_ERROR, /⋆ Receiver ring buffer overrun ⋆/ | ||
21 | DMX_CRC_ERROR, /⋆ Incorrect CRC ⋆/ | ||
22 | DMX_FRAME_ERROR, /⋆ Frame alignment error ⋆/ | ||
23 | DMX_FIFO_ERROR, /⋆ Receiver FIFO overrun ⋆/ | ||
24 | DMX_MISSED_ERROR /⋆ Receiver missed packet ⋆/ | ||
25 | } dmx_success_t; | ||
26 | </programlisting> | ||
27 | |||
28 | </section> | ||
29 | <section id="ts_filter_types"> | ||
30 | <title>TS filter types</title> | ||
31 | <programlisting> | ||
32 | /⋆--------------------------------------------------------------------------⋆/ | ||
33 | /⋆ TS packet reception ⋆/ | ||
34 | /⋆--------------------------------------------------------------------------⋆/ | ||
35 | |||
36 | /⋆ TS filter type for set_type() ⋆/ | ||
37 | |||
38 | #define TS_PACKET 1 /⋆ send TS packets (188 bytes) to callback (default) ⋆/ | ||
39 | #define TS_PAYLOAD_ONLY 2 /⋆ in case TS_PACKET is set, only send the TS | ||
40 | payload (<=184 bytes per packet) to callback ⋆/ | ||
41 | #define TS_DECODER 4 /⋆ send stream to built-in decoder (if present) ⋆/ | ||
42 | </programlisting> | ||
43 | |||
44 | </section> | ||
45 | <section id="dmx_ts_pes_t"> | ||
46 | <title>dmx_ts_pes_t</title> | ||
47 | <para>The structure | ||
48 | </para> | ||
49 | <programlisting> | ||
50 | typedef enum | ||
51 | { | ||
52 | DMX_TS_PES_AUDIO, /⋆ also send packets to audio decoder (if it exists) ⋆/ | ||
53 | DMX_TS_PES_VIDEO, /⋆ ... ⋆/ | ||
54 | DMX_TS_PES_TELETEXT, | ||
55 | DMX_TS_PES_SUBTITLE, | ||
56 | DMX_TS_PES_PCR, | ||
57 | DMX_TS_PES_OTHER, | ||
58 | } dmx_ts_pes_t; | ||
59 | </programlisting> | ||
60 | <para>describes the PES type for filters which write to a built-in decoder. The correspond (and | ||
61 | should be kept identical) to the types in the demux device. | ||
62 | </para> | ||
63 | <programlisting> | ||
64 | struct dmx_ts_feed_s { | ||
65 | int is_filtering; /⋆ Set to non-zero when filtering in progress ⋆/ | ||
66 | struct dmx_demux_s⋆ parent; /⋆ Back-pointer ⋆/ | ||
67 | void⋆ priv; /⋆ Pointer to private data of the API client ⋆/ | ||
68 | int (⋆set) (struct dmx_ts_feed_s⋆ feed, | ||
69 | __u16 pid, | ||
70 | size_t callback_length, | ||
71 | size_t circular_buffer_size, | ||
72 | int descramble, | ||
73 | struct timespec timeout); | ||
74 | int (⋆start_filtering) (struct dmx_ts_feed_s⋆ feed); | ||
75 | int (⋆stop_filtering) (struct dmx_ts_feed_s⋆ feed); | ||
76 | int (⋆set_type) (struct dmx_ts_feed_s⋆ feed, | ||
77 | int type, | ||
78 | dmx_ts_pes_t pes_type); | ||
79 | }; | ||
80 | |||
81 | typedef struct dmx_ts_feed_s dmx_ts_feed_t; | ||
82 | </programlisting> | ||
83 | <programlisting> | ||
84 | /⋆--------------------------------------------------------------------------⋆/ | ||
85 | /⋆ PES packet reception (not supported yet) ⋆/ | ||
86 | /⋆--------------------------------------------------------------------------⋆/ | ||
87 | |||
88 | typedef struct dmx_pes_filter_s { | ||
89 | struct dmx_pes_s⋆ parent; /⋆ Back-pointer ⋆/ | ||
90 | void⋆ priv; /⋆ Pointer to private data of the API client ⋆/ | ||
91 | } dmx_pes_filter_t; | ||
92 | </programlisting> | ||
93 | <programlisting> | ||
94 | typedef struct dmx_pes_feed_s { | ||
95 | int is_filtering; /⋆ Set to non-zero when filtering in progress ⋆/ | ||
96 | struct dmx_demux_s⋆ parent; /⋆ Back-pointer ⋆/ | ||
97 | void⋆ priv; /⋆ Pointer to private data of the API client ⋆/ | ||
98 | int (⋆set) (struct dmx_pes_feed_s⋆ feed, | ||
99 | __u16 pid, | ||
100 | size_t circular_buffer_size, | ||
101 | int descramble, | ||
102 | struct timespec timeout); | ||
103 | int (⋆start_filtering) (struct dmx_pes_feed_s⋆ feed); | ||
104 | int (⋆stop_filtering) (struct dmx_pes_feed_s⋆ feed); | ||
105 | int (⋆allocate_filter) (struct dmx_pes_feed_s⋆ feed, | ||
106 | dmx_pes_filter_t⋆⋆ filter); | ||
107 | int (⋆release_filter) (struct dmx_pes_feed_s⋆ feed, | ||
108 | dmx_pes_filter_t⋆ filter); | ||
109 | } dmx_pes_feed_t; | ||
110 | </programlisting> | ||
111 | <programlisting> | ||
112 | typedef struct { | ||
113 | __u8 filter_value [DMX_MAX_FILTER_SIZE]; | ||
114 | __u8 filter_mask [DMX_MAX_FILTER_SIZE]; | ||
115 | struct dmx_section_feed_s⋆ parent; /⋆ Back-pointer ⋆/ | ||
116 | void⋆ priv; /⋆ Pointer to private data of the API client ⋆/ | ||
117 | } dmx_section_filter_t; | ||
118 | </programlisting> | ||
119 | <programlisting> | ||
120 | struct dmx_section_feed_s { | ||
121 | int is_filtering; /⋆ Set to non-zero when filtering in progress ⋆/ | ||
122 | struct dmx_demux_s⋆ parent; /⋆ Back-pointer ⋆/ | ||
123 | void⋆ priv; /⋆ Pointer to private data of the API client ⋆/ | ||
124 | int (⋆set) (struct dmx_section_feed_s⋆ feed, | ||
125 | __u16 pid, | ||
126 | size_t circular_buffer_size, | ||
127 | int descramble, | ||
128 | int check_crc); | ||
129 | int (⋆allocate_filter) (struct dmx_section_feed_s⋆ feed, | ||
130 | dmx_section_filter_t⋆⋆ filter); | ||
131 | int (⋆release_filter) (struct dmx_section_feed_s⋆ feed, | ||
132 | dmx_section_filter_t⋆ filter); | ||
133 | int (⋆start_filtering) (struct dmx_section_feed_s⋆ feed); | ||
134 | int (⋆stop_filtering) (struct dmx_section_feed_s⋆ feed); | ||
135 | }; | ||
136 | typedef struct dmx_section_feed_s dmx_section_feed_t; | ||
137 | |||
138 | /⋆--------------------------------------------------------------------------⋆/ | ||
139 | /⋆ Callback functions ⋆/ | ||
140 | /⋆--------------------------------------------------------------------------⋆/ | ||
141 | |||
142 | typedef int (⋆dmx_ts_cb) ( __u8 ⋆ buffer1, | ||
143 | size_t buffer1_length, | ||
144 | __u8 ⋆ buffer2, | ||
145 | size_t buffer2_length, | ||
146 | dmx_ts_feed_t⋆ source, | ||
147 | dmx_success_t success); | ||
148 | |||
149 | typedef int (⋆dmx_section_cb) ( __u8 ⋆ buffer1, | ||
150 | size_t buffer1_len, | ||
151 | __u8 ⋆ buffer2, | ||
152 | size_t buffer2_len, | ||
153 | dmx_section_filter_t ⋆ source, | ||
154 | dmx_success_t success); | ||
155 | |||
156 | typedef int (⋆dmx_pes_cb) ( __u8 ⋆ buffer1, | ||
157 | size_t buffer1_len, | ||
158 | __u8 ⋆ buffer2, | ||
159 | size_t buffer2_len, | ||
160 | dmx_pes_filter_t⋆ source, | ||
161 | dmx_success_t success); | ||
162 | |||
163 | /⋆--------------------------------------------------------------------------⋆/ | ||
164 | /⋆ DVB Front-End ⋆/ | ||
165 | /⋆--------------------------------------------------------------------------⋆/ | ||
166 | |||
167 | typedef enum { | ||
168 | DMX_OTHER_FE = 0, | ||
169 | DMX_SATELLITE_FE, | ||
170 | DMX_CABLE_FE, | ||
171 | DMX_TERRESTRIAL_FE, | ||
172 | DMX_LVDS_FE, | ||
173 | DMX_ASI_FE, /⋆ DVB-ASI interface ⋆/ | ||
174 | DMX_MEMORY_FE | ||
175 | } dmx_frontend_source_t; | ||
176 | |||
177 | typedef struct { | ||
178 | /⋆ The following char⋆ fields point to NULL terminated strings ⋆/ | ||
179 | char⋆ id; /⋆ Unique front-end identifier ⋆/ | ||
180 | char⋆ vendor; /⋆ Name of the front-end vendor ⋆/ | ||
181 | char⋆ model; /⋆ Name of the front-end model ⋆/ | ||
182 | struct list_head connectivity_list; /⋆ List of front-ends that can | ||
183 | be connected to a particular | ||
184 | demux ⋆/ | ||
185 | void⋆ priv; /⋆ Pointer to private data of the API client ⋆/ | ||
186 | dmx_frontend_source_t source; | ||
187 | } dmx_frontend_t; | ||
188 | |||
189 | /⋆--------------------------------------------------------------------------⋆/ | ||
190 | /⋆ MPEG-2 TS Demux ⋆/ | ||
191 | /⋆--------------------------------------------------------------------------⋆/ | ||
192 | |||
193 | /⋆ | ||
194 | ⋆ Flags OR'ed in the capabilites field of struct dmx_demux_s. | ||
195 | ⋆/ | ||
196 | |||
197 | #define DMX_TS_FILTERING 1 | ||
198 | #define DMX_PES_FILTERING 2 | ||
199 | #define DMX_SECTION_FILTERING 4 | ||
200 | #define DMX_MEMORY_BASED_FILTERING 8 /⋆ write() available ⋆/ | ||
201 | #define DMX_CRC_CHECKING 16 | ||
202 | #define DMX_TS_DESCRAMBLING 32 | ||
203 | #define DMX_SECTION_PAYLOAD_DESCRAMBLING 64 | ||
204 | #define DMX_MAC_ADDRESS_DESCRAMBLING 128 | ||
205 | </programlisting> | ||
206 | |||
207 | </section> | ||
208 | <section id="demux_demux_t"> | ||
209 | <title>demux_demux_t</title> | ||
210 | <programlisting> | ||
211 | /⋆ | ||
212 | ⋆ DMX_FE_ENTRY(): Casts elements in the list of registered | ||
213 | ⋆ front-ends from the generic type struct list_head | ||
214 | ⋆ to the type ⋆ dmx_frontend_t | ||
215 | ⋆. | ||
216 | ⋆/ | ||
217 | |||
218 | #define DMX_FE_ENTRY(list) list_entry(list, dmx_frontend_t, connectivity_list) | ||
219 | |||
220 | struct dmx_demux_s { | ||
221 | /⋆ The following char⋆ fields point to NULL terminated strings ⋆/ | ||
222 | char⋆ id; /⋆ Unique demux identifier ⋆/ | ||
223 | char⋆ vendor; /⋆ Name of the demux vendor ⋆/ | ||
224 | char⋆ model; /⋆ Name of the demux model ⋆/ | ||
225 | __u32 capabilities; /⋆ Bitfield of capability flags ⋆/ | ||
226 | dmx_frontend_t⋆ frontend; /⋆ Front-end connected to the demux ⋆/ | ||
227 | struct list_head reg_list; /⋆ List of registered demuxes ⋆/ | ||
228 | void⋆ priv; /⋆ Pointer to private data of the API client ⋆/ | ||
229 | int users; /⋆ Number of users ⋆/ | ||
230 | int (⋆open) (struct dmx_demux_s⋆ demux); | ||
231 | int (⋆close) (struct dmx_demux_s⋆ demux); | ||
232 | int (⋆write) (struct dmx_demux_s⋆ demux, const char⋆ buf, size_t count); | ||
233 | int (⋆allocate_ts_feed) (struct dmx_demux_s⋆ demux, | ||
234 | dmx_ts_feed_t⋆⋆ feed, | ||
235 | dmx_ts_cb callback); | ||
236 | int (⋆release_ts_feed) (struct dmx_demux_s⋆ demux, | ||
237 | dmx_ts_feed_t⋆ feed); | ||
238 | int (⋆allocate_pes_feed) (struct dmx_demux_s⋆ demux, | ||
239 | dmx_pes_feed_t⋆⋆ feed, | ||
240 | dmx_pes_cb callback); | ||
241 | int (⋆release_pes_feed) (struct dmx_demux_s⋆ demux, | ||
242 | dmx_pes_feed_t⋆ feed); | ||
243 | int (⋆allocate_section_feed) (struct dmx_demux_s⋆ demux, | ||
244 | dmx_section_feed_t⋆⋆ feed, | ||
245 | dmx_section_cb callback); | ||
246 | int (⋆release_section_feed) (struct dmx_demux_s⋆ demux, | ||
247 | dmx_section_feed_t⋆ feed); | ||
248 | int (⋆descramble_mac_address) (struct dmx_demux_s⋆ demux, | ||
249 | __u8⋆ buffer1, | ||
250 | size_t buffer1_length, | ||
251 | __u8⋆ buffer2, | ||
252 | size_t buffer2_length, | ||
253 | __u16 pid); | ||
254 | int (⋆descramble_section_payload) (struct dmx_demux_s⋆ demux, | ||
255 | __u8⋆ buffer1, | ||
256 | size_t buffer1_length, | ||
257 | __u8⋆ buffer2, size_t buffer2_length, | ||
258 | __u16 pid); | ||
259 | int (⋆add_frontend) (struct dmx_demux_s⋆ demux, | ||
260 | dmx_frontend_t⋆ frontend); | ||
261 | int (⋆remove_frontend) (struct dmx_demux_s⋆ demux, | ||
262 | dmx_frontend_t⋆ frontend); | ||
263 | struct list_head⋆ (⋆get_frontends) (struct dmx_demux_s⋆ demux); | ||
264 | int (⋆connect_frontend) (struct dmx_demux_s⋆ demux, | ||
265 | dmx_frontend_t⋆ frontend); | ||
266 | int (⋆disconnect_frontend) (struct dmx_demux_s⋆ demux); | ||
267 | |||
268 | |||
269 | /⋆ added because js cannot keep track of these himself ⋆/ | ||
270 | int (⋆get_pes_pids) (struct dmx_demux_s⋆ demux, __u16 ⋆pids); | ||
271 | }; | ||
272 | typedef struct dmx_demux_s dmx_demux_t; | ||
273 | </programlisting> | ||
274 | |||
275 | </section> | ||
276 | <section id="demux_directory"> | ||
277 | <title>Demux directory</title> | ||
278 | <programlisting> | ||
279 | /⋆ | ||
280 | ⋆ DMX_DIR_ENTRY(): Casts elements in the list of registered | ||
281 | ⋆ demuxes from the generic type struct list_head⋆ to the type dmx_demux_t | ||
282 | ⋆. | ||
283 | ⋆/ | ||
284 | |||
285 | #define DMX_DIR_ENTRY(list) list_entry(list, dmx_demux_t, reg_list) | ||
286 | |||
287 | int dmx_register_demux (dmx_demux_t⋆ demux); | ||
288 | int dmx_unregister_demux (dmx_demux_t⋆ demux); | ||
289 | struct list_head⋆ dmx_get_demuxes (void); | ||
290 | </programlisting> | ||
291 | </section></section> | ||
292 | <section id="demux_directory_api"> | ||
293 | <title>Demux Directory API</title> | ||
294 | <para>The demux directory is a Linux kernel-wide facility for registering and accessing the | ||
295 | MPEG-2 TS demuxes in the system. Run-time registering and unregistering of demux drivers | ||
296 | is possible using this API. | ||
297 | </para> | ||
298 | <para>All demux drivers in the directory implement the abstract interface dmx_demux_t. | ||
299 | </para> | ||
300 | |||
301 | <section | ||
302 | role="subsection"><title>dmx_register_demux()</title> | ||
303 | <para>DESCRIPTION | ||
304 | </para> | ||
305 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
306 | align="char"> | ||
307 | <para>This function makes a demux driver interface available to the Linux kernel. It is | ||
308 | usually called by the init_module() function of the kernel module that contains | ||
309 | the demux driver. The caller of this function is responsible for allocating | ||
310 | dynamic or static memory for the demux structure and for initializing its fields | ||
311 | before calling this function. The memory allocated for the demux structure | ||
312 | must not be freed before calling dmx_unregister_demux(),</para> | ||
313 | </entry> | ||
314 | </row></tbody></tgroup></informaltable> | ||
315 | <para>SYNOPSIS | ||
316 | </para> | ||
317 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
318 | align="char"> | ||
319 | <para>int dmx_register_demux ( dmx_demux_t ⋆demux )</para> | ||
320 | </entry> | ||
321 | </row></tbody></tgroup></informaltable> | ||
322 | <para>PARAMETERS | ||
323 | </para> | ||
324 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
325 | align="char"> | ||
326 | <para>dmx_demux_t* | ||
327 | demux</para> | ||
328 | </entry><entry | ||
329 | align="char"> | ||
330 | <para>Pointer to the demux structure.</para> | ||
331 | </entry> | ||
332 | </row></tbody></tgroup></informaltable> | ||
333 | <para>RETURNS | ||
334 | </para> | ||
335 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
336 | align="char"> | ||
337 | <para>0</para> | ||
338 | </entry><entry | ||
339 | align="char"> | ||
340 | <para>The function was completed without errors.</para> | ||
341 | </entry> | ||
342 | </row><row><entry | ||
343 | align="char"> | ||
344 | <para>-EEXIST</para> | ||
345 | </entry><entry | ||
346 | align="char"> | ||
347 | <para>A demux with the same value of the id field already stored | ||
348 | in the directory.</para> | ||
349 | </entry> | ||
350 | </row><row><entry | ||
351 | align="char"> | ||
352 | <para>-ENOSPC</para> | ||
353 | </entry><entry | ||
354 | align="char"> | ||
355 | <para>No space left in the directory.</para> | ||
356 | </entry> | ||
357 | </row></tbody></tgroup></informaltable> | ||
358 | |||
359 | </section><section | ||
360 | role="subsection"><title>dmx_unregister_demux()</title> | ||
361 | <para>DESCRIPTION | ||
362 | </para> | ||
363 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
364 | align="char"> | ||
365 | <para>This function is called to indicate that the given demux interface is no | ||
366 | longer available. The caller of this function is responsible for freeing the | ||
367 | memory of the demux structure, if it was dynamically allocated before calling | ||
368 | dmx_register_demux(). The cleanup_module() function of the kernel module | ||
369 | that contains the demux driver should call this function. Note that this function | ||
370 | fails if the demux is currently in use, i.e., release_demux() has not been called | ||
371 | for the interface.</para> | ||
372 | </entry> | ||
373 | </row></tbody></tgroup></informaltable> | ||
374 | <para>SYNOPSIS | ||
375 | </para> | ||
376 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
377 | align="char"> | ||
378 | <para>int dmx_unregister_demux ( dmx_demux_t ⋆demux )</para> | ||
379 | </entry> | ||
380 | </row></tbody></tgroup></informaltable> | ||
381 | <para>PARAMETERS | ||
382 | </para> | ||
383 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
384 | align="char"> | ||
385 | <para>dmx_demux_t* | ||
386 | demux</para> | ||
387 | </entry><entry | ||
388 | align="char"> | ||
389 | <para>Pointer to the demux structure which is to be | ||
390 | unregistered.</para> | ||
391 | </entry> | ||
392 | </row></tbody></tgroup></informaltable> | ||
393 | <para>RETURNS | ||
394 | </para> | ||
395 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
396 | align="char"> | ||
397 | <para>0</para> | ||
398 | </entry><entry | ||
399 | align="char"> | ||
400 | <para>The function was completed without errors.</para> | ||
401 | </entry> | ||
402 | </row><row><entry | ||
403 | align="char"> | ||
404 | <para>ENODEV</para> | ||
405 | </entry><entry | ||
406 | align="char"> | ||
407 | <para>The specified demux is not registered in the demux | ||
408 | directory.</para> | ||
409 | </entry> | ||
410 | </row><row><entry | ||
411 | align="char"> | ||
412 | <para>EBUSY</para> | ||
413 | </entry><entry | ||
414 | align="char"> | ||
415 | <para>The specified demux is currently in use.</para> | ||
416 | </entry> | ||
417 | </row></tbody></tgroup></informaltable> | ||
418 | |||
419 | </section><section | ||
420 | role="subsection"><title>dmx_get_demuxes()</title> | ||
421 | <para>DESCRIPTION | ||
422 | </para> | ||
423 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
424 | align="char"> | ||
425 | <para>Provides the caller with the list of registered demux interfaces, using the | ||
426 | standard list structure defined in the include file linux/list.h. The include file | ||
427 | demux.h defines the macro DMX_DIR_ENTRY() for converting an element of | ||
428 | the generic type struct list_head* to the type dmx_demux_t*. The caller must | ||
429 | not free the memory of any of the elements obtained via this function call.</para> | ||
430 | </entry> | ||
431 | </row></tbody></tgroup></informaltable> | ||
432 | <para>SYNOPSIS | ||
433 | </para> | ||
434 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
435 | align="char"> | ||
436 | <para>struct list_head ⋆dmx_get_demuxes ()</para> | ||
437 | </entry> | ||
438 | </row></tbody></tgroup></informaltable> | ||
439 | <para>PARAMETERS | ||
440 | </para> | ||
441 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
442 | align="char"> | ||
443 | <para>none</para> | ||
444 | </entry> | ||
445 | </row></tbody></tgroup></informaltable> | ||
446 | <para>RETURNS | ||
447 | </para> | ||
448 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
449 | align="char"> | ||
450 | <para>struct list_head *</para> | ||
451 | </entry><entry | ||
452 | align="char"> | ||
453 | <para>A list of demux interfaces, or NULL in the case of an | ||
454 | empty list.</para> | ||
455 | </entry> | ||
456 | </row></tbody></tgroup></informaltable> | ||
457 | </section></section> | ||
458 | <section id="demux_api"> | ||
459 | <title>Demux API</title> | ||
460 | <para>The demux API should be implemented for each demux in the system. It is used to select | ||
461 | the TS source of a demux and to manage the demux resources. When the demux | ||
462 | client allocates a resource via the demux API, it receives a pointer to the API of that | ||
463 | resource. | ||
464 | </para> | ||
465 | <para>Each demux receives its TS input from a DVB front-end or from memory, as set via the | ||
466 | demux API. In a system with more than one front-end, the API can be used to select one of | ||
467 | the DVB front-ends as a TS source for a demux, unless this is fixed in the HW platform. The | ||
468 | demux API only controls front-ends regarding their connections with demuxes; the APIs | ||
469 | used to set the other front-end parameters, such as tuning, are not defined in this | ||
470 | document. | ||
471 | </para> | ||
472 | <para>The functions that implement the abstract interface demux should be defined static or | ||
473 | module private and registered to the Demux Directory for external access. It is not necessary | ||
474 | to implement every function in the demux_t struct, however (for example, a demux interface | ||
475 | might support Section filtering, but not TS or PES filtering). The API client is expected to | ||
476 | check the value of any function pointer before calling the function: the value of NULL means | ||
477 | “function not available”. | ||
478 | </para> | ||
479 | <para>Whenever the functions of the demux API modify shared data, the possibilities of lost | ||
480 | update and race condition problems should be addressed, e.g. by protecting parts of code with | ||
481 | mutexes. This is especially important on multi-processor hosts. | ||
482 | </para> | ||
483 | <para>Note that functions called from a bottom half context must not sleep, at least in the 2.2.x | ||
484 | kernels. Even a simple memory allocation can result in a kernel thread being put to sleep if | ||
485 | swapping is needed. For example, the Linux kernel calls the functions of a network device | ||
486 | interface from a bottom half context. Thus, if a demux API function is called from network | ||
487 | device code, the function must not sleep. | ||
488 | </para> | ||
489 | |||
490 | |||
491 | <section id="kdapi_fopen"> | ||
492 | <title>open()</title> | ||
493 | <para>DESCRIPTION | ||
494 | </para> | ||
495 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
496 | align="char"> | ||
497 | <para>This function reserves the demux for use by the caller and, if necessary, | ||
498 | initializes the demux. When the demux is no longer needed, the function close() | ||
499 | should be called. It should be possible for multiple clients to access the demux | ||
500 | at the same time. Thus, the function implementation should increment the | ||
501 | demux usage count when open() is called and decrement it when close() is | ||
502 | called.</para> | ||
503 | </entry> | ||
504 | </row></tbody></tgroup></informaltable> | ||
505 | <para>SYNOPSIS | ||
506 | </para> | ||
507 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
508 | align="char"> | ||
509 | <para>int open ( demux_t⋆ demux );</para> | ||
510 | </entry> | ||
511 | </row></tbody></tgroup></informaltable> | ||
512 | <para>PARAMETERS | ||
513 | </para> | ||
514 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
515 | align="char"> | ||
516 | <para>demux_t* demux</para> | ||
517 | </entry><entry | ||
518 | align="char"> | ||
519 | <para>Pointer to the demux API and instance data.</para> | ||
520 | </entry> | ||
521 | </row></tbody></tgroup></informaltable> | ||
522 | <para>RETURNS | ||
523 | </para> | ||
524 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
525 | align="char"> | ||
526 | <para>0</para> | ||
527 | </entry><entry | ||
528 | align="char"> | ||
529 | <para>The function was completed without errors.</para> | ||
530 | </entry> | ||
531 | </row><row><entry | ||
532 | align="char"> | ||
533 | <para>-EUSERS</para> | ||
534 | </entry><entry | ||
535 | align="char"> | ||
536 | <para>Maximum usage count reached.</para> | ||
537 | </entry> | ||
538 | </row><row><entry | ||
539 | align="char"> | ||
540 | <para>-EINVAL</para> | ||
541 | </entry><entry | ||
542 | align="char"> | ||
543 | <para>Bad parameter.</para> | ||
544 | </entry> | ||
545 | </row></tbody></tgroup></informaltable> | ||
546 | |||
547 | </section> | ||
548 | <section id="kdapi_fclose"> | ||
549 | <title>close()</title> | ||
550 | <para>DESCRIPTION | ||
551 | </para> | ||
552 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
553 | align="char"> | ||
554 | <para>This function reserves the demux for use by the caller and, if necessary, | ||
555 | initializes the demux. When the demux is no longer needed, the function close() | ||
556 | should be called. It should be possible for multiple clients to access the demux | ||
557 | at the same time. Thus, the function implementation should increment the | ||
558 | demux usage count when open() is called and decrement it when close() is | ||
559 | called.</para> | ||
560 | </entry> | ||
561 | </row></tbody></tgroup></informaltable> | ||
562 | <para>SYNOPSIS | ||
563 | </para> | ||
564 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
565 | align="char"> | ||
566 | <para>int close(demux_t⋆ demux);</para> | ||
567 | </entry> | ||
568 | </row></tbody></tgroup></informaltable> | ||
569 | <para>PARAMETERS | ||
570 | </para> | ||
571 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
572 | align="char"> | ||
573 | <para>demux_t* demux</para> | ||
574 | </entry><entry | ||
575 | align="char"> | ||
576 | <para>Pointer to the demux API and instance data.</para> | ||
577 | </entry> | ||
578 | </row></tbody></tgroup></informaltable> | ||
579 | <para>RETURNS | ||
580 | </para> | ||
581 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
582 | align="char"> | ||
583 | <para>0</para> | ||
584 | </entry><entry | ||
585 | align="char"> | ||
586 | <para>The function was completed without errors.</para> | ||
587 | </entry> | ||
588 | </row><row><entry | ||
589 | align="char"> | ||
590 | <para>-ENODEV</para> | ||
591 | </entry><entry | ||
592 | align="char"> | ||
593 | <para>The demux was not in use.</para> | ||
594 | </entry> | ||
595 | </row><row><entry | ||
596 | align="char"> | ||
597 | <para>-EINVAL</para> | ||
598 | </entry><entry | ||
599 | align="char"> | ||
600 | <para>Bad parameter.</para> | ||
601 | </entry> | ||
602 | </row></tbody></tgroup></informaltable> | ||
603 | |||
604 | </section> | ||
605 | <section id="kdapi_fwrite"> | ||
606 | <title>write()</title> | ||
607 | <para>DESCRIPTION | ||
608 | </para> | ||
609 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
610 | align="char"> | ||
611 | <para>This function provides the demux driver with a memory buffer containing TS | ||
612 | packets. Instead of receiving TS packets from the DVB front-end, the demux | ||
613 | driver software will read packets from memory. Any clients of this demux | ||
614 | with active TS, PES or Section filters will receive filtered data via the Demux | ||
615 | callback API (see 0). The function returns when all the data in the buffer has | ||
616 | been consumed by the demux. Demux hardware typically cannot read TS from | ||
617 | memory. If this is the case, memory-based filtering has to be implemented | ||
618 | entirely in software.</para> | ||
619 | </entry> | ||
620 | </row></tbody></tgroup></informaltable> | ||
621 | <para>SYNOPSIS | ||
622 | </para> | ||
623 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
624 | align="char"> | ||
625 | <para>int write(demux_t⋆ demux, const char⋆ buf, size_t | ||
626 | count);</para> | ||
627 | </entry> | ||
628 | </row></tbody></tgroup></informaltable> | ||
629 | <para>PARAMETERS | ||
630 | </para> | ||
631 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
632 | align="char"> | ||
633 | <para>demux_t* demux</para> | ||
634 | </entry><entry | ||
635 | align="char"> | ||
636 | <para>Pointer to the demux API and instance data.</para> | ||
637 | </entry> | ||
638 | </row><row><entry | ||
639 | align="char"> | ||
640 | <para>const char* buf</para> | ||
641 | </entry><entry | ||
642 | align="char"> | ||
643 | <para>Pointer to the TS data in kernel-space memory.</para> | ||
644 | </entry> | ||
645 | </row><row><entry | ||
646 | align="char"> | ||
647 | <para>size_t length</para> | ||
648 | </entry><entry | ||
649 | align="char"> | ||
650 | <para>Length of the TS data.</para> | ||
651 | </entry> | ||
652 | </row></tbody></tgroup></informaltable> | ||
653 | <para>RETURNS | ||
654 | </para> | ||
655 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
656 | align="char"> | ||
657 | <para>0</para> | ||
658 | </entry><entry | ||
659 | align="char"> | ||
660 | <para>The function was completed without errors.</para> | ||
661 | </entry> | ||
662 | </row><row><entry | ||
663 | align="char"> | ||
664 | <para>-ENOSYS</para> | ||
665 | </entry><entry | ||
666 | align="char"> | ||
667 | <para>The command is not implemented.</para> | ||
668 | </entry> | ||
669 | </row><row><entry | ||
670 | align="char"> | ||
671 | <para>-EINVAL</para> | ||
672 | </entry><entry | ||
673 | align="char"> | ||
674 | <para>Bad parameter.</para> | ||
675 | </entry> | ||
676 | </row></tbody></tgroup></informaltable> | ||
677 | |||
678 | </section><section | ||
679 | role="subsection"><title>allocate_ts_feed()</title> | ||
680 | <para>DESCRIPTION | ||
681 | </para> | ||
682 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
683 | align="char"> | ||
684 | <para>Allocates a new TS feed, which is used to filter the TS packets carrying a | ||
685 | certain PID. The TS feed normally corresponds to a hardware PID filter on the | ||
686 | demux chip.</para> | ||
687 | </entry> | ||
688 | </row></tbody></tgroup></informaltable> | ||
689 | <para>SYNOPSIS | ||
690 | </para> | ||
691 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
692 | align="char"> | ||
693 | <para>int allocate_ts_feed(dmx_demux_t⋆ demux, | ||
694 | dmx_ts_feed_t⋆⋆ feed, dmx_ts_cb callback);</para> | ||
695 | </entry> | ||
696 | </row></tbody></tgroup></informaltable> | ||
697 | <para>PARAMETERS | ||
698 | </para> | ||
699 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
700 | align="char"> | ||
701 | <para>demux_t* demux</para> | ||
702 | </entry><entry | ||
703 | align="char"> | ||
704 | <para>Pointer to the demux API and instance data.</para> | ||
705 | </entry> | ||
706 | </row><row><entry | ||
707 | align="char"> | ||
708 | <para>dmx_ts_feed_t** | ||
709 | feed</para> | ||
710 | </entry><entry | ||
711 | align="char"> | ||
712 | <para>Pointer to the TS feed API and instance data.</para> | ||
713 | </entry> | ||
714 | </row><row><entry | ||
715 | align="char"> | ||
716 | <para>dmx_ts_cb callback</para> | ||
717 | </entry><entry | ||
718 | align="char"> | ||
719 | <para>Pointer to the callback function for passing received TS | ||
720 | packet</para> | ||
721 | </entry> | ||
722 | </row></tbody></tgroup></informaltable> | ||
723 | <para>RETURNS | ||
724 | </para> | ||
725 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
726 | align="char"> | ||
727 | <para>0</para> | ||
728 | </entry><entry | ||
729 | align="char"> | ||
730 | <para>The function was completed without errors.</para> | ||
731 | </entry> | ||
732 | </row><row><entry | ||
733 | align="char"> | ||
734 | <para>-EBUSY</para> | ||
735 | </entry><entry | ||
736 | align="char"> | ||
737 | <para>No more TS feeds available.</para> | ||
738 | </entry> | ||
739 | </row><row><entry | ||
740 | align="char"> | ||
741 | <para>-ENOSYS</para> | ||
742 | </entry><entry | ||
743 | align="char"> | ||
744 | <para>The command is not implemented.</para> | ||
745 | </entry> | ||
746 | </row><row><entry | ||
747 | align="char"> | ||
748 | <para>-EINVAL</para> | ||
749 | </entry><entry | ||
750 | align="char"> | ||
751 | <para>Bad parameter.</para> | ||
752 | </entry> | ||
753 | </row></tbody></tgroup></informaltable> | ||
754 | |||
755 | </section><section | ||
756 | role="subsection"><title>release_ts_feed()</title> | ||
757 | <para>DESCRIPTION | ||
758 | </para> | ||
759 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
760 | align="char"> | ||
761 | <para>Releases the resources allocated with allocate_ts_feed(). Any filtering in | ||
762 | progress on the TS feed should be stopped before calling this function.</para> | ||
763 | </entry> | ||
764 | </row></tbody></tgroup></informaltable> | ||
765 | <para>SYNOPSIS | ||
766 | </para> | ||
767 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
768 | align="char"> | ||
769 | <para>int release_ts_feed(dmx_demux_t⋆ demux, | ||
770 | dmx_ts_feed_t⋆ feed);</para> | ||
771 | </entry> | ||
772 | </row></tbody></tgroup></informaltable> | ||
773 | <para>PARAMETERS | ||
774 | </para> | ||
775 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
776 | align="char"> | ||
777 | <para>demux_t* demux</para> | ||
778 | </entry><entry | ||
779 | align="char"> | ||
780 | <para>Pointer to the demux API and instance data.</para> | ||
781 | </entry> | ||
782 | </row><row><entry | ||
783 | align="char"> | ||
784 | <para>dmx_ts_feed_t* feed</para> | ||
785 | </entry><entry | ||
786 | align="char"> | ||
787 | <para>Pointer to the TS feed API and instance data.</para> | ||
788 | </entry> | ||
789 | </row></tbody></tgroup></informaltable> | ||
790 | <para>RETURNS | ||
791 | </para> | ||
792 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
793 | align="char"> | ||
794 | <para>0</para> | ||
795 | </entry><entry | ||
796 | align="char"> | ||
797 | <para>The function was completed without errors.</para> | ||
798 | </entry> | ||
799 | </row><row><entry | ||
800 | align="char"> | ||
801 | <para>-EINVAL</para> | ||
802 | </entry><entry | ||
803 | align="char"> | ||
804 | <para>Bad parameter.</para> | ||
805 | </entry> | ||
806 | </row></tbody></tgroup></informaltable> | ||
807 | |||
808 | </section><section | ||
809 | role="subsection"><title>allocate_section_feed()</title> | ||
810 | <para>DESCRIPTION | ||
811 | </para> | ||
812 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
813 | align="char"> | ||
814 | <para>Allocates a new section feed, i.e. a demux resource for filtering and receiving | ||
815 | sections. On platforms with hardware support for section filtering, a section | ||
816 | feed is directly mapped to the demux HW. On other platforms, TS packets are | ||
817 | first PID filtered in hardware and a hardware section filter then emulated in | ||
818 | software. The caller obtains an API pointer of type dmx_section_feed_t as an | ||
819 | out parameter. Using this API the caller can set filtering parameters and start | ||
820 | receiving sections.</para> | ||
821 | </entry> | ||
822 | </row></tbody></tgroup></informaltable> | ||
823 | <para>SYNOPSIS | ||
824 | </para> | ||
825 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
826 | align="char"> | ||
827 | <para>int allocate_section_feed(dmx_demux_t⋆ demux, | ||
828 | dmx_section_feed_t ⋆⋆feed, dmx_section_cb callback);</para> | ||
829 | </entry> | ||
830 | </row></tbody></tgroup></informaltable> | ||
831 | <para>PARAMETERS | ||
832 | </para> | ||
833 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
834 | align="char"> | ||
835 | <para>demux_t *demux</para> | ||
836 | </entry><entry | ||
837 | align="char"> | ||
838 | <para>Pointer to the demux API and instance data.</para> | ||
839 | </entry> | ||
840 | </row><row><entry | ||
841 | align="char"> | ||
842 | <para>dmx_section_feed_t | ||
843 | **feed</para> | ||
844 | </entry><entry | ||
845 | align="char"> | ||
846 | <para>Pointer to the section feed API and instance data.</para> | ||
847 | </entry> | ||
848 | </row><row><entry | ||
849 | align="char"> | ||
850 | <para>dmx_section_cb | ||
851 | callback</para> | ||
852 | </entry><entry | ||
853 | align="char"> | ||
854 | <para>Pointer to the callback function for passing received | ||
855 | sections.</para> | ||
856 | </entry> | ||
857 | </row></tbody></tgroup></informaltable> | ||
858 | <para>RETURNS | ||
859 | </para> | ||
860 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
861 | align="char"> | ||
862 | <para>0</para> | ||
863 | </entry><entry | ||
864 | align="char"> | ||
865 | <para>The function was completed without errors.</para> | ||
866 | </entry> | ||
867 | </row><row><entry | ||
868 | align="char"> | ||
869 | <para>-EBUSY</para> | ||
870 | </entry><entry | ||
871 | align="char"> | ||
872 | <para>No more section feeds available.</para> | ||
873 | </entry> | ||
874 | </row><row><entry | ||
875 | align="char"> | ||
876 | <para>-ENOSYS</para> | ||
877 | </entry><entry | ||
878 | align="char"> | ||
879 | <para>The command is not implemented.</para> | ||
880 | </entry> | ||
881 | </row><row><entry | ||
882 | align="char"> | ||
883 | <para>-EINVAL</para> | ||
884 | </entry><entry | ||
885 | align="char"> | ||
886 | <para>Bad parameter.</para> | ||
887 | </entry> | ||
888 | </row></tbody></tgroup></informaltable> | ||
889 | |||
890 | </section><section | ||
891 | role="subsection"><title>release_section_feed()</title> | ||
892 | <para>DESCRIPTION | ||
893 | </para> | ||
894 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
895 | align="char"> | ||
896 | <para>Releases the resources allocated with allocate_section_feed(), including | ||
897 | allocated filters. Any filtering in progress on the section feed should be stopped | ||
898 | before calling this function.</para> | ||
899 | </entry> | ||
900 | </row></tbody></tgroup></informaltable> | ||
901 | <para>SYNOPSIS | ||
902 | </para> | ||
903 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
904 | align="char"> | ||
905 | <para>int release_section_feed(dmx_demux_t⋆ demux, | ||
906 | dmx_section_feed_t ⋆feed);</para> | ||
907 | </entry> | ||
908 | </row></tbody></tgroup></informaltable> | ||
909 | <para>PARAMETERS | ||
910 | </para> | ||
911 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
912 | align="char"> | ||
913 | <para>demux_t *demux</para> | ||
914 | </entry><entry | ||
915 | align="char"> | ||
916 | <para>Pointer to the demux API and instance data.</para> | ||
917 | </entry> | ||
918 | </row><row><entry | ||
919 | align="char"> | ||
920 | <para>dmx_section_feed_t | ||
921 | *feed</para> | ||
922 | </entry><entry | ||
923 | align="char"> | ||
924 | <para>Pointer to the section feed API and instance data.</para> | ||
925 | </entry> | ||
926 | </row></tbody></tgroup></informaltable> | ||
927 | <para>RETURNS | ||
928 | </para> | ||
929 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
930 | align="char"> | ||
931 | <para>0</para> | ||
932 | </entry><entry | ||
933 | align="char"> | ||
934 | <para>The function was completed without errors.</para> | ||
935 | </entry> | ||
936 | </row><row><entry | ||
937 | align="char"> | ||
938 | <para>-EINVAL</para> | ||
939 | </entry><entry | ||
940 | align="char"> | ||
941 | <para>Bad parameter.</para> | ||
942 | </entry> | ||
943 | </row></tbody></tgroup></informaltable> | ||
944 | |||
945 | </section><section | ||
946 | role="subsection"><title>descramble_mac_address()</title> | ||
947 | <para>DESCRIPTION | ||
948 | </para> | ||
949 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
950 | align="char"> | ||
951 | <para>This function runs a descrambling algorithm on the destination MAC | ||
952 | address field of a DVB Datagram Section, replacing the original address | ||
953 | with its un-encrypted version. Otherwise, the description on the function | ||
954 | descramble_section_payload() applies also to this function.</para> | ||
955 | </entry> | ||
956 | </row></tbody></tgroup></informaltable> | ||
957 | <para>SYNOPSIS | ||
958 | </para> | ||
959 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
960 | align="char"> | ||
961 | <para>int descramble_mac_address(dmx_demux_t⋆ demux, __u8 | ||
962 | ⋆buffer1, size_t buffer1_length, __u8 ⋆buffer2, | ||
963 | size_t buffer2_length, __u16 pid);</para> | ||
964 | </entry> | ||
965 | </row></tbody></tgroup></informaltable> | ||
966 | <para>PARAMETERS | ||
967 | </para> | ||
968 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
969 | align="char"> | ||
970 | <para>dmx_demux_t | ||
971 | *demux</para> | ||
972 | </entry><entry | ||
973 | align="char"> | ||
974 | <para>Pointer to the demux API and instance data.</para> | ||
975 | </entry> | ||
976 | </row><row><entry | ||
977 | align="char"> | ||
978 | <para>__u8 *buffer1</para> | ||
979 | </entry><entry | ||
980 | align="char"> | ||
981 | <para>Pointer to the first byte of the section.</para> | ||
982 | </entry> | ||
983 | </row><row><entry | ||
984 | align="char"> | ||
985 | <para>size_t buffer1_length</para> | ||
986 | </entry><entry | ||
987 | align="char"> | ||
988 | <para>Length of the section data, including headers and CRC, | ||
989 | in buffer1.</para> | ||
990 | </entry> | ||
991 | </row><row><entry | ||
992 | align="char"> | ||
993 | <para>__u8* buffer2</para> | ||
994 | </entry><entry | ||
995 | align="char"> | ||
996 | <para>Pointer to the tail of the section data, or NULL. The | ||
997 | pointer has a non-NULL value if the section wraps past | ||
998 | the end of a circular buffer.</para> | ||
999 | </entry> | ||
1000 | </row><row><entry | ||
1001 | align="char"> | ||
1002 | <para>size_t buffer2_length</para> | ||
1003 | </entry><entry | ||
1004 | align="char"> | ||
1005 | <para>Length of the section data, including headers and CRC, | ||
1006 | in buffer2.</para> | ||
1007 | </entry> | ||
1008 | </row><row><entry | ||
1009 | align="char"> | ||
1010 | <para>__u16 pid</para> | ||
1011 | </entry><entry | ||
1012 | align="char"> | ||
1013 | <para>The PID on which the section was received. Useful | ||
1014 | for obtaining the descrambling key, e.g. from a DVB | ||
1015 | Common Access facility.</para> | ||
1016 | </entry> | ||
1017 | </row></tbody></tgroup></informaltable> | ||
1018 | <para>RETURNS | ||
1019 | </para> | ||
1020 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1021 | align="char"> | ||
1022 | <para>0</para> | ||
1023 | </entry><entry | ||
1024 | align="char"> | ||
1025 | <para>The function was completed without errors.</para> | ||
1026 | </entry> | ||
1027 | </row><row><entry | ||
1028 | align="char"> | ||
1029 | <para>-ENOSYS</para> | ||
1030 | </entry><entry | ||
1031 | align="char"> | ||
1032 | <para>No descrambling facility available.</para> | ||
1033 | </entry> | ||
1034 | </row><row><entry | ||
1035 | align="char"> | ||
1036 | <para>-EINVAL</para> | ||
1037 | </entry><entry | ||
1038 | align="char"> | ||
1039 | <para>Bad parameter.</para> | ||
1040 | </entry> | ||
1041 | </row></tbody></tgroup></informaltable> | ||
1042 | |||
1043 | </section><section | ||
1044 | role="subsection"><title>descramble_section_payload()</title> | ||
1045 | <para>DESCRIPTION | ||
1046 | </para> | ||
1047 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1048 | align="char"> | ||
1049 | <para>This function runs a descrambling algorithm on the payload of a DVB | ||
1050 | Datagram Section, replacing the original payload with its un-encrypted | ||
1051 | version. The function will be called from the demux API implementation; | ||
1052 | the API client need not call this function directly. Section-level scrambling | ||
1053 | algorithms are currently standardized only for DVB-RCC (return channel | ||
1054 | over 2-directional cable TV network) systems. For all other DVB networks, | ||
1055 | encryption schemes are likely to be proprietary to each data broadcaster. Thus, | ||
1056 | it is expected that this function pointer will have the value of NULL (i.e., | ||
1057 | function not available) in most demux API implementations. Nevertheless, it | ||
1058 | should be possible to use the function pointer as a hook for dynamically adding | ||
1059 | a “plug-in” descrambling facility to a demux driver.</para> | ||
1060 | </entry> | ||
1061 | </row><row><entry | ||
1062 | align="char"> | ||
1063 | <para>While this function is not needed with hardware-based section descrambling, | ||
1064 | the descramble_section_payload function pointer can be used to override the | ||
1065 | default hardware-based descrambling algorithm: if the function pointer has a | ||
1066 | non-NULL value, the corresponding function should be used instead of any | ||
1067 | descrambling hardware.</para> | ||
1068 | </entry> | ||
1069 | </row></tbody></tgroup></informaltable> | ||
1070 | <para>SYNOPSIS | ||
1071 | </para> | ||
1072 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1073 | align="char"> | ||
1074 | <para>int descramble_section_payload(dmx_demux_t⋆ demux, | ||
1075 | __u8 ⋆buffer1, size_t buffer1_length, __u8 ⋆buffer2, | ||
1076 | size_t buffer2_length, __u16 pid);</para> | ||
1077 | </entry> | ||
1078 | </row></tbody></tgroup></informaltable> | ||
1079 | <para>PARAMETERS | ||
1080 | </para> | ||
1081 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1082 | align="char"> | ||
1083 | <para>dmx_demux_t | ||
1084 | *demux</para> | ||
1085 | </entry><entry | ||
1086 | align="char"> | ||
1087 | <para>Pointer to the demux API and instance data.</para> | ||
1088 | </entry> | ||
1089 | </row><row><entry | ||
1090 | align="char"> | ||
1091 | <para>__u8 *buffer1</para> | ||
1092 | </entry><entry | ||
1093 | align="char"> | ||
1094 | <para>Pointer to the first byte of the section.</para> | ||
1095 | </entry> | ||
1096 | </row><row><entry | ||
1097 | align="char"> | ||
1098 | <para>size_t buffer1_length</para> | ||
1099 | </entry><entry | ||
1100 | align="char"> | ||
1101 | <para>Length of the section data, including headers and CRC, | ||
1102 | in buffer1.</para> | ||
1103 | </entry> | ||
1104 | </row><row><entry | ||
1105 | align="char"> | ||
1106 | <para>__u8 *buffer2</para> | ||
1107 | </entry><entry | ||
1108 | align="char"> | ||
1109 | <para>Pointer to the tail of the section data, or NULL. The | ||
1110 | pointer has a non-NULL value if the section wraps past | ||
1111 | the end of a circular buffer.</para> | ||
1112 | </entry> | ||
1113 | </row><row><entry | ||
1114 | align="char"> | ||
1115 | <para>size_t buffer2_length</para> | ||
1116 | </entry><entry | ||
1117 | align="char"> | ||
1118 | <para>Length of the section data, including headers and CRC, | ||
1119 | in buffer2.</para> | ||
1120 | </entry> | ||
1121 | </row><row><entry | ||
1122 | align="char"> | ||
1123 | <para>__u16 pid</para> | ||
1124 | </entry><entry | ||
1125 | align="char"> | ||
1126 | <para>The PID on which the section was received. Useful | ||
1127 | for obtaining the descrambling key, e.g. from a DVB | ||
1128 | Common Access facility.</para> | ||
1129 | </entry> | ||
1130 | </row></tbody></tgroup></informaltable> | ||
1131 | <para>RETURNS | ||
1132 | </para> | ||
1133 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1134 | align="char"> | ||
1135 | <para>0</para> | ||
1136 | </entry><entry | ||
1137 | align="char"> | ||
1138 | <para>The function was completed without errors.</para> | ||
1139 | </entry> | ||
1140 | </row><row><entry | ||
1141 | align="char"> | ||
1142 | <para>-ENOSYS</para> | ||
1143 | </entry><entry | ||
1144 | align="char"> | ||
1145 | <para>No descrambling facility available.</para> | ||
1146 | </entry> | ||
1147 | </row><row><entry | ||
1148 | align="char"> | ||
1149 | <para>-EINVAL</para> | ||
1150 | </entry><entry | ||
1151 | align="char"> | ||
1152 | <para>Bad parameter.</para> | ||
1153 | </entry> | ||
1154 | </row></tbody></tgroup></informaltable> | ||
1155 | |||
1156 | </section><section | ||
1157 | role="subsection"><title>add_frontend()</title> | ||
1158 | <para>DESCRIPTION | ||
1159 | </para> | ||
1160 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1161 | align="char"> | ||
1162 | <para>Registers a connectivity between a demux and a front-end, i.e., indicates that | ||
1163 | the demux can be connected via a call to connect_frontend() to use the given | ||
1164 | front-end as a TS source. The client of this function has to allocate dynamic or | ||
1165 | static memory for the frontend structure and initialize its fields before calling | ||
1166 | this function. This function is normally called during the driver initialization. | ||
1167 | The caller must not free the memory of the frontend struct before successfully | ||
1168 | calling remove_frontend().</para> | ||
1169 | </entry> | ||
1170 | </row></tbody></tgroup></informaltable> | ||
1171 | <para>SYNOPSIS | ||
1172 | </para> | ||
1173 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1174 | align="char"> | ||
1175 | <para>int add_frontend(dmx_demux_t ⋆demux, dmx_frontend_t | ||
1176 | ⋆frontend);</para> | ||
1177 | </entry> | ||
1178 | </row></tbody></tgroup></informaltable> | ||
1179 | <para>PARAMETERS | ||
1180 | </para> | ||
1181 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1182 | align="char"> | ||
1183 | <para>dmx_demux_t* | ||
1184 | demux</para> | ||
1185 | </entry><entry | ||
1186 | align="char"> | ||
1187 | <para>Pointer to the demux API and instance data.</para> | ||
1188 | </entry> | ||
1189 | </row><row><entry | ||
1190 | align="char"> | ||
1191 | <para>dmx_frontend_t* | ||
1192 | frontend</para> | ||
1193 | </entry><entry | ||
1194 | align="char"> | ||
1195 | <para>Pointer to the front-end instance data.</para> | ||
1196 | </entry> | ||
1197 | </row></tbody></tgroup></informaltable> | ||
1198 | <para>RETURNS | ||
1199 | </para> | ||
1200 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1201 | align="char"> | ||
1202 | <para>0</para> | ||
1203 | </entry><entry | ||
1204 | align="char"> | ||
1205 | <para>The function was completed without errors.</para> | ||
1206 | </entry> | ||
1207 | </row><row><entry | ||
1208 | align="char"> | ||
1209 | <para>-EEXIST</para> | ||
1210 | </entry><entry | ||
1211 | align="char"> | ||
1212 | <para>A front-end with the same value of the id field already | ||
1213 | registered.</para> | ||
1214 | </entry> | ||
1215 | </row><row><entry | ||
1216 | align="char"> | ||
1217 | <para>-EINUSE</para> | ||
1218 | </entry><entry | ||
1219 | align="char"> | ||
1220 | <para>The demux is in use.</para> | ||
1221 | </entry> | ||
1222 | </row><row><entry | ||
1223 | align="char"> | ||
1224 | <para>-ENOMEM</para> | ||
1225 | </entry><entry | ||
1226 | align="char"> | ||
1227 | <para>No more front-ends can be added.</para> | ||
1228 | </entry> | ||
1229 | </row><row><entry | ||
1230 | align="char"> | ||
1231 | <para>-EINVAL</para> | ||
1232 | </entry><entry | ||
1233 | align="char"> | ||
1234 | <para>Bad parameter.</para> | ||
1235 | </entry> | ||
1236 | </row></tbody></tgroup></informaltable> | ||
1237 | |||
1238 | </section><section | ||
1239 | role="subsection"><title>remove_frontend()</title> | ||
1240 | <para>DESCRIPTION | ||
1241 | </para> | ||
1242 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1243 | align="char"> | ||
1244 | <para>Indicates that the given front-end, registered by a call to add_frontend(), can | ||
1245 | no longer be connected as a TS source by this demux. The function should be | ||
1246 | called when a front-end driver or a demux driver is removed from the system. | ||
1247 | If the front-end is in use, the function fails with the return value of -EBUSY. | ||
1248 | After successfully calling this function, the caller can free the memory of | ||
1249 | the frontend struct if it was dynamically allocated before the add_frontend() | ||
1250 | operation.</para> | ||
1251 | </entry> | ||
1252 | </row></tbody></tgroup></informaltable> | ||
1253 | <para>SYNOPSIS | ||
1254 | </para> | ||
1255 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1256 | align="char"> | ||
1257 | <para>int remove_frontend(dmx_demux_t⋆ demux, | ||
1258 | dmx_frontend_t⋆ frontend);</para> | ||
1259 | </entry> | ||
1260 | </row></tbody></tgroup></informaltable> | ||
1261 | <para>PARAMETERS | ||
1262 | </para> | ||
1263 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1264 | align="char"> | ||
1265 | <para>dmx_demux_t* | ||
1266 | demux</para> | ||
1267 | </entry><entry | ||
1268 | align="char"> | ||
1269 | <para>Pointer to the demux API and instance data.</para> | ||
1270 | </entry> | ||
1271 | </row><row><entry | ||
1272 | align="char"> | ||
1273 | <para>dmx_frontend_t* | ||
1274 | frontend</para> | ||
1275 | </entry><entry | ||
1276 | align="char"> | ||
1277 | <para>Pointer to the front-end instance data.</para> | ||
1278 | </entry> | ||
1279 | </row></tbody></tgroup></informaltable> | ||
1280 | <para>RETURNS | ||
1281 | </para> | ||
1282 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1283 | align="char"> | ||
1284 | <para>0</para> | ||
1285 | </entry><entry | ||
1286 | align="char"> | ||
1287 | <para>The function was completed without errors.</para> | ||
1288 | </entry> | ||
1289 | </row><row><entry | ||
1290 | align="char"> | ||
1291 | <para>-EINVAL</para> | ||
1292 | </entry><entry | ||
1293 | align="char"> | ||
1294 | <para>Bad parameter.</para> | ||
1295 | </entry> | ||
1296 | </row><row><entry | ||
1297 | align="char"> | ||
1298 | <para>-EBUSY</para> | ||
1299 | </entry><entry | ||
1300 | align="char"> | ||
1301 | <para>The front-end is in use, i.e. a call to connect_frontend() | ||
1302 | has not been followed by a call to disconnect_frontend().</para> | ||
1303 | </entry> | ||
1304 | </row></tbody></tgroup></informaltable> | ||
1305 | |||
1306 | </section><section | ||
1307 | role="subsection"><title>get_frontends()</title> | ||
1308 | <para>DESCRIPTION | ||
1309 | </para> | ||
1310 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1311 | align="char"> | ||
1312 | <para>Provides the APIs of the front-ends that have been registered for this demux. | ||
1313 | Any of the front-ends obtained with this call can be used as a parameter for | ||
1314 | connect_frontend().</para> | ||
1315 | </entry> | ||
1316 | </row><row><entry | ||
1317 | align="char"> | ||
1318 | <para>The include file demux.h contains the macro DMX_FE_ENTRY() for | ||
1319 | converting an element of the generic type struct list_head* to the type | ||
1320 | dmx_frontend_t*. The caller must not free the memory of any of the elements | ||
1321 | obtained via this function call.</para> | ||
1322 | </entry> | ||
1323 | </row></tbody></tgroup></informaltable> | ||
1324 | <para>SYNOPSIS | ||
1325 | </para> | ||
1326 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1327 | align="char"> | ||
1328 | <para>struct list_head⋆ get_frontends(dmx_demux_t⋆ demux);</para> | ||
1329 | </entry> | ||
1330 | </row></tbody></tgroup></informaltable> | ||
1331 | <para>PARAMETERS | ||
1332 | </para> | ||
1333 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1334 | align="char"> | ||
1335 | <para>dmx_demux_t* | ||
1336 | demux</para> | ||
1337 | </entry><entry | ||
1338 | align="char"> | ||
1339 | <para>Pointer to the demux API and instance data.</para> | ||
1340 | </entry> | ||
1341 | </row></tbody></tgroup></informaltable> | ||
1342 | <para>RETURNS | ||
1343 | </para> | ||
1344 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1345 | align="char"> | ||
1346 | <para>dmx_demux_t*</para> | ||
1347 | </entry><entry | ||
1348 | align="char"> | ||
1349 | <para>A list of front-end interfaces, or NULL in the case of an | ||
1350 | empty list.</para> | ||
1351 | </entry> | ||
1352 | </row></tbody></tgroup></informaltable> | ||
1353 | |||
1354 | </section><section | ||
1355 | role="subsection"><title>connect_frontend()</title> | ||
1356 | <para>DESCRIPTION | ||
1357 | </para> | ||
1358 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1359 | align="char"> | ||
1360 | <para>Connects the TS output of the front-end to the input of the demux. A demux | ||
1361 | can only be connected to a front-end registered to the demux with the function | ||
1362 | add_frontend().</para> | ||
1363 | </entry> | ||
1364 | </row><row><entry | ||
1365 | align="char"> | ||
1366 | <para>It may or may not be possible to connect multiple demuxes to the same | ||
1367 | front-end, depending on the capabilities of the HW platform. When not used, | ||
1368 | the front-end should be released by calling disconnect_frontend().</para> | ||
1369 | </entry> | ||
1370 | </row></tbody></tgroup></informaltable> | ||
1371 | <para>SYNOPSIS | ||
1372 | </para> | ||
1373 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1374 | align="char"> | ||
1375 | <para>int connect_frontend(dmx_demux_t⋆ demux, | ||
1376 | dmx_frontend_t⋆ frontend);</para> | ||
1377 | </entry> | ||
1378 | </row></tbody></tgroup></informaltable> | ||
1379 | <para>PARAMETERS | ||
1380 | </para> | ||
1381 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1382 | align="char"> | ||
1383 | <para>dmx_demux_t* | ||
1384 | demux</para> | ||
1385 | </entry><entry | ||
1386 | align="char"> | ||
1387 | <para>Pointer to the demux API and instance data.</para> | ||
1388 | </entry> | ||
1389 | </row><row><entry | ||
1390 | align="char"> | ||
1391 | <para>dmx_frontend_t* | ||
1392 | frontend</para> | ||
1393 | </entry><entry | ||
1394 | align="char"> | ||
1395 | <para>Pointer to the front-end instance data.</para> | ||
1396 | </entry> | ||
1397 | </row></tbody></tgroup></informaltable> | ||
1398 | <para>RETURNS | ||
1399 | </para> | ||
1400 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1401 | align="char"> | ||
1402 | <para>0</para> | ||
1403 | </entry><entry | ||
1404 | align="char"> | ||
1405 | <para>The function was completed without errors.</para> | ||
1406 | </entry> | ||
1407 | </row><row><entry | ||
1408 | align="char"> | ||
1409 | <para>-EINVAL</para> | ||
1410 | </entry><entry | ||
1411 | align="char"> | ||
1412 | <para>Bad parameter.</para> | ||
1413 | </entry> | ||
1414 | </row><row><entry | ||
1415 | align="char"> | ||
1416 | <para>-EBUSY</para> | ||
1417 | </entry><entry | ||
1418 | align="char"> | ||
1419 | <para>The front-end is in use.</para> | ||
1420 | </entry> | ||
1421 | </row></tbody></tgroup></informaltable> | ||
1422 | |||
1423 | </section><section | ||
1424 | role="subsection"><title>disconnect_frontend()</title> | ||
1425 | <para>DESCRIPTION | ||
1426 | </para> | ||
1427 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1428 | align="char"> | ||
1429 | <para>Disconnects the demux and a front-end previously connected by a | ||
1430 | connect_frontend() call.</para> | ||
1431 | </entry> | ||
1432 | </row></tbody></tgroup></informaltable> | ||
1433 | <para>SYNOPSIS | ||
1434 | </para> | ||
1435 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1436 | align="char"> | ||
1437 | <para>int disconnect_frontend(dmx_demux_t⋆ demux);</para> | ||
1438 | </entry> | ||
1439 | </row></tbody></tgroup></informaltable> | ||
1440 | <para>PARAMETERS | ||
1441 | </para> | ||
1442 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1443 | align="char"> | ||
1444 | <para>dmx_demux_t* | ||
1445 | demux</para> | ||
1446 | </entry><entry | ||
1447 | align="char"> | ||
1448 | <para>Pointer to the demux API and instance data.</para> | ||
1449 | </entry> | ||
1450 | </row></tbody></tgroup></informaltable> | ||
1451 | <para>RETURNS | ||
1452 | </para> | ||
1453 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1454 | align="char"> | ||
1455 | <para>0</para> | ||
1456 | </entry><entry | ||
1457 | align="char"> | ||
1458 | <para>The function was completed without errors.</para> | ||
1459 | </entry> | ||
1460 | </row><row><entry | ||
1461 | align="char"> | ||
1462 | <para>-EINVAL</para> | ||
1463 | </entry><entry | ||
1464 | align="char"> | ||
1465 | <para>Bad parameter.</para> | ||
1466 | </entry> | ||
1467 | </row></tbody></tgroup></informaltable> | ||
1468 | </section></section> | ||
1469 | <section id="demux_callback_api"> | ||
1470 | <title>Demux Callback API</title> | ||
1471 | <para>This kernel-space API comprises the callback functions that deliver filtered data to the | ||
1472 | demux client. Unlike the other APIs, these API functions are provided by the client and called | ||
1473 | from the demux code. | ||
1474 | </para> | ||
1475 | <para>The function pointers of this abstract interface are not packed into a structure as in the | ||
1476 | other demux APIs, because the callback functions are registered and used independent | ||
1477 | of each other. As an example, it is possible for the API client to provide several | ||
1478 | callback functions for receiving TS packets and no callbacks for PES packets or | ||
1479 | sections. | ||
1480 | </para> | ||
1481 | <para>The functions that implement the callback API need not be re-entrant: when a demux | ||
1482 | driver calls one of these functions, the driver is not allowed to call the function again before | ||
1483 | the original call returns. If a callback is triggered by a hardware interrupt, it is recommended | ||
1484 | to use the Linux “bottom half” mechanism or start a tasklet instead of making the callback | ||
1485 | function call directly from a hardware interrupt. | ||
1486 | </para> | ||
1487 | |||
1488 | <section | ||
1489 | role="subsection"><title>dmx_ts_cb()</title> | ||
1490 | <para>DESCRIPTION | ||
1491 | </para> | ||
1492 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1493 | align="char"> | ||
1494 | <para>This function, provided by the client of the demux API, is called from the | ||
1495 | demux code. The function is only called when filtering on this TS feed has | ||
1496 | been enabled using the start_filtering() function.</para> | ||
1497 | </entry> | ||
1498 | </row><row><entry | ||
1499 | align="char"> | ||
1500 | <para>Any TS packets that match the filter settings are copied to a circular buffer. The | ||
1501 | filtered TS packets are delivered to the client using this callback function. The | ||
1502 | size of the circular buffer is controlled by the circular_buffer_size parameter | ||
1503 | of the set() function in the TS Feed API. It is expected that the buffer1 and | ||
1504 | buffer2 callback parameters point to addresses within the circular buffer, but | ||
1505 | other implementations are also possible. Note that the called party should not | ||
1506 | try to free the memory the buffer1 and buffer2 parameters point to.</para> | ||
1507 | </entry> | ||
1508 | </row><row><entry | ||
1509 | align="char"> | ||
1510 | <para>When this function is called, the buffer1 parameter typically points to the | ||
1511 | start of the first undelivered TS packet within a circular buffer. The buffer2 | ||
1512 | buffer parameter is normally NULL, except when the received TS packets have | ||
1513 | crossed the last address of the circular buffer and ”wrapped” to the beginning | ||
1514 | of the buffer. In the latter case the buffer1 parameter would contain an address | ||
1515 | within the circular buffer, while the buffer2 parameter would contain the first | ||
1516 | address of the circular buffer.</para> | ||
1517 | </entry> | ||
1518 | </row><row><entry | ||
1519 | align="char"> | ||
1520 | <para>The number of bytes delivered with this function (i.e. buffer1_length + | ||
1521 | buffer2_length) is usually equal to the value of callback_length parameter | ||
1522 | given in the set() function, with one exception: if a timeout occurs before | ||
1523 | receiving callback_length bytes of TS data, any undelivered packets are | ||
1524 | immediately delivered to the client by calling this function. The timeout | ||
1525 | duration is controlled by the set() function in the TS Feed API.</para> | ||
1526 | </entry> | ||
1527 | </row><row><entry | ||
1528 | align="char"> | ||
1529 | <para>If a TS packet is received with errors that could not be fixed by the TS-level | ||
1530 | forward error correction (FEC), the Transport_error_indicator flag of the TS | ||
1531 | packet header should be set. The TS packet should not be discarded, as | ||
1532 | the error can possibly be corrected by a higher layer protocol. If the called | ||
1533 | party is slow in processing the callback, it is possible that the circular buffer | ||
1534 | eventually fills up. If this happens, the demux driver should discard any TS | ||
1535 | packets received while the buffer is full. The error should be indicated to the | ||
1536 | client on the next callback by setting the success parameter to the value of | ||
1537 | DMX_OVERRUN_ERROR.</para> | ||
1538 | </entry> | ||
1539 | </row><row><entry | ||
1540 | align="char"> | ||
1541 | <para>The type of data returned to the callback can be selected by the new | ||
1542 | function int (*set_type) (struct dmx_ts_feed_s* feed, int type, dmx_ts_pes_t | ||
1543 | pes_type) which is part of the dmx_ts_feed_s struct (also cf. to the | ||
1544 | include file ost/demux.h) The type parameter decides if the raw TS packet | ||
1545 | (TS_PACKET) or just the payload (TS_PACKET—TS_PAYLOAD_ONLY) | ||
1546 | should be returned. If additionally the TS_DECODER bit is set the stream | ||
1547 | will also be sent to the hardware MPEG decoder. In this case, the second | ||
1548 | flag decides as what kind of data the stream should be interpreted. The | ||
1549 | possible choices are one of DMX_TS_PES_AUDIO, DMX_TS_PES_VIDEO, | ||
1550 | DMX_TS_PES_TELETEXT, DMX_TS_PES_SUBTITLE, | ||
1551 | DMX_TS_PES_PCR, or DMX_TS_PES_OTHER.</para> | ||
1552 | </entry> | ||
1553 | </row></tbody></tgroup></informaltable> | ||
1554 | <para>SYNOPSIS | ||
1555 | </para> | ||
1556 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1557 | align="char"> | ||
1558 | <para>int dmx_ts_cb(__u8⋆ buffer1, size_t buffer1_length, | ||
1559 | __u8⋆ buffer2, size_t buffer2_length, dmx_ts_feed_t⋆ | ||
1560 | source, dmx_success_t success);</para> | ||
1561 | </entry> | ||
1562 | </row></tbody></tgroup></informaltable> | ||
1563 | <para>PARAMETERS | ||
1564 | </para> | ||
1565 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1566 | align="char"> | ||
1567 | <para>__u8* buffer1</para> | ||
1568 | </entry><entry | ||
1569 | align="char"> | ||
1570 | <para>Pointer to the start of the filtered TS packets.</para> | ||
1571 | </entry> | ||
1572 | </row><row><entry | ||
1573 | align="char"> | ||
1574 | <para>size_t buffer1_length</para> | ||
1575 | </entry><entry | ||
1576 | align="char"> | ||
1577 | <para>Length of the TS data in buffer1.</para> | ||
1578 | </entry> | ||
1579 | </row><row><entry | ||
1580 | align="char"> | ||
1581 | <para>__u8* buffer2</para> | ||
1582 | </entry><entry | ||
1583 | align="char"> | ||
1584 | <para>Pointer to the tail of the filtered TS packets, or NULL.</para> | ||
1585 | </entry> | ||
1586 | </row><row><entry | ||
1587 | align="char"> | ||
1588 | <para>size_t buffer2_length</para> | ||
1589 | </entry><entry | ||
1590 | align="char"> | ||
1591 | <para>Length of the TS data in buffer2.</para> | ||
1592 | </entry> | ||
1593 | </row><row><entry | ||
1594 | align="char"> | ||
1595 | <para>dmx_ts_feed_t* | ||
1596 | source</para> | ||
1597 | </entry><entry | ||
1598 | align="char"> | ||
1599 | <para>Indicates which TS feed is the source of the callback.</para> | ||
1600 | </entry> | ||
1601 | </row><row><entry | ||
1602 | align="char"> | ||
1603 | <para>dmx_success_t | ||
1604 | success</para> | ||
1605 | </entry><entry | ||
1606 | align="char"> | ||
1607 | <para>Indicates if there was an error in TS reception.</para> | ||
1608 | </entry> | ||
1609 | </row></tbody></tgroup></informaltable> | ||
1610 | <para>RETURNS | ||
1611 | </para> | ||
1612 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1613 | align="char"> | ||
1614 | <para>0</para> | ||
1615 | </entry><entry | ||
1616 | align="char"> | ||
1617 | <para>Continue filtering.</para> | ||
1618 | </entry> | ||
1619 | </row><row><entry | ||
1620 | align="char"> | ||
1621 | <para>-1</para> | ||
1622 | </entry><entry | ||
1623 | align="char"> | ||
1624 | <para>Stop filtering - has the same effect as a call to | ||
1625 | stop_filtering() on the TS Feed API.</para> | ||
1626 | </entry> | ||
1627 | </row></tbody></tgroup></informaltable> | ||
1628 | |||
1629 | </section><section | ||
1630 | role="subsection"><title>dmx_section_cb()</title> | ||
1631 | <para>DESCRIPTION | ||
1632 | </para> | ||
1633 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1634 | align="char"> | ||
1635 | <para>This function, provided by the client of the demux API, is called from the | ||
1636 | demux code. The function is only called when filtering of sections has been | ||
1637 | enabled using the function start_filtering() of the section feed API. When the | ||
1638 | demux driver has received a complete section that matches at least one section | ||
1639 | filter, the client is notified via this callback function. Normally this function is | ||
1640 | called for each received section; however, it is also possible to deliver multiple | ||
1641 | sections with one callback, for example when the system load is high. If an | ||
1642 | error occurs while receiving a section, this function should be called with | ||
1643 | the corresponding error type set in the success field, whether or not there is | ||
1644 | data to deliver. The Section Feed implementation should maintain a circular | ||
1645 | buffer for received sections. However, this is not necessary if the Section Feed | ||
1646 | API is implemented as a client of the TS Feed API, because the TS Feed | ||
1647 | implementation then buffers the received data. The size of the circular buffer | ||
1648 | can be configured using the set() function in the Section Feed API. If there | ||
1649 | is no room in the circular buffer when a new section is received, the section | ||
1650 | must be discarded. If this happens, the value of the success parameter should | ||
1651 | be DMX_OVERRUN_ERROR on the next callback.</para> | ||
1652 | </entry> | ||
1653 | </row></tbody></tgroup></informaltable> | ||
1654 | <para>SYNOPSIS | ||
1655 | </para> | ||
1656 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1657 | align="char"> | ||
1658 | <para>int dmx_section_cb(__u8⋆ buffer1, size_t | ||
1659 | buffer1_length, __u8⋆ buffer2, size_t | ||
1660 | buffer2_length, dmx_section_filter_t⋆ source, | ||
1661 | dmx_success_t success);</para> | ||
1662 | </entry> | ||
1663 | </row></tbody></tgroup></informaltable> | ||
1664 | <para>PARAMETERS | ||
1665 | </para> | ||
1666 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1667 | align="char"> | ||
1668 | <para>__u8* buffer1</para> | ||
1669 | </entry><entry | ||
1670 | align="char"> | ||
1671 | <para>Pointer to the start of the filtered section, e.g. within the | ||
1672 | circular buffer of the demux driver.</para> | ||
1673 | </entry> | ||
1674 | </row><row><entry | ||
1675 | align="char"> | ||
1676 | <para>size_t buffer1_length</para> | ||
1677 | </entry><entry | ||
1678 | align="char"> | ||
1679 | <para>Length of the filtered section data in buffer1, including | ||
1680 | headers and CRC.</para> | ||
1681 | </entry> | ||
1682 | </row><row><entry | ||
1683 | align="char"> | ||
1684 | <para>__u8* buffer2</para> | ||
1685 | </entry><entry | ||
1686 | align="char"> | ||
1687 | <para>Pointer to the tail of the filtered section data, or NULL. | ||
1688 | Useful to handle the wrapping of a circular buffer.</para> | ||
1689 | </entry> | ||
1690 | </row><row><entry | ||
1691 | align="char"> | ||
1692 | <para>size_t buffer2_length</para> | ||
1693 | </entry><entry | ||
1694 | align="char"> | ||
1695 | <para>Length of the filtered section data in buffer2, including | ||
1696 | headers and CRC.</para> | ||
1697 | </entry> | ||
1698 | </row><row><entry | ||
1699 | align="char"> | ||
1700 | <para>dmx_section_filter_t* | ||
1701 | filter</para> | ||
1702 | </entry><entry | ||
1703 | align="char"> | ||
1704 | <para>Indicates the filter that triggered the callback.</para> | ||
1705 | </entry> | ||
1706 | </row><row><entry | ||
1707 | align="char"> | ||
1708 | <para>dmx_success_t | ||
1709 | success</para> | ||
1710 | </entry><entry | ||
1711 | align="char"> | ||
1712 | <para>Indicates if there was an error in section reception.</para> | ||
1713 | </entry> | ||
1714 | </row></tbody></tgroup></informaltable> | ||
1715 | <para>RETURNS | ||
1716 | </para> | ||
1717 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1718 | align="char"> | ||
1719 | <para>0</para> | ||
1720 | </entry><entry | ||
1721 | align="char"> | ||
1722 | <para>Continue filtering.</para> | ||
1723 | </entry> | ||
1724 | </row><row><entry | ||
1725 | align="char"> | ||
1726 | <para>-1</para> | ||
1727 | </entry><entry | ||
1728 | align="char"> | ||
1729 | <para>Stop filtering - has the same effect as a call to | ||
1730 | stop_filtering() on the Section Feed API.</para> | ||
1731 | </entry> | ||
1732 | </row></tbody></tgroup></informaltable> | ||
1733 | </section></section> | ||
1734 | <section id="ts_feed_api"> | ||
1735 | <title>TS Feed API</title> | ||
1736 | <para>A TS feed is typically mapped to a hardware PID filter on the demux chip. | ||
1737 | Using this API, the client can set the filtering properties to start/stop filtering TS | ||
1738 | packets on a particular TS feed. The API is defined as an abstract interface of the type | ||
1739 | dmx_ts_feed_t. | ||
1740 | </para> | ||
1741 | <para>The functions that implement the interface should be defined static or module private. The | ||
1742 | client can get the handle of a TS feed API by calling the function allocate_ts_feed() in the | ||
1743 | demux API. | ||
1744 | </para> | ||
1745 | |||
1746 | <section | ||
1747 | role="subsection"><title>set()</title> | ||
1748 | <para>DESCRIPTION | ||
1749 | </para> | ||
1750 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1751 | align="char"> | ||
1752 | <para>This function sets the parameters of a TS feed. Any filtering in progress on the | ||
1753 | TS feed must be stopped before calling this function.</para> | ||
1754 | </entry> | ||
1755 | </row></tbody></tgroup></informaltable> | ||
1756 | <para>SYNOPSIS | ||
1757 | </para> | ||
1758 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1759 | align="char"> | ||
1760 | <para>int set ( dmx_ts_feed_t⋆ feed, __u16 pid, size_t | ||
1761 | callback_length, size_t circular_buffer_size, int | ||
1762 | descramble, struct timespec timeout);</para> | ||
1763 | </entry> | ||
1764 | </row></tbody></tgroup></informaltable> | ||
1765 | <para>PARAMETERS | ||
1766 | </para> | ||
1767 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1768 | align="char"> | ||
1769 | <para>dmx_ts_feed_t* feed</para> | ||
1770 | </entry><entry | ||
1771 | align="char"> | ||
1772 | <para>Pointer to the TS feed API and instance data.</para> | ||
1773 | </entry> | ||
1774 | </row><row><entry | ||
1775 | align="char"> | ||
1776 | <para>__u16 pid</para> | ||
1777 | </entry><entry | ||
1778 | align="char"> | ||
1779 | <para>PID value to filter. Only the TS packets carrying the | ||
1780 | specified PID will be passed to the API client.</para> | ||
1781 | </entry> | ||
1782 | </row><row><entry | ||
1783 | align="char"> | ||
1784 | <para>size_t | ||
1785 | callback_length</para> | ||
1786 | </entry><entry | ||
1787 | align="char"> | ||
1788 | <para>Number of bytes to deliver with each call to the | ||
1789 | dmx_ts_cb() callback function. The value of this | ||
1790 | parameter should be a multiple of 188.</para> | ||
1791 | </entry> | ||
1792 | </row><row><entry | ||
1793 | align="char"> | ||
1794 | <para>size_t | ||
1795 | circular_buffer_size</para> | ||
1796 | </entry><entry | ||
1797 | align="char"> | ||
1798 | <para>Size of the circular buffer for the filtered TS packets.</para> | ||
1799 | </entry> | ||
1800 | </row><row><entry | ||
1801 | align="char"> | ||
1802 | <para>int descramble</para> | ||
1803 | </entry><entry | ||
1804 | align="char"> | ||
1805 | <para>If non-zero, descramble the filtered TS packets.</para> | ||
1806 | </entry> | ||
1807 | </row><row><entry | ||
1808 | align="char"> | ||
1809 | <para>struct timespec | ||
1810 | timeout</para> | ||
1811 | </entry><entry | ||
1812 | align="char"> | ||
1813 | <para>Maximum time to wait before delivering received TS | ||
1814 | packets to the client.</para> | ||
1815 | </entry> | ||
1816 | </row></tbody></tgroup></informaltable> | ||
1817 | <para>RETURNS | ||
1818 | </para> | ||
1819 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1820 | align="char"> | ||
1821 | <para>0</para> | ||
1822 | </entry><entry | ||
1823 | align="char"> | ||
1824 | <para>The function was completed without errors.</para> | ||
1825 | </entry> | ||
1826 | </row><row><entry | ||
1827 | align="char"> | ||
1828 | <para>-ENOMEM</para> | ||
1829 | </entry><entry | ||
1830 | align="char"> | ||
1831 | <para>Not enough memory for the requested buffer size.</para> | ||
1832 | </entry> | ||
1833 | </row><row><entry | ||
1834 | align="char"> | ||
1835 | <para>-ENOSYS</para> | ||
1836 | </entry><entry | ||
1837 | align="char"> | ||
1838 | <para>No descrambling facility available for TS.</para> | ||
1839 | </entry> | ||
1840 | </row><row><entry | ||
1841 | align="char"> | ||
1842 | <para>-EINVAL</para> | ||
1843 | </entry><entry | ||
1844 | align="char"> | ||
1845 | <para>Bad parameter.</para> | ||
1846 | </entry> | ||
1847 | </row></tbody></tgroup></informaltable> | ||
1848 | |||
1849 | </section><section | ||
1850 | role="subsection"><title>start_filtering()</title> | ||
1851 | <para>DESCRIPTION | ||
1852 | </para> | ||
1853 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1854 | align="char"> | ||
1855 | <para>Starts filtering TS packets on this TS feed, according to its settings. The PID | ||
1856 | value to filter can be set by the API client. All matching TS packets are | ||
1857 | delivered asynchronously to the client, using the callback function registered | ||
1858 | with allocate_ts_feed().</para> | ||
1859 | </entry> | ||
1860 | </row></tbody></tgroup></informaltable> | ||
1861 | <para>SYNOPSIS | ||
1862 | </para> | ||
1863 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1864 | align="char"> | ||
1865 | <para>int start_filtering(dmx_ts_feed_t⋆ feed);</para> | ||
1866 | </entry> | ||
1867 | </row></tbody></tgroup></informaltable> | ||
1868 | <para>PARAMETERS | ||
1869 | </para> | ||
1870 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1871 | align="char"> | ||
1872 | <para>dmx_ts_feed_t* feed</para> | ||
1873 | </entry><entry | ||
1874 | align="char"> | ||
1875 | <para>Pointer to the TS feed API and instance data.</para> | ||
1876 | </entry> | ||
1877 | </row></tbody></tgroup></informaltable> | ||
1878 | <para>RETURNS | ||
1879 | </para> | ||
1880 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1881 | align="char"> | ||
1882 | <para>0</para> | ||
1883 | </entry><entry | ||
1884 | align="char"> | ||
1885 | <para>The function was completed without errors.</para> | ||
1886 | </entry> | ||
1887 | </row><row><entry | ||
1888 | align="char"> | ||
1889 | <para>-EINVAL</para> | ||
1890 | </entry><entry | ||
1891 | align="char"> | ||
1892 | <para>Bad parameter.</para> | ||
1893 | </entry> | ||
1894 | </row></tbody></tgroup></informaltable> | ||
1895 | |||
1896 | </section><section | ||
1897 | role="subsection"><title>stop_filtering()</title> | ||
1898 | <para>DESCRIPTION | ||
1899 | </para> | ||
1900 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1901 | align="char"> | ||
1902 | <para>Stops filtering TS packets on this TS feed.</para> | ||
1903 | </entry> | ||
1904 | </row></tbody></tgroup></informaltable> | ||
1905 | <para>SYNOPSIS | ||
1906 | </para> | ||
1907 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1908 | align="char"> | ||
1909 | <para>int stop_filtering(dmx_ts_feed_t⋆ feed);</para> | ||
1910 | </entry> | ||
1911 | </row></tbody></tgroup></informaltable> | ||
1912 | <para>PARAMETERS | ||
1913 | </para> | ||
1914 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1915 | align="char"> | ||
1916 | <para>dmx_ts_feed_t* feed</para> | ||
1917 | </entry><entry | ||
1918 | align="char"> | ||
1919 | <para>Pointer to the TS feed API and instance data.</para> | ||
1920 | </entry> | ||
1921 | </row></tbody></tgroup></informaltable> | ||
1922 | <para>RETURNS | ||
1923 | </para> | ||
1924 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1925 | align="char"> | ||
1926 | <para>0</para> | ||
1927 | </entry><entry | ||
1928 | align="char"> | ||
1929 | <para>The function was completed without errors.</para> | ||
1930 | </entry> | ||
1931 | </row><row><entry | ||
1932 | align="char"> | ||
1933 | <para>-EINVAL</para> | ||
1934 | </entry><entry | ||
1935 | align="char"> | ||
1936 | <para>Bad parameter.</para> | ||
1937 | </entry> | ||
1938 | </row></tbody></tgroup></informaltable> | ||
1939 | </section></section> | ||
1940 | <section id="section_feed_api"> | ||
1941 | <title>Section Feed API</title> | ||
1942 | <para>A section feed is a resource consisting of a PID filter and a set of section filters. Using this | ||
1943 | API, the client can set the properties of a section feed and to start/stop filtering. The API is | ||
1944 | defined as an abstract interface of the type dmx_section_feed_t. The functions that implement | ||
1945 | the interface should be defined static or module private. The client can get the handle of | ||
1946 | a section feed API by calling the function allocate_section_feed() in the demux | ||
1947 | API. | ||
1948 | </para> | ||
1949 | <para>On demux platforms that provide section filtering in hardware, the Section Feed API | ||
1950 | implementation provides a software wrapper for the demux hardware. Other platforms may | ||
1951 | support only PID filtering in hardware, requiring that TS packets are converted to sections in | ||
1952 | software. In the latter case the Section Feed API implementation can be a client of the TS | ||
1953 | Feed API. | ||
1954 | </para> | ||
1955 | |||
1956 | </section> | ||
1957 | <section id="kdapi_set"> | ||
1958 | <title>set()</title> | ||
1959 | <para>DESCRIPTION | ||
1960 | </para> | ||
1961 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1962 | align="char"> | ||
1963 | <para>This function sets the parameters of a section feed. Any filtering in progress on | ||
1964 | the section feed must be stopped before calling this function. If descrambling | ||
1965 | is enabled, the payload_scrambling_control and address_scrambling_control | ||
1966 | fields of received DVB datagram sections should be observed. If either one is | ||
1967 | non-zero, the section should be descrambled either in hardware or using the | ||
1968 | functions descramble_mac_address() and descramble_section_payload() of the | ||
1969 | demux API. Note that according to the MPEG-2 Systems specification, only | ||
1970 | the payloads of private sections can be scrambled while the rest of the section | ||
1971 | data must be sent in the clear.</para> | ||
1972 | </entry> | ||
1973 | </row></tbody></tgroup></informaltable> | ||
1974 | <para>SYNOPSIS | ||
1975 | </para> | ||
1976 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1977 | align="char"> | ||
1978 | <para>int set(dmx_section_feed_t⋆ feed, __u16 pid, size_t | ||
1979 | circular_buffer_size, int descramble, int | ||
1980 | check_crc);</para> | ||
1981 | </entry> | ||
1982 | </row></tbody></tgroup></informaltable> | ||
1983 | <para>PARAMETERS | ||
1984 | </para> | ||
1985 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1986 | align="char"> | ||
1987 | <para>dmx_section_feed_t* | ||
1988 | feed</para> | ||
1989 | </entry><entry | ||
1990 | align="char"> | ||
1991 | <para>Pointer to the section feed API and instance data.</para> | ||
1992 | </entry> | ||
1993 | </row><row><entry | ||
1994 | align="char"> | ||
1995 | <para>__u16 pid</para> | ||
1996 | </entry><entry | ||
1997 | align="char"> | ||
1998 | <para>PID value to filter; only the TS packets carrying the | ||
1999 | specified PID will be accepted.</para> | ||
2000 | </entry> | ||
2001 | </row><row><entry | ||
2002 | align="char"> | ||
2003 | <para>size_t | ||
2004 | circular_buffer_size</para> | ||
2005 | </entry><entry | ||
2006 | align="char"> | ||
2007 | <para>Size of the circular buffer for filtered sections.</para> | ||
2008 | </entry> | ||
2009 | </row><row><entry | ||
2010 | align="char"> | ||
2011 | <para>int descramble</para> | ||
2012 | </entry><entry | ||
2013 | align="char"> | ||
2014 | <para>If non-zero, descramble any sections that are scrambled.</para> | ||
2015 | </entry> | ||
2016 | </row><row><entry | ||
2017 | align="char"> | ||
2018 | <para>int check_crc</para> | ||
2019 | </entry><entry | ||
2020 | align="char"> | ||
2021 | <para>If non-zero, check the CRC values of filtered sections.</para> | ||
2022 | </entry> | ||
2023 | </row></tbody></tgroup></informaltable> | ||
2024 | <para>RETURNS | ||
2025 | </para> | ||
2026 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
2027 | align="char"> | ||
2028 | <para>0</para> | ||
2029 | </entry><entry | ||
2030 | align="char"> | ||
2031 | <para>The function was completed without errors.</para> | ||
2032 | </entry> | ||
2033 | </row><row><entry | ||
2034 | align="char"> | ||
2035 | <para>-ENOMEM</para> | ||
2036 | </entry><entry | ||
2037 | align="char"> | ||
2038 | <para>Not enough memory for the requested buffer size.</para> | ||
2039 | </entry> | ||
2040 | </row><row><entry | ||
2041 | align="char"> | ||
2042 | <para>-ENOSYS</para> | ||
2043 | </entry><entry | ||
2044 | align="char"> | ||
2045 | <para>No descrambling facility available for sections.</para> | ||
2046 | </entry> | ||
2047 | </row><row><entry | ||
2048 | align="char"> | ||
2049 | <para>-EINVAL</para> | ||
2050 | </entry><entry | ||
2051 | align="char"> | ||
2052 | <para>Bad parameters.</para> | ||
2053 | </entry> | ||
2054 | </row></tbody></tgroup></informaltable> | ||
2055 | |||
2056 | </section><section | ||
2057 | role="subsection"><title>allocate_filter()</title> | ||
2058 | <para>DESCRIPTION | ||
2059 | </para> | ||
2060 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
2061 | align="char"> | ||
2062 | <para>This function is used to allocate a section filter on the demux. It should only be | ||
2063 | called when no filtering is in progress on this section feed. If a filter cannot be | ||
2064 | allocated, the function fails with -ENOSPC. See in section ?? for the format of | ||
2065 | the section filter.</para> | ||
2066 | </entry> | ||
2067 | </row><row><entry | ||
2068 | align="char"> | ||
2069 | <para>The bitfields filter_mask and filter_value should only be modified when no | ||
2070 | filtering is in progress on this section feed. filter_mask controls which bits of | ||
2071 | filter_value are compared with the section headers/payload. On a binary value | ||
2072 | of 1 in filter_mask, the corresponding bits are compared. The filter only accepts | ||
2073 | sections that are equal to filter_value in all the tested bit positions. Any changes | ||
2074 | to the values of filter_mask and filter_value are guaranteed to take effect only | ||
2075 | when the start_filtering() function is called next time. The parent pointer in | ||
2076 | the struct is initialized by the API implementation to the value of the feed | ||
2077 | parameter. The priv pointer is not used by the API implementation, and can | ||
2078 | thus be freely utilized by the caller of this function. Any data pointed to by the | ||
2079 | priv pointer is available to the recipient of the dmx_section_cb() function call.</para> | ||
2080 | </entry> | ||
2081 | </row><row><entry | ||
2082 | align="char"> | ||
2083 | <para>While the maximum section filter length (DMX_MAX_FILTER_SIZE) is | ||
2084 | currently set at 16 bytes, hardware filters of that size are not available on all | ||
2085 | platforms. Therefore, section filtering will often take place first in hardware, | ||
2086 | followed by filtering in software for the header bytes that were not covered | ||
2087 | by a hardware filter. The filter_mask field can be checked to determine how | ||
2088 | many bytes of the section filter are actually used, and if the hardware filter will | ||
2089 | suffice. Additionally, software-only section filters can optionally be allocated | ||
2090 | to clients when all hardware section filters are in use. Note that on most demux | ||
2091 | hardware it is not possible to filter on the section_length field of the section | ||
2092 | header – thus this field is ignored, even though it is included in filter_value and | ||
2093 | filter_mask fields.</para> | ||
2094 | </entry> | ||
2095 | </row></tbody></tgroup></informaltable> | ||
2096 | <para>SYNOPSIS | ||
2097 | </para> | ||
2098 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
2099 | align="char"> | ||
2100 | <para>int allocate_filter(dmx_section_feed_t⋆ feed, | ||
2101 | dmx_section_filter_t⋆⋆ filter);</para> | ||
2102 | </entry> | ||
2103 | </row></tbody></tgroup></informaltable> | ||
2104 | <para>PARAMETERS | ||
2105 | </para> | ||
2106 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
2107 | align="char"> | ||
2108 | <para>dmx_section_feed_t* | ||
2109 | feed</para> | ||
2110 | </entry><entry | ||
2111 | align="char"> | ||
2112 | <para>Pointer to the section feed API and instance data.</para> | ||
2113 | </entry> | ||
2114 | </row><row><entry | ||
2115 | align="char"> | ||
2116 | <para>dmx_section_filter_t** | ||
2117 | filter</para> | ||
2118 | </entry><entry | ||
2119 | align="char"> | ||
2120 | <para>Pointer to the allocated filter.</para> | ||
2121 | </entry> | ||
2122 | </row></tbody></tgroup></informaltable> | ||
2123 | <para>RETURNS | ||
2124 | </para> | ||
2125 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
2126 | align="char"> | ||
2127 | <para>0</para> | ||
2128 | </entry><entry | ||
2129 | align="char"> | ||
2130 | <para>The function was completed without errors.</para> | ||
2131 | </entry> | ||
2132 | </row><row><entry | ||
2133 | align="char"> | ||
2134 | <para>-ENOSPC</para> | ||
2135 | </entry><entry | ||
2136 | align="char"> | ||
2137 | <para>No filters of given type and length available.</para> | ||
2138 | </entry> | ||
2139 | </row><row><entry | ||
2140 | align="char"> | ||
2141 | <para>-EINVAL</para> | ||
2142 | </entry><entry | ||
2143 | align="char"> | ||
2144 | <para>Bad parameters.</para> | ||
2145 | </entry> | ||
2146 | </row></tbody></tgroup></informaltable> | ||
2147 | |||
2148 | </section><section | ||
2149 | role="subsection"><title>release_filter()</title> | ||
2150 | <para>DESCRIPTION | ||
2151 | </para> | ||
2152 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
2153 | align="char"> | ||
2154 | <para>This function releases all the resources of a previously allocated section filter. | ||
2155 | The function should not be called while filtering is in progress on this section | ||
2156 | feed. After calling this function, the caller should not try to dereference the | ||
2157 | filter pointer.</para> | ||
2158 | </entry> | ||
2159 | </row></tbody></tgroup></informaltable> | ||
2160 | <para>SYNOPSIS | ||
2161 | </para> | ||
2162 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
2163 | align="char"> | ||
2164 | <para>int release_filter ( dmx_section_feed_t⋆ feed, | ||
2165 | dmx_section_filter_t⋆ filter);</para> | ||
2166 | </entry> | ||
2167 | </row></tbody></tgroup></informaltable> | ||
2168 | <para>PARAMETERS | ||
2169 | </para> | ||
2170 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
2171 | align="char"> | ||
2172 | <para>dmx_section_feed_t* | ||
2173 | feed</para> | ||
2174 | </entry><entry | ||
2175 | align="char"> | ||
2176 | <para>Pointer to the section feed API and instance data.</para> | ||
2177 | </entry> | ||
2178 | </row><row><entry | ||
2179 | align="char"> | ||
2180 | <para>dmx_section_filter_t* | ||
2181 | filter</para> | ||
2182 | </entry><entry | ||
2183 | align="char"> | ||
2184 | <para>I/O Pointer to the instance data of a section filter.</para> | ||
2185 | </entry> | ||
2186 | </row></tbody></tgroup></informaltable> | ||
2187 | <para>RETURNS | ||
2188 | </para> | ||
2189 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
2190 | align="char"> | ||
2191 | <para>0</para> | ||
2192 | </entry><entry | ||
2193 | align="char"> | ||
2194 | <para>The function was completed without errors.</para> | ||
2195 | </entry> | ||
2196 | </row><row><entry | ||
2197 | align="char"> | ||
2198 | <para>-ENODEV</para> | ||
2199 | </entry><entry | ||
2200 | align="char"> | ||
2201 | <para>No such filter allocated.</para> | ||
2202 | </entry> | ||
2203 | </row><row><entry | ||
2204 | align="char"> | ||
2205 | <para>-EINVAL</para> | ||
2206 | </entry><entry | ||
2207 | align="char"> | ||
2208 | <para>Bad parameter.</para> | ||
2209 | </entry> | ||
2210 | </row></tbody></tgroup></informaltable> | ||
2211 | |||
2212 | </section><section | ||
2213 | role="subsection"><title>start_filtering()</title> | ||
2214 | <para>DESCRIPTION | ||
2215 | </para> | ||
2216 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
2217 | align="char"> | ||
2218 | <para>Starts filtering sections on this section feed, according to its settings. Sections | ||
2219 | are first filtered based on their PID and then matched with the section | ||
2220 | filters allocated for this feed. If the section matches the PID filter and | ||
2221 | at least one section filter, it is delivered to the API client. The section | ||
2222 | is delivered asynchronously using the callback function registered with | ||
2223 | allocate_section_feed().</para> | ||
2224 | </entry> | ||
2225 | </row></tbody></tgroup></informaltable> | ||
2226 | <para>SYNOPSIS | ||
2227 | </para> | ||
2228 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
2229 | align="char"> | ||
2230 | <para>int start_filtering ( dmx_section_feed_t⋆ feed );</para> | ||
2231 | </entry> | ||
2232 | </row></tbody></tgroup></informaltable> | ||
2233 | <para>PARAMETERS | ||
2234 | </para> | ||
2235 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
2236 | align="char"> | ||
2237 | <para>dmx_section_feed_t* | ||
2238 | feed</para> | ||
2239 | </entry><entry | ||
2240 | align="char"> | ||
2241 | <para>Pointer to the section feed API and instance data.</para> | ||
2242 | </entry> | ||
2243 | </row></tbody></tgroup></informaltable> | ||
2244 | <para>RETURNS | ||
2245 | </para> | ||
2246 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
2247 | align="char"> | ||
2248 | <para>0</para> | ||
2249 | </entry><entry | ||
2250 | align="char"> | ||
2251 | <para>The function was completed without errors.</para> | ||
2252 | </entry> | ||
2253 | </row><row><entry | ||
2254 | align="char"> | ||
2255 | <para>-EINVAL</para> | ||
2256 | </entry><entry | ||
2257 | align="char"> | ||
2258 | <para>Bad parameter.</para> | ||
2259 | </entry> | ||
2260 | </row></tbody></tgroup></informaltable> | ||
2261 | |||
2262 | </section><section | ||
2263 | role="subsection"><title>stop_filtering()</title> | ||
2264 | <para>DESCRIPTION | ||
2265 | </para> | ||
2266 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
2267 | align="char"> | ||
2268 | <para>Stops filtering sections on this section feed. Note that any changes to the | ||
2269 | filtering parameters (filter_value, filter_mask, etc.) should only be made when | ||
2270 | filtering is stopped.</para> | ||
2271 | </entry> | ||
2272 | </row></tbody></tgroup></informaltable> | ||
2273 | <para>SYNOPSIS | ||
2274 | </para> | ||
2275 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
2276 | align="char"> | ||
2277 | <para>int stop_filtering ( dmx_section_feed_t⋆ feed );</para> | ||
2278 | </entry> | ||
2279 | </row></tbody></tgroup></informaltable> | ||
2280 | <para>PARAMETERS | ||
2281 | </para> | ||
2282 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
2283 | align="char"> | ||
2284 | <para>dmx_section_feed_t* | ||
2285 | feed</para> | ||
2286 | </entry><entry | ||
2287 | align="char"> | ||
2288 | <para>Pointer to the section feed API and instance data.</para> | ||
2289 | </entry> | ||
2290 | </row></tbody></tgroup></informaltable> | ||
2291 | <para>RETURNS | ||
2292 | </para> | ||
2293 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
2294 | align="char"> | ||
2295 | <para>0</para> | ||
2296 | </entry><entry | ||
2297 | align="char"> | ||
2298 | <para>The function was completed without errors.</para> | ||
2299 | </entry> | ||
2300 | </row><row><entry | ||
2301 | align="char"> | ||
2302 | <para>-EINVAL</para> | ||
2303 | </entry><entry | ||
2304 | align="char"> | ||
2305 | <para>Bad parameter.</para> | ||
2306 | </entry> | ||
2307 | </row></tbody></tgroup></informaltable> | ||
2308 | |||
2309 | </section> | ||
diff --git a/Documentation/DocBook/dvb/net.xml b/Documentation/DocBook/dvb/net.xml new file mode 100644 index 000000000000..94e388d94c0d --- /dev/null +++ b/Documentation/DocBook/dvb/net.xml | |||
@@ -0,0 +1,12 @@ | |||
1 | <title>DVB Network API</title> | ||
2 | <para>The DVB net device enables feeding of MPE (multi protocol encapsulation) packets | ||
3 | received via DVB into the Linux network protocol stack, e.g. for internet via satellite | ||
4 | applications. It can be accessed through <emphasis role="tt">/dev/dvb/adapter0/net0</emphasis>. Data types and | ||
5 | and ioctl definitions can be accessed by including <emphasis role="tt">linux/dvb/net.h</emphasis> in your | ||
6 | application. | ||
7 | </para> | ||
8 | <section id="dvb_net_types"> | ||
9 | <title>DVB Net Data Types</title> | ||
10 | <para>To be written… | ||
11 | </para> | ||
12 | </section> | ||
diff --git a/Documentation/DocBook/dvb/video.xml b/Documentation/DocBook/dvb/video.xml new file mode 100644 index 000000000000..7bb287e67c8e --- /dev/null +++ b/Documentation/DocBook/dvb/video.xml | |||
@@ -0,0 +1,1971 @@ | |||
1 | <title>DVB Video Device</title> | ||
2 | <para>The DVB video device controls the MPEG2 video decoder of the DVB hardware. It | ||
3 | can be accessed through <emphasis role="tt">/dev/dvb/adapter0/video0</emphasis>. Data types and and | ||
4 | ioctl definitions can be accessed by including <emphasis role="tt">linux/dvb/video.h</emphasis> in your | ||
5 | application. | ||
6 | </para> | ||
7 | <para>Note that the DVB video device only controls decoding of the MPEG video stream, not | ||
8 | its presentation on the TV or computer screen. On PCs this is typically handled by an | ||
9 | associated video4linux device, e.g. <emphasis role="tt">/dev/video</emphasis>, which allows scaling and defining output | ||
10 | windows. | ||
11 | </para> | ||
12 | <para>Some DVB cards don’t have their own MPEG decoder, which results in the omission of | ||
13 | the audio and video device as well as the video4linux device. | ||
14 | </para> | ||
15 | <para>The ioctls that deal with SPUs (sub picture units) and navigation packets are only | ||
16 | supported on some MPEG decoders made for DVD playback. | ||
17 | </para> | ||
18 | <section id="video_types"> | ||
19 | <title>Video Data Types</title> | ||
20 | |||
21 | <section id="video_format_t"> | ||
22 | <title>video_format_t</title> | ||
23 | <para>The <emphasis role="tt">video_format_t</emphasis> data type defined by | ||
24 | </para> | ||
25 | <programlisting> | ||
26 | typedef enum { | ||
27 | VIDEO_FORMAT_4_3, | ||
28 | VIDEO_FORMAT_16_9 | ||
29 | } video_format_t; | ||
30 | </programlisting> | ||
31 | <para>is used in the VIDEO_SET_FORMAT function (??) to tell the driver which aspect ratio | ||
32 | the output hardware (e.g. TV) has. It is also used in the data structures video_status | ||
33 | (??) returned by VIDEO_GET_STATUS (??) and video_event (??) returned by | ||
34 | VIDEO_GET_EVENT (??) which report about the display format of the current video | ||
35 | stream. | ||
36 | </para> | ||
37 | </section> | ||
38 | |||
39 | <section id="video_display_format_t"> | ||
40 | <title>video_display_format_t</title> | ||
41 | <para>In case the display format of the video stream and of the display hardware differ the | ||
42 | application has to specify how to handle the cropping of the picture. This can be done using | ||
43 | the VIDEO_SET_DISPLAY_FORMAT call (??) which accepts | ||
44 | </para> | ||
45 | <programlisting> | ||
46 | typedef enum { | ||
47 | VIDEO_PAN_SCAN, | ||
48 | VIDEO_LETTER_BOX, | ||
49 | VIDEO_CENTER_CUT_OUT | ||
50 | } video_display_format_t; | ||
51 | </programlisting> | ||
52 | <para>as argument. | ||
53 | </para> | ||
54 | </section> | ||
55 | |||
56 | <section id="video_stream_source"> | ||
57 | <title>video stream source</title> | ||
58 | <para>The video stream source is set through the VIDEO_SELECT_SOURCE call and can take | ||
59 | the following values, depending on whether we are replaying from an internal (demuxer) or | ||
60 | external (user write) source. | ||
61 | </para> | ||
62 | <programlisting> | ||
63 | typedef enum { | ||
64 | VIDEO_SOURCE_DEMUX, | ||
65 | VIDEO_SOURCE_MEMORY | ||
66 | } video_stream_source_t; | ||
67 | </programlisting> | ||
68 | <para>VIDEO_SOURCE_DEMUX selects the demultiplexer (fed either by the frontend or the | ||
69 | DVR device) as the source of the video stream. If VIDEO_SOURCE_MEMORY | ||
70 | is selected the stream comes from the application through the <emphasis role="tt">write()</emphasis> system | ||
71 | call. | ||
72 | </para> | ||
73 | </section> | ||
74 | |||
75 | <section id="video_play_state"> | ||
76 | <title>video play state</title> | ||
77 | <para>The following values can be returned by the VIDEO_GET_STATUS call representing the | ||
78 | state of video playback. | ||
79 | </para> | ||
80 | <programlisting> | ||
81 | typedef enum { | ||
82 | VIDEO_STOPPED, | ||
83 | VIDEO_PLAYING, | ||
84 | VIDEO_FREEZED | ||
85 | } video_play_state_t; | ||
86 | </programlisting> | ||
87 | </section> | ||
88 | |||
89 | <section id="video_event"> | ||
90 | <title>struct video_event</title> | ||
91 | <para>The following is the structure of a video event as it is returned by the VIDEO_GET_EVENT | ||
92 | call. | ||
93 | </para> | ||
94 | <programlisting> | ||
95 | struct video_event { | ||
96 | int32_t type; | ||
97 | time_t timestamp; | ||
98 | union { | ||
99 | video_format_t video_format; | ||
100 | } u; | ||
101 | }; | ||
102 | </programlisting> | ||
103 | </section> | ||
104 | |||
105 | <section id="video_status"> | ||
106 | <title>struct video_status</title> | ||
107 | <para>The VIDEO_GET_STATUS call returns the following structure informing about various | ||
108 | states of the playback operation. | ||
109 | </para> | ||
110 | <programlisting> | ||
111 | struct video_status { | ||
112 | boolean video_blank; | ||
113 | video_play_state_t play_state; | ||
114 | video_stream_source_t stream_source; | ||
115 | video_format_t video_format; | ||
116 | video_displayformat_t display_format; | ||
117 | }; | ||
118 | </programlisting> | ||
119 | <para>If video_blank is set video will be blanked out if the channel is changed or if playback is | ||
120 | stopped. Otherwise, the last picture will be displayed. play_state indicates if the video is | ||
121 | currently frozen, stopped, or being played back. The stream_source corresponds to the seleted | ||
122 | source for the video stream. It can come either from the demultiplexer or from memory. | ||
123 | The video_format indicates the aspect ratio (one of 4:3 or 16:9) of the currently | ||
124 | played video stream. Finally, display_format corresponds to the selected cropping | ||
125 | mode in case the source video format is not the same as the format of the output | ||
126 | device. | ||
127 | </para> | ||
128 | </section> | ||
129 | |||
130 | <section id="video_still_picture"> | ||
131 | <title>struct video_still_picture</title> | ||
132 | <para>An I-frame displayed via the VIDEO_STILLPICTURE call is passed on within the | ||
133 | following structure. | ||
134 | </para> | ||
135 | <programlisting> | ||
136 | /⋆ pointer to and size of a single iframe in memory ⋆/ | ||
137 | struct video_still_picture { | ||
138 | char ⋆iFrame; | ||
139 | int32_t size; | ||
140 | }; | ||
141 | </programlisting> | ||
142 | </section> | ||
143 | |||
144 | <section id="video_caps"> | ||
145 | <title>video capabilities</title> | ||
146 | <para>A call to VIDEO_GET_CAPABILITIES returns an unsigned integer with the following | ||
147 | bits set according to the hardwares capabilities. | ||
148 | </para> | ||
149 | <programlisting> | ||
150 | /⋆ bit definitions for capabilities: ⋆/ | ||
151 | /⋆ can the hardware decode MPEG1 and/or MPEG2? ⋆/ | ||
152 | #define VIDEO_CAP_MPEG1 1 | ||
153 | #define VIDEO_CAP_MPEG2 2 | ||
154 | /⋆ can you send a system and/or program stream to video device? | ||
155 | (you still have to open the video and the audio device but only | ||
156 | send the stream to the video device) ⋆/ | ||
157 | #define VIDEO_CAP_SYS 4 | ||
158 | #define VIDEO_CAP_PROG 8 | ||
159 | /⋆ can the driver also handle SPU, NAVI and CSS encoded data? | ||
160 | (CSS API is not present yet) ⋆/ | ||
161 | #define VIDEO_CAP_SPU 16 | ||
162 | #define VIDEO_CAP_NAVI 32 | ||
163 | #define VIDEO_CAP_CSS 64 | ||
164 | </programlisting> | ||
165 | </section> | ||
166 | |||
167 | <section id="video_system"> | ||
168 | <title>video system</title> | ||
169 | <para>A call to VIDEO_SET_SYSTEM sets the desired video system for TV output. The | ||
170 | following system types can be set: | ||
171 | </para> | ||
172 | <programlisting> | ||
173 | typedef enum { | ||
174 | VIDEO_SYSTEM_PAL, | ||
175 | VIDEO_SYSTEM_NTSC, | ||
176 | VIDEO_SYSTEM_PALN, | ||
177 | VIDEO_SYSTEM_PALNc, | ||
178 | VIDEO_SYSTEM_PALM, | ||
179 | VIDEO_SYSTEM_NTSC60, | ||
180 | VIDEO_SYSTEM_PAL60, | ||
181 | VIDEO_SYSTEM_PALM60 | ||
182 | } video_system_t; | ||
183 | </programlisting> | ||
184 | </section> | ||
185 | |||
186 | <section id="video_highlight"> | ||
187 | <title>struct video_highlight</title> | ||
188 | <para>Calling the ioctl VIDEO_SET_HIGHLIGHTS posts the SPU highlight information. The | ||
189 | call expects the following format for that information: | ||
190 | </para> | ||
191 | <programlisting> | ||
192 | typedef | ||
193 | struct video_highlight { | ||
194 | boolean active; /⋆ 1=show highlight, 0=hide highlight ⋆/ | ||
195 | uint8_t contrast1; /⋆ 7- 4 Pattern pixel contrast ⋆/ | ||
196 | /⋆ 3- 0 Background pixel contrast ⋆/ | ||
197 | uint8_t contrast2; /⋆ 7- 4 Emphasis pixel-2 contrast ⋆/ | ||
198 | /⋆ 3- 0 Emphasis pixel-1 contrast ⋆/ | ||
199 | uint8_t color1; /⋆ 7- 4 Pattern pixel color ⋆/ | ||
200 | /⋆ 3- 0 Background pixel color ⋆/ | ||
201 | uint8_t color2; /⋆ 7- 4 Emphasis pixel-2 color ⋆/ | ||
202 | /⋆ 3- 0 Emphasis pixel-1 color ⋆/ | ||
203 | uint32_t ypos; /⋆ 23-22 auto action mode ⋆/ | ||
204 | /⋆ 21-12 start y ⋆/ | ||
205 | /⋆ 9- 0 end y ⋆/ | ||
206 | uint32_t xpos; /⋆ 23-22 button color number ⋆/ | ||
207 | /⋆ 21-12 start x ⋆/ | ||
208 | /⋆ 9- 0 end x ⋆/ | ||
209 | } video_highlight_t; | ||
210 | </programlisting> | ||
211 | |||
212 | </section> | ||
213 | <section id="video_spu"> | ||
214 | <title>video SPU</title> | ||
215 | <para>Calling VIDEO_SET_SPU deactivates or activates SPU decoding, according to the | ||
216 | following format: | ||
217 | </para> | ||
218 | <programlisting> | ||
219 | typedef | ||
220 | struct video_spu { | ||
221 | boolean active; | ||
222 | int stream_id; | ||
223 | } video_spu_t; | ||
224 | </programlisting> | ||
225 | |||
226 | </section> | ||
227 | <section id="video_spu_palette"> | ||
228 | <title>video SPU palette</title> | ||
229 | <para>The following structure is used to set the SPU palette by calling VIDEO_SPU_PALETTE: | ||
230 | </para> | ||
231 | <programlisting> | ||
232 | typedef | ||
233 | struct video_spu_palette{ | ||
234 | int length; | ||
235 | uint8_t ⋆palette; | ||
236 | } video_spu_palette_t; | ||
237 | </programlisting> | ||
238 | |||
239 | </section> | ||
240 | <section id="video_navi_pack"> | ||
241 | <title>video NAVI pack</title> | ||
242 | <para>In order to get the navigational data the following structure has to be passed to the ioctl | ||
243 | VIDEO_GET_NAVI: | ||
244 | </para> | ||
245 | <programlisting> | ||
246 | typedef | ||
247 | struct video_navi_pack{ | ||
248 | int length; /⋆ 0 ... 1024 ⋆/ | ||
249 | uint8_t data[1024]; | ||
250 | } video_navi_pack_t; | ||
251 | </programlisting> | ||
252 | </section> | ||
253 | |||
254 | |||
255 | <section id="video_attributes"> | ||
256 | <title>video attributes</title> | ||
257 | <para>The following attributes can be set by a call to VIDEO_SET_ATTRIBUTES: | ||
258 | </para> | ||
259 | <programlisting> | ||
260 | typedef uint16_t video_attributes_t; | ||
261 | /⋆ bits: descr. ⋆/ | ||
262 | /⋆ 15-14 Video compression mode (0=MPEG-1, 1=MPEG-2) ⋆/ | ||
263 | /⋆ 13-12 TV system (0=525/60, 1=625/50) ⋆/ | ||
264 | /⋆ 11-10 Aspect ratio (0=4:3, 3=16:9) ⋆/ | ||
265 | /⋆ 9- 8 permitted display mode on 4:3 monitor (0=both, 1=only pan-sca ⋆/ | ||
266 | /⋆ 7 line 21-1 data present in GOP (1=yes, 0=no) ⋆/ | ||
267 | /⋆ 6 line 21-2 data present in GOP (1=yes, 0=no) ⋆/ | ||
268 | /⋆ 5- 3 source resolution (0=720x480/576, 1=704x480/576, 2=352x480/57 ⋆/ | ||
269 | /⋆ 2 source letterboxed (1=yes, 0=no) ⋆/ | ||
270 | /⋆ 0 film/camera mode (0=camera, 1=film (625/50 only)) ⋆/ | ||
271 | </programlisting> | ||
272 | </section></section> | ||
273 | |||
274 | |||
275 | <section id="video_function_calls"> | ||
276 | <title>Video Function Calls</title> | ||
277 | |||
278 | |||
279 | <section id="video_fopen"> | ||
280 | <title>open()</title> | ||
281 | <para>DESCRIPTION | ||
282 | </para> | ||
283 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
284 | align="char"> | ||
285 | <para>This system call opens a named video device (e.g. /dev/dvb/adapter0/video0) | ||
286 | for subsequent use.</para> | ||
287 | <para>When an open() call has succeeded, the device will be ready for use. | ||
288 | The significance of blocking or non-blocking mode is described in the | ||
289 | documentation for functions where there is a difference. It does not affect the | ||
290 | semantics of the open() call itself. A device opened in blocking mode can later | ||
291 | be put into non-blocking mode (and vice versa) using the F_SETFL command | ||
292 | of the fcntl system call. This is a standard system call, documented in the Linux | ||
293 | manual page for fcntl. Only one user can open the Video Device in O_RDWR | ||
294 | mode. All other attempts to open the device in this mode will fail, and an | ||
295 | error-code will be returned. If the Video Device is opened in O_RDONLY | ||
296 | mode, the only ioctl call that can be used is VIDEO_GET_STATUS. All other | ||
297 | call will return an error code.</para> | ||
298 | </entry> | ||
299 | </row></tbody></tgroup></informaltable> | ||
300 | |||
301 | <para>SYNOPSIS | ||
302 | </para> | ||
303 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
304 | align="char"> | ||
305 | <para>int open(const char ⋆deviceName, int flags);</para> | ||
306 | </entry> | ||
307 | </row></tbody></tgroup></informaltable> | ||
308 | <para>PARAMETERS | ||
309 | </para> | ||
310 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
311 | align="char"> | ||
312 | <para>const char | ||
313 | *deviceName</para> | ||
314 | </entry><entry | ||
315 | align="char"> | ||
316 | <para>Name of specific video device.</para> | ||
317 | </entry> | ||
318 | </row><row><entry | ||
319 | align="char"> | ||
320 | <para>int flags</para> | ||
321 | </entry><entry | ||
322 | align="char"> | ||
323 | <para>A bit-wise OR of the following flags:</para> | ||
324 | </entry> | ||
325 | </row><row><entry | ||
326 | align="char"> | ||
327 | </entry><entry | ||
328 | align="char"> | ||
329 | <para>O_RDONLY read-only access</para> | ||
330 | </entry> | ||
331 | </row><row><entry | ||
332 | align="char"> | ||
333 | </entry><entry | ||
334 | align="char"> | ||
335 | <para>O_RDWR read/write access</para> | ||
336 | </entry> | ||
337 | </row><row><entry | ||
338 | align="char"> | ||
339 | </entry><entry | ||
340 | align="char"> | ||
341 | <para>O_NONBLOCK open in non-blocking mode</para> | ||
342 | </entry> | ||
343 | </row><row><entry | ||
344 | align="char"> | ||
345 | </entry><entry | ||
346 | align="char"> | ||
347 | <para>(blocking mode is the default)</para> | ||
348 | </entry> | ||
349 | </row></tbody></tgroup></informaltable> | ||
350 | <para>ERRORS | ||
351 | </para> | ||
352 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
353 | align="char"> | ||
354 | <para>ENODEV</para> | ||
355 | </entry><entry | ||
356 | align="char"> | ||
357 | <para>Device driver not loaded/available.</para> | ||
358 | </entry> | ||
359 | </row><row><entry | ||
360 | align="char"> | ||
361 | <para>EINTERNAL</para> | ||
362 | </entry><entry | ||
363 | align="char"> | ||
364 | <para>Internal error.</para> | ||
365 | </entry> | ||
366 | </row><row><entry | ||
367 | align="char"> | ||
368 | <para>EBUSY</para> | ||
369 | </entry><entry | ||
370 | align="char"> | ||
371 | <para>Device or resource busy.</para> | ||
372 | </entry> | ||
373 | </row><row><entry | ||
374 | align="char"> | ||
375 | <para>EINVAL</para> | ||
376 | </entry><entry | ||
377 | align="char"> | ||
378 | <para>Invalid argument.</para> | ||
379 | </entry> | ||
380 | </row></tbody></tgroup></informaltable> | ||
381 | |||
382 | </section> | ||
383 | <section id="video_fclose"> | ||
384 | <title>close()</title> | ||
385 | <para>DESCRIPTION | ||
386 | </para> | ||
387 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
388 | align="char"> | ||
389 | <para>This system call closes a previously opened video device.</para> | ||
390 | </entry> | ||
391 | </row></tbody></tgroup></informaltable> | ||
392 | <para>SYNOPSIS | ||
393 | </para> | ||
394 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
395 | align="char"> | ||
396 | <para>int close(int fd);</para> | ||
397 | </entry> | ||
398 | </row></tbody></tgroup></informaltable> | ||
399 | <para>PARAMETERS | ||
400 | </para> | ||
401 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
402 | align="char"> | ||
403 | <para>int fd</para> | ||
404 | </entry><entry | ||
405 | align="char"> | ||
406 | <para>File descriptor returned by a previous call to open().</para> | ||
407 | </entry> | ||
408 | </row></tbody></tgroup></informaltable> | ||
409 | <para>ERRORS | ||
410 | </para> | ||
411 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
412 | align="char"> | ||
413 | <para>EBADF</para> | ||
414 | </entry><entry | ||
415 | align="char"> | ||
416 | <para>fd is not a valid open file descriptor.</para> | ||
417 | </entry> | ||
418 | </row></tbody></tgroup></informaltable> | ||
419 | |||
420 | </section> | ||
421 | <section id="video_fwrite"> | ||
422 | <title>write()</title> | ||
423 | <para>DESCRIPTION | ||
424 | </para> | ||
425 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
426 | align="char"> | ||
427 | <para>This system call can only be used if VIDEO_SOURCE_MEMORY is selected | ||
428 | in the ioctl call VIDEO_SELECT_SOURCE. The data provided shall be in | ||
429 | PES format, unless the capability allows other formats. If O_NONBLOCK is | ||
430 | not specified the function will block until buffer space is available. The amount | ||
431 | of data to be transferred is implied by count.</para> | ||
432 | </entry> | ||
433 | </row></tbody></tgroup></informaltable> | ||
434 | <para>SYNOPSIS | ||
435 | </para> | ||
436 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
437 | align="char"> | ||
438 | <para>size_t write(int fd, const void ⋆buf, size_t count);</para> | ||
439 | </entry> | ||
440 | </row></tbody></tgroup></informaltable> | ||
441 | <para>PARAMETERS | ||
442 | </para> | ||
443 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
444 | align="char"> | ||
445 | <para>int fd</para> | ||
446 | </entry><entry | ||
447 | align="char"> | ||
448 | <para>File descriptor returned by a previous call to open().</para> | ||
449 | </entry> | ||
450 | </row><row><entry | ||
451 | align="char"> | ||
452 | <para>void *buf</para> | ||
453 | </entry><entry | ||
454 | align="char"> | ||
455 | <para>Pointer to the buffer containing the PES data.</para> | ||
456 | </entry> | ||
457 | </row><row><entry | ||
458 | align="char"> | ||
459 | <para>size_t count</para> | ||
460 | </entry><entry | ||
461 | align="char"> | ||
462 | <para>Size of buf.</para> | ||
463 | </entry> | ||
464 | </row></tbody></tgroup></informaltable> | ||
465 | <para>ERRORS | ||
466 | </para> | ||
467 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
468 | align="char"> | ||
469 | <para>EPERM</para> | ||
470 | </entry><entry | ||
471 | align="char"> | ||
472 | <para>Mode VIDEO_SOURCE_MEMORY not selected.</para> | ||
473 | </entry> | ||
474 | </row><row><entry | ||
475 | align="char"> | ||
476 | <para>ENOMEM</para> | ||
477 | </entry><entry | ||
478 | align="char"> | ||
479 | <para>Attempted to write more data than the internal buffer can | ||
480 | hold.</para> | ||
481 | </entry> | ||
482 | </row><row><entry | ||
483 | align="char"> | ||
484 | <para>EBADF</para> | ||
485 | </entry><entry | ||
486 | align="char"> | ||
487 | <para>fd is not a valid open file descriptor.</para> | ||
488 | </entry> | ||
489 | </row></tbody></tgroup></informaltable> | ||
490 | |||
491 | </section><section | ||
492 | role="subsection"><title>VIDEO_STOP</title> | ||
493 | <para>DESCRIPTION | ||
494 | </para> | ||
495 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
496 | align="char"> | ||
497 | <para>This ioctl call asks the Video Device to stop playing the current stream. | ||
498 | Depending on the input parameter, the screen can be blanked out or displaying | ||
499 | the last decoded frame.</para> | ||
500 | </entry> | ||
501 | </row></tbody></tgroup></informaltable> | ||
502 | <para>SYNOPSIS | ||
503 | </para> | ||
504 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
505 | align="char"> | ||
506 | <para>int ioctl(fd, int request = VIDEO_STOP, boolean | ||
507 | mode);</para> | ||
508 | </entry> | ||
509 | </row></tbody></tgroup></informaltable> | ||
510 | <para>PARAMETERS | ||
511 | </para> | ||
512 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
513 | align="char"> | ||
514 | <para>int fd</para> | ||
515 | </entry><entry | ||
516 | align="char"> | ||
517 | <para>File descriptor returned by a previous call to open().</para> | ||
518 | </entry> | ||
519 | </row><row><entry | ||
520 | align="char"> | ||
521 | <para>int request</para> | ||
522 | </entry><entry | ||
523 | align="char"> | ||
524 | <para>Equals VIDEO_STOP for this command.</para> | ||
525 | </entry> | ||
526 | </row><row><entry | ||
527 | align="char"> | ||
528 | <para>Boolean mode</para> | ||
529 | </entry><entry | ||
530 | align="char"> | ||
531 | <para>Indicates how the screen shall be handled.</para> | ||
532 | </entry> | ||
533 | </row><row><entry | ||
534 | align="char"> | ||
535 | </entry><entry | ||
536 | align="char"> | ||
537 | <para>TRUE: Blank screen when stop.</para> | ||
538 | </entry> | ||
539 | </row><row><entry | ||
540 | align="char"> | ||
541 | </entry><entry | ||
542 | align="char"> | ||
543 | <para>FALSE: Show last decoded frame.</para> | ||
544 | </entry> | ||
545 | </row></tbody></tgroup></informaltable> | ||
546 | <para>ERRORS | ||
547 | </para> | ||
548 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
549 | align="char"> | ||
550 | <para>EBADF</para> | ||
551 | </entry><entry | ||
552 | align="char"> | ||
553 | <para>fd is not a valid open file descriptor</para> | ||
554 | </entry> | ||
555 | </row><row><entry | ||
556 | align="char"> | ||
557 | <para>EINTERNAL</para> | ||
558 | </entry><entry | ||
559 | align="char"> | ||
560 | <para>Internal error, possibly in the communication with the | ||
561 | DVB subsystem.</para> | ||
562 | </entry> | ||
563 | </row></tbody></tgroup></informaltable> | ||
564 | |||
565 | </section><section | ||
566 | role="subsection"><title>VIDEO_PLAY</title> | ||
567 | <para>DESCRIPTION | ||
568 | </para> | ||
569 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
570 | align="char"> | ||
571 | <para>This ioctl call asks the Video Device to start playing a video stream from the | ||
572 | selected source.</para> | ||
573 | </entry> | ||
574 | </row></tbody></tgroup></informaltable> | ||
575 | <para>SYNOPSIS | ||
576 | </para> | ||
577 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
578 | align="char"> | ||
579 | <para>int ioctl(fd, int request = VIDEO_PLAY);</para> | ||
580 | </entry> | ||
581 | </row></tbody></tgroup></informaltable> | ||
582 | <para>PARAMETERS | ||
583 | </para> | ||
584 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
585 | align="char"> | ||
586 | <para>int fd</para> | ||
587 | </entry><entry | ||
588 | align="char"> | ||
589 | <para>File descriptor returned by a previous call to open().</para> | ||
590 | </entry> | ||
591 | </row><row><entry | ||
592 | align="char"> | ||
593 | <para>int request</para> | ||
594 | </entry><entry | ||
595 | align="char"> | ||
596 | <para>Equals VIDEO_PLAY for this command.</para> | ||
597 | </entry> | ||
598 | </row></tbody></tgroup></informaltable> | ||
599 | <para>ERRORS | ||
600 | </para> | ||
601 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
602 | align="char"> | ||
603 | <para>EBADF</para> | ||
604 | </entry><entry | ||
605 | align="char"> | ||
606 | <para>fd is not a valid open file descriptor</para> | ||
607 | </entry> | ||
608 | </row><row><entry | ||
609 | align="char"> | ||
610 | <para>EINTERNAL</para> | ||
611 | </entry><entry | ||
612 | align="char"> | ||
613 | <para>Internal error, possibly in the communication with the | ||
614 | DVB subsystem.</para> | ||
615 | </entry> | ||
616 | </row></tbody></tgroup></informaltable> | ||
617 | |||
618 | </section><section | ||
619 | role="subsection"><title>VIDEO_FREEZE</title> | ||
620 | <para>DESCRIPTION | ||
621 | </para> | ||
622 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
623 | align="char"> | ||
624 | <para>This ioctl call suspends the live video stream being played. Decoding | ||
625 | and playing are frozen. It is then possible to restart the decoding | ||
626 | and playing process of the video stream using the VIDEO_CONTINUE | ||
627 | command. If VIDEO_SOURCE_MEMORY is selected in the ioctl call | ||
628 | VIDEO_SELECT_SOURCE, the DVB subsystem will not decode any more | ||
629 | data until the ioctl call VIDEO_CONTINUE or VIDEO_PLAY is performed.</para> | ||
630 | </entry> | ||
631 | </row></tbody></tgroup></informaltable> | ||
632 | <para>SYNOPSIS | ||
633 | </para> | ||
634 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
635 | align="char"> | ||
636 | <para>int ioctl(fd, int request = VIDEO_FREEZE);</para> | ||
637 | </entry> | ||
638 | </row></tbody></tgroup></informaltable> | ||
639 | <para>PARAMETERS | ||
640 | </para> | ||
641 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
642 | align="char"> | ||
643 | <para>int fd</para> | ||
644 | </entry><entry | ||
645 | align="char"> | ||
646 | <para>File descriptor returned by a previous call to open().</para> | ||
647 | </entry> | ||
648 | </row><row><entry | ||
649 | align="char"> | ||
650 | <para>int request</para> | ||
651 | </entry><entry | ||
652 | align="char"> | ||
653 | <para>Equals VIDEO_FREEZE for this command.</para> | ||
654 | </entry> | ||
655 | </row></tbody></tgroup></informaltable> | ||
656 | <para>ERRORS | ||
657 | </para> | ||
658 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
659 | align="char"> | ||
660 | <para>EBADF</para> | ||
661 | </entry><entry | ||
662 | align="char"> | ||
663 | <para>fd is not a valid open file descriptor</para> | ||
664 | </entry> | ||
665 | </row><row><entry | ||
666 | align="char"> | ||
667 | <para>EINTERNAL</para> | ||
668 | </entry><entry | ||
669 | align="char"> | ||
670 | <para>Internal error, possibly in the communication with the | ||
671 | DVB subsystem.</para> | ||
672 | </entry> | ||
673 | </row></tbody></tgroup></informaltable> | ||
674 | |||
675 | </section><section | ||
676 | role="subsection"><title>VIDEO_CONTINUE</title> | ||
677 | <para>DESCRIPTION | ||
678 | </para> | ||
679 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
680 | align="char"> | ||
681 | <para>This ioctl call restarts decoding and playing processes of the video stream | ||
682 | which was played before a call to VIDEO_FREEZE was made.</para> | ||
683 | </entry> | ||
684 | </row></tbody></tgroup></informaltable> | ||
685 | <para>SYNOPSIS | ||
686 | </para> | ||
687 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
688 | align="char"> | ||
689 | <para>int ioctl(fd, int request = VIDEO_CONTINUE);</para> | ||
690 | </entry> | ||
691 | </row></tbody></tgroup></informaltable> | ||
692 | <para>PARAMETERS | ||
693 | </para> | ||
694 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
695 | align="char"> | ||
696 | <para>int fd</para> | ||
697 | </entry><entry | ||
698 | align="char"> | ||
699 | <para>File descriptor returned by a previous call to open().</para> | ||
700 | </entry> | ||
701 | </row><row><entry | ||
702 | align="char"> | ||
703 | <para>int request</para> | ||
704 | </entry><entry | ||
705 | align="char"> | ||
706 | <para>Equals VIDEO_CONTINUE for this command.</para> | ||
707 | </entry> | ||
708 | </row></tbody></tgroup></informaltable> | ||
709 | <para>ERRORS | ||
710 | </para> | ||
711 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
712 | align="char"> | ||
713 | <para>EBADF</para> | ||
714 | </entry><entry | ||
715 | align="char"> | ||
716 | <para>fd is not a valid open file descriptor</para> | ||
717 | </entry> | ||
718 | </row><row><entry | ||
719 | align="char"> | ||
720 | <para>EINTERNAL</para> | ||
721 | </entry><entry | ||
722 | align="char"> | ||
723 | <para>Internal error, possibly in the communication with the | ||
724 | DVB subsystem.</para> | ||
725 | </entry> | ||
726 | </row></tbody></tgroup></informaltable> | ||
727 | |||
728 | </section><section | ||
729 | role="subsection"><title>VIDEO_SELECT_SOURCE</title> | ||
730 | <para>DESCRIPTION | ||
731 | </para> | ||
732 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
733 | align="char"> | ||
734 | <para>This ioctl call informs the video device which source shall be used for the input | ||
735 | data. The possible sources are demux or memory. If memory is selected, the | ||
736 | data is fed to the video device through the write command.</para> | ||
737 | </entry> | ||
738 | </row></tbody></tgroup></informaltable> | ||
739 | <para>SYNOPSIS | ||
740 | </para> | ||
741 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
742 | align="char"> | ||
743 | <para>int ioctl(fd, int request = VIDEO_SELECT_SOURCE, | ||
744 | video_stream_source_t source);</para> | ||
745 | </entry> | ||
746 | </row></tbody></tgroup></informaltable> | ||
747 | <para>PARAMETERS | ||
748 | </para> | ||
749 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
750 | align="char"> | ||
751 | <para>int fd</para> | ||
752 | </entry><entry | ||
753 | align="char"> | ||
754 | <para>File descriptor returned by a previous call to open().</para> | ||
755 | </entry> | ||
756 | </row><row><entry | ||
757 | align="char"> | ||
758 | <para>int request</para> | ||
759 | </entry><entry | ||
760 | align="char"> | ||
761 | <para>Equals VIDEO_SELECT_SOURCE for this command.</para> | ||
762 | </entry> | ||
763 | </row><row><entry | ||
764 | align="char"> | ||
765 | <para>video_stream_source_t | ||
766 | source</para> | ||
767 | </entry><entry | ||
768 | align="char"> | ||
769 | <para>Indicates which source shall be used for the Video stream.</para> | ||
770 | </entry> | ||
771 | </row></tbody></tgroup></informaltable> | ||
772 | <para>ERRORS | ||
773 | </para> | ||
774 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
775 | align="char"> | ||
776 | <para>EBADF</para> | ||
777 | </entry><entry | ||
778 | align="char"> | ||
779 | <para>fd is not a valid open file descriptor</para> | ||
780 | </entry> | ||
781 | </row><row><entry | ||
782 | align="char"> | ||
783 | <para>EINTERNAL</para> | ||
784 | </entry><entry | ||
785 | align="char"> | ||
786 | <para>Internal error, possibly in the communication with the | ||
787 | DVB subsystem.</para> | ||
788 | </entry> | ||
789 | </row></tbody></tgroup></informaltable> | ||
790 | |||
791 | </section><section | ||
792 | role="subsection"><title>VIDEO_SET_BLANK</title> | ||
793 | <para>DESCRIPTION | ||
794 | </para> | ||
795 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
796 | align="char"> | ||
797 | <para>This ioctl call asks the Video Device to blank out the picture.</para> | ||
798 | </entry> | ||
799 | </row></tbody></tgroup></informaltable> | ||
800 | <para>SYNOPSIS | ||
801 | </para> | ||
802 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
803 | align="char"> | ||
804 | <para>int ioctl(fd, int request = VIDEO_SET_BLANK, boolean | ||
805 | mode);</para> | ||
806 | </entry> | ||
807 | </row></tbody></tgroup></informaltable> | ||
808 | <para>PARAMETERS | ||
809 | </para> | ||
810 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
811 | align="char"> | ||
812 | <para>int fd</para> | ||
813 | </entry><entry | ||
814 | align="char"> | ||
815 | <para>File descriptor returned by a previous call to open().</para> | ||
816 | </entry> | ||
817 | </row><row><entry | ||
818 | align="char"> | ||
819 | <para>int request</para> | ||
820 | </entry><entry | ||
821 | align="char"> | ||
822 | <para>Equals VIDEO_SET_BLANK for this command.</para> | ||
823 | </entry> | ||
824 | </row><row><entry | ||
825 | align="char"> | ||
826 | <para>boolean mode</para> | ||
827 | </entry><entry | ||
828 | align="char"> | ||
829 | <para>TRUE: Blank screen when stop.</para> | ||
830 | </entry> | ||
831 | </row><row><entry | ||
832 | align="char"> | ||
833 | </entry><entry | ||
834 | align="char"> | ||
835 | <para>FALSE: Show last decoded frame.</para> | ||
836 | </entry> | ||
837 | </row></tbody></tgroup></informaltable> | ||
838 | <para>ERRORS | ||
839 | </para> | ||
840 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
841 | align="char"> | ||
842 | <para>EBADF</para> | ||
843 | </entry><entry | ||
844 | align="char"> | ||
845 | <para>fd is not a valid open file descriptor</para> | ||
846 | </entry> | ||
847 | </row><row><entry | ||
848 | align="char"> | ||
849 | <para>EINTERNAL</para> | ||
850 | </entry><entry | ||
851 | align="char"> | ||
852 | <para>Internal error, possibly in the communication with the | ||
853 | DVB subsystem.</para> | ||
854 | </entry> | ||
855 | </row><row><entry | ||
856 | align="char"> | ||
857 | <para>EINVAL</para> | ||
858 | </entry><entry | ||
859 | align="char"> | ||
860 | <para>Illegal input parameter</para> | ||
861 | </entry> | ||
862 | </row></tbody></tgroup></informaltable> | ||
863 | |||
864 | </section><section | ||
865 | role="subsection"><title>VIDEO_GET_STATUS</title> | ||
866 | <para>DESCRIPTION | ||
867 | </para> | ||
868 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
869 | align="char"> | ||
870 | <para>This ioctl call asks the Video Device to return the current status of the device.</para> | ||
871 | </entry> | ||
872 | </row></tbody></tgroup></informaltable> | ||
873 | <para>SYNOPSIS | ||
874 | </para> | ||
875 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
876 | align="char"> | ||
877 | <para> int ioctl(fd, int request = VIDEO_GET_STATUS, struct | ||
878 | video_status ⋆status);</para> | ||
879 | </entry> | ||
880 | </row></tbody></tgroup></informaltable> | ||
881 | <para>PARAMETERS | ||
882 | </para> | ||
883 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
884 | align="char"> | ||
885 | <para>int fd</para> | ||
886 | </entry><entry | ||
887 | align="char"> | ||
888 | <para>File descriptor returned by a previous call to open().</para> | ||
889 | </entry> | ||
890 | </row><row><entry | ||
891 | align="char"> | ||
892 | <para>int request</para> | ||
893 | </entry><entry | ||
894 | align="char"> | ||
895 | <para>Equals VIDEO_GET_STATUS for this command.</para> | ||
896 | </entry> | ||
897 | </row><row><entry | ||
898 | align="char"> | ||
899 | <para>struct video_status | ||
900 | *status</para> | ||
901 | </entry><entry | ||
902 | align="char"> | ||
903 | <para>Returns the current status of the Video Device.</para> | ||
904 | </entry> | ||
905 | </row></tbody></tgroup></informaltable> | ||
906 | <para>ERRORS | ||
907 | </para> | ||
908 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
909 | align="char"> | ||
910 | <para>EBADF</para> | ||
911 | </entry><entry | ||
912 | align="char"> | ||
913 | <para>fd is not a valid open file descriptor</para> | ||
914 | </entry> | ||
915 | </row><row><entry | ||
916 | align="char"> | ||
917 | <para>EINTERNAL</para> | ||
918 | </entry><entry | ||
919 | align="char"> | ||
920 | <para>Internal error, possibly in the communication with the | ||
921 | DVB subsystem.</para> | ||
922 | </entry> | ||
923 | </row><row><entry | ||
924 | align="char"> | ||
925 | <para>EFAULT</para> | ||
926 | </entry><entry | ||
927 | align="char"> | ||
928 | <para>status points to invalid address</para> | ||
929 | </entry> | ||
930 | </row></tbody></tgroup></informaltable> | ||
931 | |||
932 | </section><section | ||
933 | role="subsection"><title>VIDEO_GET_EVENT</title> | ||
934 | <para>DESCRIPTION | ||
935 | </para> | ||
936 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
937 | align="char"> | ||
938 | <para>This ioctl call returns an event of type video_event if available. If an event is | ||
939 | not available, the behavior depends on whether the device is in blocking or | ||
940 | non-blocking mode. In the latter case, the call fails immediately with errno | ||
941 | set to EWOULDBLOCK. In the former case, the call blocks until an event | ||
942 | becomes available. The standard Linux poll() and/or select() system calls can | ||
943 | be used with the device file descriptor to watch for new events. For select(), | ||
944 | the file descriptor should be included in the exceptfds argument, and for | ||
945 | poll(), POLLPRI should be specified as the wake-up condition. Read-only | ||
946 | permissions are sufficient for this ioctl call.</para> | ||
947 | </entry> | ||
948 | </row></tbody></tgroup></informaltable> | ||
949 | <para>SYNOPSIS | ||
950 | </para> | ||
951 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
952 | align="char"> | ||
953 | <para> int ioctl(fd, int request = VIDEO_GET_EVENT, struct | ||
954 | video_event ⋆ev);</para> | ||
955 | </entry> | ||
956 | </row></tbody></tgroup></informaltable> | ||
957 | <para>PARAMETERS | ||
958 | </para> | ||
959 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
960 | align="char"> | ||
961 | <para>int fd</para> | ||
962 | </entry><entry | ||
963 | align="char"> | ||
964 | <para>File descriptor returned by a previous call to open().</para> | ||
965 | </entry> | ||
966 | </row><row><entry | ||
967 | align="char"> | ||
968 | <para>int request</para> | ||
969 | </entry><entry | ||
970 | align="char"> | ||
971 | <para>Equals VIDEO_GET_EVENT for this command.</para> | ||
972 | </entry> | ||
973 | </row><row><entry | ||
974 | align="char"> | ||
975 | <para>struct video_event | ||
976 | *ev</para> | ||
977 | </entry><entry | ||
978 | align="char"> | ||
979 | <para>Points to the location where the event, if any, is to be | ||
980 | stored.</para> | ||
981 | </entry> | ||
982 | </row></tbody></tgroup></informaltable> | ||
983 | <para>ERRORS | ||
984 | </para> | ||
985 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
986 | align="char"> | ||
987 | <para>EBADF</para> | ||
988 | </entry><entry | ||
989 | align="char"> | ||
990 | <para>fd is not a valid open file descriptor</para> | ||
991 | </entry> | ||
992 | </row><row><entry | ||
993 | align="char"> | ||
994 | <para>EFAULT</para> | ||
995 | </entry><entry | ||
996 | align="char"> | ||
997 | <para>ev points to invalid address</para> | ||
998 | </entry> | ||
999 | </row><row><entry | ||
1000 | align="char"> | ||
1001 | <para>EWOULDBLOCK</para> | ||
1002 | </entry><entry | ||
1003 | align="char"> | ||
1004 | <para>There is no event pending, and the device is in | ||
1005 | non-blocking mode.</para> | ||
1006 | </entry> | ||
1007 | </row><row><entry | ||
1008 | align="char"> | ||
1009 | <para>EOVERFLOW</para> | ||
1010 | </entry><entry | ||
1011 | align="char"> | ||
1012 | </entry> | ||
1013 | </row><row><entry | ||
1014 | align="char"> | ||
1015 | </entry><entry | ||
1016 | align="char"> | ||
1017 | <para>Overflow in event queue - one or more events were lost.</para> | ||
1018 | </entry> | ||
1019 | </row></tbody></tgroup></informaltable> | ||
1020 | |||
1021 | </section><section | ||
1022 | role="subsection"><title>VIDEO_SET_DISPLAY_FORMAT</title> | ||
1023 | <para>DESCRIPTION | ||
1024 | </para> | ||
1025 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1026 | align="char"> | ||
1027 | <para>This ioctl call asks the Video Device to select the video format to be applied | ||
1028 | by the MPEG chip on the video.</para> | ||
1029 | </entry> | ||
1030 | </row></tbody></tgroup></informaltable> | ||
1031 | <para>SYNOPSIS | ||
1032 | </para> | ||
1033 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1034 | align="char"> | ||
1035 | <para> int ioctl(fd, int request = | ||
1036 | VIDEO_SET_DISPLAY_FORMAT, video_display_format_t | ||
1037 | format);</para> | ||
1038 | </entry> | ||
1039 | </row></tbody></tgroup></informaltable> | ||
1040 | <para>PARAMETERS | ||
1041 | </para> | ||
1042 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1043 | align="char"> | ||
1044 | <para>int fd</para> | ||
1045 | </entry><entry | ||
1046 | align="char"> | ||
1047 | <para>File descriptor returned by a previous call to open().</para> | ||
1048 | </entry> | ||
1049 | </row><row><entry | ||
1050 | align="char"> | ||
1051 | <para>int request</para> | ||
1052 | </entry><entry | ||
1053 | align="char"> | ||
1054 | <para>Equals VIDEO_SET_DISPLAY_FORMAT for this | ||
1055 | command.</para> | ||
1056 | </entry> | ||
1057 | </row><row><entry | ||
1058 | align="char"> | ||
1059 | <para>video_display_format_t | ||
1060 | format</para> | ||
1061 | </entry><entry | ||
1062 | align="char"> | ||
1063 | <para>Selects the video format to be used.</para> | ||
1064 | </entry> | ||
1065 | </row></tbody></tgroup></informaltable> | ||
1066 | <para>ERRORS | ||
1067 | </para> | ||
1068 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1069 | align="char"> | ||
1070 | <para>EBADF</para> | ||
1071 | </entry><entry | ||
1072 | align="char"> | ||
1073 | <para>fd is not a valid open file descriptor</para> | ||
1074 | </entry> | ||
1075 | </row><row><entry | ||
1076 | align="char"> | ||
1077 | <para>EINTERNAL</para> | ||
1078 | </entry><entry | ||
1079 | align="char"> | ||
1080 | <para>Internal error.</para> | ||
1081 | </entry> | ||
1082 | </row><row><entry | ||
1083 | align="char"> | ||
1084 | <para>EINVAL</para> | ||
1085 | </entry><entry | ||
1086 | align="char"> | ||
1087 | <para>Illegal parameter format.</para> | ||
1088 | </entry> | ||
1089 | </row></tbody></tgroup></informaltable> | ||
1090 | |||
1091 | </section><section | ||
1092 | role="subsection"><title>VIDEO_STILLPICTURE</title> | ||
1093 | <para>DESCRIPTION | ||
1094 | </para> | ||
1095 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1096 | align="char"> | ||
1097 | <para>This ioctl call asks the Video Device to display a still picture (I-frame). The | ||
1098 | input data shall contain an I-frame. If the pointer is NULL, then the current | ||
1099 | displayed still picture is blanked.</para> | ||
1100 | </entry> | ||
1101 | </row></tbody></tgroup></informaltable> | ||
1102 | <para>SYNOPSIS | ||
1103 | </para> | ||
1104 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1105 | align="char"> | ||
1106 | <para>int ioctl(fd, int request = VIDEO_STILLPICTURE, | ||
1107 | struct video_still_picture ⋆sp);</para> | ||
1108 | </entry> | ||
1109 | </row></tbody></tgroup></informaltable> | ||
1110 | <para>PARAMETERS | ||
1111 | </para> | ||
1112 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1113 | align="char"> | ||
1114 | <para>int fd</para> | ||
1115 | </entry><entry | ||
1116 | align="char"> | ||
1117 | <para>File descriptor returned by a previous call to open().</para> | ||
1118 | </entry> | ||
1119 | </row><row><entry | ||
1120 | align="char"> | ||
1121 | <para>int request</para> | ||
1122 | </entry><entry | ||
1123 | align="char"> | ||
1124 | <para>Equals VIDEO_STILLPICTURE for this command.</para> | ||
1125 | </entry> | ||
1126 | </row><row><entry | ||
1127 | align="char"> | ||
1128 | <para>struct | ||
1129 | video_still_picture | ||
1130 | *sp</para> | ||
1131 | </entry><entry | ||
1132 | align="char"> | ||
1133 | <para>Pointer to a location where an I-frame and size is stored.</para> | ||
1134 | </entry> | ||
1135 | </row></tbody></tgroup></informaltable> | ||
1136 | <para>ERRORS | ||
1137 | </para> | ||
1138 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1139 | align="char"> | ||
1140 | <para>EBADF</para> | ||
1141 | </entry><entry | ||
1142 | align="char"> | ||
1143 | <para>fd is not a valid open file descriptor</para> | ||
1144 | </entry> | ||
1145 | </row><row><entry | ||
1146 | align="char"> | ||
1147 | <para>EINTERNAL</para> | ||
1148 | </entry><entry | ||
1149 | align="char"> | ||
1150 | <para>Internal error.</para> | ||
1151 | </entry> | ||
1152 | </row><row><entry | ||
1153 | align="char"> | ||
1154 | <para>EFAULT</para> | ||
1155 | </entry><entry | ||
1156 | align="char"> | ||
1157 | <para>sp points to an invalid iframe.</para> | ||
1158 | </entry> | ||
1159 | </row></tbody></tgroup></informaltable> | ||
1160 | |||
1161 | </section><section | ||
1162 | role="subsection"><title>VIDEO_FAST_FORWARD</title> | ||
1163 | <para>DESCRIPTION | ||
1164 | </para> | ||
1165 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1166 | align="char"> | ||
1167 | <para>This ioctl call asks the Video Device to skip decoding of N number of I-frames. | ||
1168 | This call can only be used if VIDEO_SOURCE_MEMORY is selected.</para> | ||
1169 | </entry> | ||
1170 | </row></tbody></tgroup></informaltable> | ||
1171 | <para>SYNOPSIS | ||
1172 | </para> | ||
1173 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1174 | align="char"> | ||
1175 | <para>int ioctl(fd, int request = VIDEO_FAST_FORWARD, int | ||
1176 | nFrames);</para> | ||
1177 | </entry> | ||
1178 | </row></tbody></tgroup></informaltable> | ||
1179 | <para>PARAMETERS | ||
1180 | </para> | ||
1181 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1182 | align="char"> | ||
1183 | <para>int fd</para> | ||
1184 | </entry><entry | ||
1185 | align="char"> | ||
1186 | <para>File descriptor returned by a previous call to open().</para> | ||
1187 | </entry> | ||
1188 | </row><row><entry | ||
1189 | align="char"> | ||
1190 | <para>int request</para> | ||
1191 | </entry><entry | ||
1192 | align="char"> | ||
1193 | <para>Equals VIDEO_FAST_FORWARD for this command.</para> | ||
1194 | </entry> | ||
1195 | </row><row><entry | ||
1196 | align="char"> | ||
1197 | <para>int nFrames</para> | ||
1198 | </entry><entry | ||
1199 | align="char"> | ||
1200 | <para>The number of frames to skip.</para> | ||
1201 | </entry> | ||
1202 | </row></tbody></tgroup></informaltable> | ||
1203 | <para>ERRORS | ||
1204 | </para> | ||
1205 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1206 | align="char"> | ||
1207 | <para>EBADF</para> | ||
1208 | </entry><entry | ||
1209 | align="char"> | ||
1210 | <para>fd is not a valid open file descriptor</para> | ||
1211 | </entry> | ||
1212 | </row><row><entry | ||
1213 | align="char"> | ||
1214 | <para>EINTERNAL</para> | ||
1215 | </entry><entry | ||
1216 | align="char"> | ||
1217 | <para>Internal error.</para> | ||
1218 | </entry> | ||
1219 | </row><row><entry | ||
1220 | align="char"> | ||
1221 | <para>EPERM</para> | ||
1222 | </entry><entry | ||
1223 | align="char"> | ||
1224 | <para>Mode VIDEO_SOURCE_MEMORY not selected.</para> | ||
1225 | </entry> | ||
1226 | </row><row><entry | ||
1227 | align="char"> | ||
1228 | <para>EINVAL</para> | ||
1229 | </entry><entry | ||
1230 | align="char"> | ||
1231 | <para>Illegal parameter format.</para> | ||
1232 | </entry> | ||
1233 | </row></tbody></tgroup></informaltable> | ||
1234 | |||
1235 | </section><section | ||
1236 | role="subsection"><title>VIDEO_SLOWMOTION</title> | ||
1237 | <para>DESCRIPTION | ||
1238 | </para> | ||
1239 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1240 | align="char"> | ||
1241 | <para>This ioctl call asks the video device to repeat decoding frames N number of | ||
1242 | times. This call can only be used if VIDEO_SOURCE_MEMORY is selected.</para> | ||
1243 | </entry> | ||
1244 | </row></tbody></tgroup></informaltable> | ||
1245 | <para>SYNOPSIS | ||
1246 | </para> | ||
1247 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1248 | align="char"> | ||
1249 | <para>int ioctl(fd, int request = VIDEO_SLOWMOTION, int | ||
1250 | nFrames);</para> | ||
1251 | </entry> | ||
1252 | </row></tbody></tgroup></informaltable> | ||
1253 | <para>PARAMETERS | ||
1254 | </para> | ||
1255 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1256 | align="char"> | ||
1257 | <para>int fd</para> | ||
1258 | </entry><entry | ||
1259 | align="char"> | ||
1260 | <para>File descriptor returned by a previous call to open().</para> | ||
1261 | </entry> | ||
1262 | </row><row><entry | ||
1263 | align="char"> | ||
1264 | <para>int request</para> | ||
1265 | </entry><entry | ||
1266 | align="char"> | ||
1267 | <para>Equals VIDEO_SLOWMOTION for this command.</para> | ||
1268 | </entry> | ||
1269 | </row><row><entry | ||
1270 | align="char"> | ||
1271 | <para>int nFrames</para> | ||
1272 | </entry><entry | ||
1273 | align="char"> | ||
1274 | <para>The number of times to repeat each frame.</para> | ||
1275 | </entry> | ||
1276 | </row></tbody></tgroup></informaltable> | ||
1277 | <para>ERRORS | ||
1278 | </para> | ||
1279 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1280 | align="char"> | ||
1281 | <para>EBADF</para> | ||
1282 | </entry><entry | ||
1283 | align="char"> | ||
1284 | <para>fd is not a valid open file descriptor</para> | ||
1285 | </entry> | ||
1286 | </row><row><entry | ||
1287 | align="char"> | ||
1288 | <para>EINTERNAL</para> | ||
1289 | </entry><entry | ||
1290 | align="char"> | ||
1291 | <para>Internal error.</para> | ||
1292 | </entry> | ||
1293 | </row><row><entry | ||
1294 | align="char"> | ||
1295 | <para>EPERM</para> | ||
1296 | </entry><entry | ||
1297 | align="char"> | ||
1298 | <para>Mode VIDEO_SOURCE_MEMORY not selected.</para> | ||
1299 | </entry> | ||
1300 | </row><row><entry | ||
1301 | align="char"> | ||
1302 | <para>EINVAL</para> | ||
1303 | </entry><entry | ||
1304 | align="char"> | ||
1305 | <para>Illegal parameter format.</para> | ||
1306 | </entry> | ||
1307 | </row></tbody></tgroup></informaltable> | ||
1308 | |||
1309 | </section><section | ||
1310 | role="subsection"><title>VIDEO_GET_CAPABILITIES</title> | ||
1311 | <para>DESCRIPTION | ||
1312 | </para> | ||
1313 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1314 | align="char"> | ||
1315 | <para>This ioctl call asks the video device about its decoding capabilities. On success | ||
1316 | it returns and integer which has bits set according to the defines in section ??.</para> | ||
1317 | </entry> | ||
1318 | </row></tbody></tgroup></informaltable> | ||
1319 | <para>SYNOPSIS | ||
1320 | </para> | ||
1321 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1322 | align="char"> | ||
1323 | <para>int ioctl(fd, int request = VIDEO_GET_CAPABILITIES, | ||
1324 | unsigned int ⋆cap);</para> | ||
1325 | </entry> | ||
1326 | </row></tbody></tgroup></informaltable> | ||
1327 | <para>PARAMETERS | ||
1328 | </para> | ||
1329 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1330 | align="char"> | ||
1331 | <para>int fd</para> | ||
1332 | </entry><entry | ||
1333 | align="char"> | ||
1334 | <para>File descriptor returned by a previous call to open().</para> | ||
1335 | </entry> | ||
1336 | </row><row><entry | ||
1337 | align="char"> | ||
1338 | <para>int request</para> | ||
1339 | </entry><entry | ||
1340 | align="char"> | ||
1341 | <para>Equals VIDEO_GET_CAPABILITIES for this | ||
1342 | command.</para> | ||
1343 | </entry> | ||
1344 | </row><row><entry | ||
1345 | align="char"> | ||
1346 | <para>unsigned int *cap</para> | ||
1347 | </entry><entry | ||
1348 | align="char"> | ||
1349 | <para>Pointer to a location where to store the capability | ||
1350 | information.</para> | ||
1351 | </entry> | ||
1352 | </row></tbody></tgroup></informaltable> | ||
1353 | <para>ERRORS | ||
1354 | </para> | ||
1355 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1356 | align="char"> | ||
1357 | <para>EBADF</para> | ||
1358 | </entry><entry | ||
1359 | align="char"> | ||
1360 | <para>fd is not a valid open file descriptor</para> | ||
1361 | </entry> | ||
1362 | </row><row><entry | ||
1363 | align="char"> | ||
1364 | <para>EFAULT</para> | ||
1365 | </entry><entry | ||
1366 | align="char"> | ||
1367 | <para>cap points to an invalid iframe.</para> | ||
1368 | </entry> | ||
1369 | </row></tbody></tgroup></informaltable> | ||
1370 | |||
1371 | </section><section | ||
1372 | role="subsection"><title>VIDEO_SET_ID</title> | ||
1373 | <para>DESCRIPTION | ||
1374 | </para> | ||
1375 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1376 | align="char"> | ||
1377 | <para>This ioctl selects which sub-stream is to be decoded if a program or system | ||
1378 | stream is sent to the video device.</para> | ||
1379 | </entry> | ||
1380 | </row></tbody></tgroup></informaltable> | ||
1381 | <para>SYNOPSIS | ||
1382 | </para> | ||
1383 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1384 | align="char"> | ||
1385 | <para>int ioctl(int fd, int request = VIDEO_SET_ID, int | ||
1386 | id);</para> | ||
1387 | </entry> | ||
1388 | </row></tbody></tgroup></informaltable> | ||
1389 | <para>PARAMETERS | ||
1390 | </para> | ||
1391 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1392 | align="char"> | ||
1393 | <para>int fd</para> | ||
1394 | </entry><entry | ||
1395 | align="char"> | ||
1396 | <para>File descriptor returned by a previous call to open().</para> | ||
1397 | </entry> | ||
1398 | </row><row><entry | ||
1399 | align="char"> | ||
1400 | <para>int request</para> | ||
1401 | </entry><entry | ||
1402 | align="char"> | ||
1403 | <para>Equals VIDEO_SET_ID for this command.</para> | ||
1404 | </entry> | ||
1405 | </row><row><entry | ||
1406 | align="char"> | ||
1407 | <para>int id</para> | ||
1408 | </entry><entry | ||
1409 | align="char"> | ||
1410 | <para>video sub-stream id</para> | ||
1411 | </entry> | ||
1412 | </row></tbody></tgroup></informaltable> | ||
1413 | <para>ERRORS | ||
1414 | </para> | ||
1415 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1416 | align="char"> | ||
1417 | <para>EBADF</para> | ||
1418 | </entry><entry | ||
1419 | align="char"> | ||
1420 | <para>fd is not a valid open file descriptor.</para> | ||
1421 | </entry> | ||
1422 | </row><row><entry | ||
1423 | align="char"> | ||
1424 | <para>EINTERNAL</para> | ||
1425 | </entry><entry | ||
1426 | align="char"> | ||
1427 | <para>Internal error.</para> | ||
1428 | </entry> | ||
1429 | </row><row><entry | ||
1430 | align="char"> | ||
1431 | <para>EINVAL</para> | ||
1432 | </entry><entry | ||
1433 | align="char"> | ||
1434 | <para>Invalid sub-stream id.</para> | ||
1435 | </entry> | ||
1436 | </row></tbody></tgroup></informaltable> | ||
1437 | |||
1438 | </section><section | ||
1439 | role="subsection"><title>VIDEO_CLEAR_BUFFER</title> | ||
1440 | <para>DESCRIPTION | ||
1441 | </para> | ||
1442 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1443 | align="char"> | ||
1444 | <para>This ioctl call clears all video buffers in the driver and in the decoder hardware.</para> | ||
1445 | </entry> | ||
1446 | </row></tbody></tgroup></informaltable> | ||
1447 | <para>SYNOPSIS | ||
1448 | </para> | ||
1449 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1450 | align="char"> | ||
1451 | <para>int ioctl(fd, int request = VIDEO_CLEAR_BUFFER);</para> | ||
1452 | </entry> | ||
1453 | </row></tbody></tgroup></informaltable> | ||
1454 | <para>PARAMETERS | ||
1455 | </para> | ||
1456 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1457 | align="char"> | ||
1458 | <para>int fd</para> | ||
1459 | </entry><entry | ||
1460 | align="char"> | ||
1461 | <para>File descriptor returned by a previous call to open().</para> | ||
1462 | </entry> | ||
1463 | </row><row><entry | ||
1464 | align="char"> | ||
1465 | <para>int request</para> | ||
1466 | </entry><entry | ||
1467 | align="char"> | ||
1468 | <para>Equals VIDEO_CLEAR_BUFFER for this command.</para> | ||
1469 | </entry> | ||
1470 | </row></tbody></tgroup></informaltable> | ||
1471 | <para>ERRORS | ||
1472 | </para> | ||
1473 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1474 | align="char"> | ||
1475 | <para>EBADF</para> | ||
1476 | </entry><entry | ||
1477 | align="char"> | ||
1478 | <para>fd is not a valid open file descriptor</para> | ||
1479 | </entry> | ||
1480 | </row></tbody></tgroup></informaltable> | ||
1481 | |||
1482 | </section><section | ||
1483 | role="subsection"><title>VIDEO_SET_STREAMTYPE</title> | ||
1484 | <para>DESCRIPTION | ||
1485 | </para> | ||
1486 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1487 | align="char"> | ||
1488 | <para>This ioctl tells the driver which kind of stream to expect being written to it. If | ||
1489 | this call is not used the default of video PES is used. Some drivers might not | ||
1490 | support this call and always expect PES.</para> | ||
1491 | </entry> | ||
1492 | </row></tbody></tgroup></informaltable> | ||
1493 | <para>SYNOPSIS | ||
1494 | </para> | ||
1495 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1496 | align="char"> | ||
1497 | <para>int ioctl(fd, int request = VIDEO_SET_STREAMTYPE, | ||
1498 | int type);</para> | ||
1499 | </entry> | ||
1500 | </row></tbody></tgroup></informaltable> | ||
1501 | <para>PARAMETERS | ||
1502 | </para> | ||
1503 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1504 | align="char"> | ||
1505 | <para>int fd</para> | ||
1506 | </entry><entry | ||
1507 | align="char"> | ||
1508 | <para>File descriptor returned by a previous call to open().</para> | ||
1509 | </entry> | ||
1510 | </row><row><entry | ||
1511 | align="char"> | ||
1512 | <para>int request</para> | ||
1513 | </entry><entry | ||
1514 | align="char"> | ||
1515 | <para>Equals VIDEO_SET_STREAMTYPE for this command.</para> | ||
1516 | </entry> | ||
1517 | </row><row><entry | ||
1518 | align="char"> | ||
1519 | <para>int type</para> | ||
1520 | </entry><entry | ||
1521 | align="char"> | ||
1522 | <para>stream type</para> | ||
1523 | </entry> | ||
1524 | </row></tbody></tgroup></informaltable> | ||
1525 | <para>ERRORS | ||
1526 | </para> | ||
1527 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1528 | align="char"> | ||
1529 | <para>EBADF</para> | ||
1530 | </entry><entry | ||
1531 | align="char"> | ||
1532 | <para>fd is not a valid open file descriptor</para> | ||
1533 | </entry> | ||
1534 | </row><row><entry | ||
1535 | align="char"> | ||
1536 | <para>EINVAL</para> | ||
1537 | </entry><entry | ||
1538 | align="char"> | ||
1539 | <para>type is not a valid or supported stream type.</para> | ||
1540 | </entry> | ||
1541 | </row></tbody></tgroup></informaltable> | ||
1542 | |||
1543 | </section><section | ||
1544 | role="subsection"><title>VIDEO_SET_FORMAT</title> | ||
1545 | <para>DESCRIPTION | ||
1546 | </para> | ||
1547 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1548 | align="char"> | ||
1549 | <para>This ioctl sets the screen format (aspect ratio) of the connected output device | ||
1550 | (TV) so that the output of the decoder can be adjusted accordingly.</para> | ||
1551 | </entry> | ||
1552 | </row></tbody></tgroup></informaltable> | ||
1553 | <para>SYNOPSIS | ||
1554 | </para> | ||
1555 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1556 | align="char"> | ||
1557 | <para> int ioctl(fd, int request = VIDEO_SET_FORMAT, | ||
1558 | video_format_t format);</para> | ||
1559 | </entry> | ||
1560 | </row></tbody></tgroup></informaltable> | ||
1561 | <para>PARAMETERS | ||
1562 | </para> | ||
1563 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1564 | align="char"> | ||
1565 | <para>int fd</para> | ||
1566 | </entry><entry | ||
1567 | align="char"> | ||
1568 | <para>File descriptor returned by a previous call to open().</para> | ||
1569 | </entry> | ||
1570 | </row><row><entry | ||
1571 | align="char"> | ||
1572 | <para>int request</para> | ||
1573 | </entry><entry | ||
1574 | align="char"> | ||
1575 | <para>Equals VIDEO_SET_FORMAT for this command.</para> | ||
1576 | </entry> | ||
1577 | </row><row><entry | ||
1578 | align="char"> | ||
1579 | <para>video_format_t | ||
1580 | format</para> | ||
1581 | </entry><entry | ||
1582 | align="char"> | ||
1583 | <para>video format of TV as defined in section ??.</para> | ||
1584 | </entry> | ||
1585 | </row></tbody></tgroup></informaltable> | ||
1586 | <para>ERRORS | ||
1587 | </para> | ||
1588 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1589 | align="char"> | ||
1590 | <para>EBADF</para> | ||
1591 | </entry><entry | ||
1592 | align="char"> | ||
1593 | <para>fd is not a valid open file descriptor</para> | ||
1594 | </entry> | ||
1595 | </row><row><entry | ||
1596 | align="char"> | ||
1597 | <para>EINVAL</para> | ||
1598 | </entry><entry | ||
1599 | align="char"> | ||
1600 | <para>format is not a valid video format.</para> | ||
1601 | </entry> | ||
1602 | </row></tbody></tgroup></informaltable> | ||
1603 | |||
1604 | </section><section | ||
1605 | role="subsection"><title>VIDEO_SET_SYSTEM</title> | ||
1606 | <para>DESCRIPTION | ||
1607 | </para> | ||
1608 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1609 | align="char"> | ||
1610 | <para>This ioctl sets the television output format. The format (see section ??) may | ||
1611 | vary from the color format of the displayed MPEG stream. If the hardware is | ||
1612 | not able to display the requested format the call will return an error.</para> | ||
1613 | </entry> | ||
1614 | </row></tbody></tgroup></informaltable> | ||
1615 | <para>SYNOPSIS | ||
1616 | </para> | ||
1617 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1618 | align="char"> | ||
1619 | <para> int ioctl(fd, int request = VIDEO_SET_SYSTEM , | ||
1620 | video_system_t system);</para> | ||
1621 | </entry> | ||
1622 | </row></tbody></tgroup></informaltable> | ||
1623 | <para>PARAMETERS | ||
1624 | </para> | ||
1625 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1626 | align="char"> | ||
1627 | <para>int fd</para> | ||
1628 | </entry><entry | ||
1629 | align="char"> | ||
1630 | <para>File descriptor returned by a previous call to open().</para> | ||
1631 | </entry> | ||
1632 | </row><row><entry | ||
1633 | align="char"> | ||
1634 | <para>int request</para> | ||
1635 | </entry><entry | ||
1636 | align="char"> | ||
1637 | <para>Equals VIDEO_SET_FORMAT for this command.</para> | ||
1638 | </entry> | ||
1639 | </row><row><entry | ||
1640 | align="char"> | ||
1641 | <para>video_system_t | ||
1642 | system</para> | ||
1643 | </entry><entry | ||
1644 | align="char"> | ||
1645 | <para>video system of TV output.</para> | ||
1646 | </entry> | ||
1647 | </row></tbody></tgroup></informaltable> | ||
1648 | <para>ERRORS | ||
1649 | </para> | ||
1650 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1651 | align="char"> | ||
1652 | <para>EBADF</para> | ||
1653 | </entry><entry | ||
1654 | align="char"> | ||
1655 | <para>fd is not a valid open file descriptor</para> | ||
1656 | </entry> | ||
1657 | </row><row><entry | ||
1658 | align="char"> | ||
1659 | <para>EINVAL</para> | ||
1660 | </entry><entry | ||
1661 | align="char"> | ||
1662 | <para>system is not a valid or supported video system.</para> | ||
1663 | </entry> | ||
1664 | </row></tbody></tgroup></informaltable> | ||
1665 | |||
1666 | </section><section | ||
1667 | role="subsection"><title>VIDEO_SET_HIGHLIGHT</title> | ||
1668 | <para>DESCRIPTION | ||
1669 | </para> | ||
1670 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1671 | align="char"> | ||
1672 | <para>This ioctl sets the SPU highlight information for the menu access of a DVD.</para> | ||
1673 | </entry> | ||
1674 | </row></tbody></tgroup></informaltable> | ||
1675 | <para>SYNOPSIS | ||
1676 | </para> | ||
1677 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1678 | align="char"> | ||
1679 | <para> int ioctl(fd, int request = VIDEO_SET_HIGHLIGHT | ||
1680 | ,video_highlight_t ⋆vhilite)</para> | ||
1681 | </entry> | ||
1682 | </row></tbody></tgroup></informaltable> | ||
1683 | <para>PARAMETERS | ||
1684 | </para> | ||
1685 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1686 | align="char"> | ||
1687 | <para>int fd</para> | ||
1688 | </entry><entry | ||
1689 | align="char"> | ||
1690 | <para>File descriptor returned by a previous call to open().</para> | ||
1691 | </entry> | ||
1692 | </row><row><entry | ||
1693 | align="char"> | ||
1694 | <para>int request</para> | ||
1695 | </entry><entry | ||
1696 | align="char"> | ||
1697 | <para>Equals VIDEO_SET_HIGHLIGHT for this command.</para> | ||
1698 | </entry> | ||
1699 | </row><row><entry | ||
1700 | align="char"> | ||
1701 | <para>video_highlight_t | ||
1702 | *vhilite</para> | ||
1703 | </entry><entry | ||
1704 | align="char"> | ||
1705 | <para>SPU Highlight information according to section ??.</para> | ||
1706 | </entry> | ||
1707 | </row></tbody></tgroup></informaltable> | ||
1708 | <para>ERRORS | ||
1709 | </para> | ||
1710 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1711 | align="char"> | ||
1712 | <para>EBADF</para> | ||
1713 | </entry><entry | ||
1714 | align="char"> | ||
1715 | <para>fd is not a valid open file descriptor.</para> | ||
1716 | </entry> | ||
1717 | </row><row><entry | ||
1718 | align="char"> | ||
1719 | <para>EINVAL</para> | ||
1720 | </entry><entry | ||
1721 | align="char"> | ||
1722 | <para>input is not a valid highlight setting.</para> | ||
1723 | </entry> | ||
1724 | </row></tbody></tgroup></informaltable> | ||
1725 | |||
1726 | </section><section | ||
1727 | role="subsection"><title>VIDEO_SET_SPU</title> | ||
1728 | <para>DESCRIPTION | ||
1729 | </para> | ||
1730 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1731 | align="char"> | ||
1732 | <para>This ioctl activates or deactivates SPU decoding in a DVD input stream. It can | ||
1733 | only be used, if the driver is able to handle a DVD stream.</para> | ||
1734 | </entry> | ||
1735 | </row></tbody></tgroup></informaltable> | ||
1736 | <para>SYNOPSIS | ||
1737 | </para> | ||
1738 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1739 | align="char"> | ||
1740 | <para> int ioctl(fd, int request = VIDEO_SET_SPU , | ||
1741 | video_spu_t ⋆spu)</para> | ||
1742 | </entry> | ||
1743 | </row></tbody></tgroup></informaltable> | ||
1744 | <para>PARAMETERS | ||
1745 | </para> | ||
1746 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1747 | align="char"> | ||
1748 | <para>int fd</para> | ||
1749 | </entry><entry | ||
1750 | align="char"> | ||
1751 | <para>File descriptor returned by a previous call to open().</para> | ||
1752 | </entry> | ||
1753 | </row><row><entry | ||
1754 | align="char"> | ||
1755 | <para>int request</para> | ||
1756 | </entry><entry | ||
1757 | align="char"> | ||
1758 | <para>Equals VIDEO_SET_SPU for this command.</para> | ||
1759 | </entry> | ||
1760 | </row><row><entry | ||
1761 | align="char"> | ||
1762 | <para>video_spu_t *spu</para> | ||
1763 | </entry><entry | ||
1764 | align="char"> | ||
1765 | <para>SPU decoding (de)activation and subid setting according | ||
1766 | to section ??.</para> | ||
1767 | </entry> | ||
1768 | </row></tbody></tgroup></informaltable> | ||
1769 | <para>ERRORS | ||
1770 | </para> | ||
1771 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1772 | align="char"> | ||
1773 | <para>EBADF</para> | ||
1774 | </entry><entry | ||
1775 | align="char"> | ||
1776 | <para>fd is not a valid open file descriptor</para> | ||
1777 | </entry> | ||
1778 | </row><row><entry | ||
1779 | align="char"> | ||
1780 | <para>EINVAL</para> | ||
1781 | </entry><entry | ||
1782 | align="char"> | ||
1783 | <para>input is not a valid spu setting or driver cannot handle | ||
1784 | SPU.</para> | ||
1785 | </entry> | ||
1786 | </row></tbody></tgroup></informaltable> | ||
1787 | |||
1788 | </section><section | ||
1789 | role="subsection"><title>VIDEO_SET_SPU_PALETTE</title> | ||
1790 | <para>DESCRIPTION | ||
1791 | </para> | ||
1792 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1793 | align="char"> | ||
1794 | <para>This ioctl sets the SPU color palette.</para> | ||
1795 | </entry> | ||
1796 | </row></tbody></tgroup></informaltable> | ||
1797 | <para>SYNOPSIS | ||
1798 | </para> | ||
1799 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1800 | align="char"> | ||
1801 | <para> int ioctl(fd, int request = VIDEO_SET_SPU_PALETTE | ||
1802 | ,video_spu_palette_t ⋆palette )</para> | ||
1803 | </entry> | ||
1804 | </row></tbody></tgroup></informaltable> | ||
1805 | <para>PARAMETERS | ||
1806 | </para> | ||
1807 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1808 | align="char"> | ||
1809 | <para>int fd</para> | ||
1810 | </entry><entry | ||
1811 | align="char"> | ||
1812 | <para>File descriptor returned by a previous call to open().</para> | ||
1813 | </entry> | ||
1814 | </row><row><entry | ||
1815 | align="char"> | ||
1816 | <para>int request</para> | ||
1817 | </entry><entry | ||
1818 | align="char"> | ||
1819 | <para>Equals VIDEO_SET_SPU_PALETTE for this command.</para> | ||
1820 | </entry> | ||
1821 | </row><row><entry | ||
1822 | align="char"> | ||
1823 | <para>video_spu_palette_t | ||
1824 | *palette</para> | ||
1825 | </entry><entry | ||
1826 | align="char"> | ||
1827 | <para>SPU palette according to section ??.</para> | ||
1828 | </entry> | ||
1829 | </row></tbody></tgroup></informaltable> | ||
1830 | <para>ERRORS | ||
1831 | </para> | ||
1832 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1833 | align="char"> | ||
1834 | <para>EBADF</para> | ||
1835 | </entry><entry | ||
1836 | align="char"> | ||
1837 | <para>fd is not a valid open file descriptor</para> | ||
1838 | </entry> | ||
1839 | </row><row><entry | ||
1840 | align="char"> | ||
1841 | <para>EINVAL</para> | ||
1842 | </entry><entry | ||
1843 | align="char"> | ||
1844 | <para>input is not a valid palette or driver doesn’t handle SPU.</para> | ||
1845 | </entry> | ||
1846 | </row></tbody></tgroup></informaltable> | ||
1847 | |||
1848 | </section><section | ||
1849 | role="subsection"><title>VIDEO_GET_NAVI</title> | ||
1850 | <para>DESCRIPTION | ||
1851 | </para> | ||
1852 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1853 | align="char"> | ||
1854 | <para>This ioctl returns navigational information from the DVD stream. This is | ||
1855 | especially needed if an encoded stream has to be decoded by the hardware.</para> | ||
1856 | </entry> | ||
1857 | </row></tbody></tgroup></informaltable> | ||
1858 | <para>SYNOPSIS | ||
1859 | </para> | ||
1860 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1861 | align="char"> | ||
1862 | <para> int ioctl(fd, int request = VIDEO_GET_NAVI , | ||
1863 | video_navi_pack_t ⋆navipack)</para> | ||
1864 | </entry> | ||
1865 | </row></tbody></tgroup></informaltable> | ||
1866 | <para>PARAMETERS | ||
1867 | </para> | ||
1868 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1869 | align="char"> | ||
1870 | <para>int fd</para> | ||
1871 | </entry><entry | ||
1872 | align="char"> | ||
1873 | <para>File descriptor returned by a previous call to open().</para> | ||
1874 | </entry> | ||
1875 | </row><row><entry | ||
1876 | align="char"> | ||
1877 | <para>int request</para> | ||
1878 | </entry><entry | ||
1879 | align="char"> | ||
1880 | <para>Equals VIDEO_GET_NAVI for this command.</para> | ||
1881 | </entry> | ||
1882 | </row><row><entry | ||
1883 | align="char"> | ||
1884 | <para>video_navi_pack_t | ||
1885 | *navipack</para> | ||
1886 | </entry><entry | ||
1887 | align="char"> | ||
1888 | <para>PCI or DSI pack (private stream 2) according to section | ||
1889 | ??.</para> | ||
1890 | </entry> | ||
1891 | </row></tbody></tgroup></informaltable> | ||
1892 | <para>ERRORS | ||
1893 | </para> | ||
1894 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1895 | align="char"> | ||
1896 | <para>EBADF</para> | ||
1897 | </entry><entry | ||
1898 | align="char"> | ||
1899 | <para>fd is not a valid open file descriptor</para> | ||
1900 | </entry> | ||
1901 | </row><row><entry | ||
1902 | align="char"> | ||
1903 | <para>EFAULT</para> | ||
1904 | </entry><entry | ||
1905 | align="char"> | ||
1906 | <para>driver is not able to return navigational information</para> | ||
1907 | </entry> | ||
1908 | </row></tbody></tgroup></informaltable> | ||
1909 | |||
1910 | </section><section | ||
1911 | role="subsection"><title>VIDEO_SET_ATTRIBUTES</title> | ||
1912 | <para>DESCRIPTION | ||
1913 | </para> | ||
1914 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1915 | align="char"> | ||
1916 | <para>This ioctl is intended for DVD playback and allows you to set certain | ||
1917 | information about the stream. Some hardware may not need this information, | ||
1918 | but the call also tells the hardware to prepare for DVD playback.</para> | ||
1919 | </entry> | ||
1920 | </row></tbody></tgroup></informaltable> | ||
1921 | <para>SYNOPSIS | ||
1922 | </para> | ||
1923 | <informaltable><tgroup cols="1"><tbody><row><entry | ||
1924 | align="char"> | ||
1925 | <para> int ioctl(fd, int request = VIDEO_SET_ATTRIBUTE | ||
1926 | ,video_attributes_t vattr)</para> | ||
1927 | </entry> | ||
1928 | </row></tbody></tgroup></informaltable> | ||
1929 | <para>PARAMETERS | ||
1930 | </para> | ||
1931 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1932 | align="char"> | ||
1933 | <para>int fd</para> | ||
1934 | </entry><entry | ||
1935 | align="char"> | ||
1936 | <para>File descriptor returned by a previous call to open().</para> | ||
1937 | </entry> | ||
1938 | </row><row><entry | ||
1939 | align="char"> | ||
1940 | <para>int request</para> | ||
1941 | </entry><entry | ||
1942 | align="char"> | ||
1943 | <para>Equals VIDEO_SET_ATTRIBUTE for this command.</para> | ||
1944 | </entry> | ||
1945 | </row><row><entry | ||
1946 | align="char"> | ||
1947 | <para>video_attributes_t | ||
1948 | vattr</para> | ||
1949 | </entry><entry | ||
1950 | align="char"> | ||
1951 | <para>video attributes according to section ??.</para> | ||
1952 | </entry> | ||
1953 | </row></tbody></tgroup></informaltable> | ||
1954 | <para>ERRORS | ||
1955 | </para> | ||
1956 | <informaltable><tgroup cols="2"><tbody><row><entry | ||
1957 | align="char"> | ||
1958 | <para>EBADF</para> | ||
1959 | </entry><entry | ||
1960 | align="char"> | ||
1961 | <para>fd is not a valid open file descriptor</para> | ||
1962 | </entry> | ||
1963 | </row><row><entry | ||
1964 | align="char"> | ||
1965 | <para>EINVAL</para> | ||
1966 | </entry><entry | ||
1967 | align="char"> | ||
1968 | <para>input is not a valid attribute setting.</para> | ||
1969 | </entry> | ||
1970 | </row></tbody></tgroup></informaltable> | ||
1971 | </section></section> | ||