mm-only debug patch...
[mmotm.git] / Documentation / DocBook / dvb / kdapi.xml
blob6c67481eaa4b8f20292d5ab9d2cdcdc4398d9f3f
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>
10 <section id="kernel_demux_data_types">
11 <title>Kernel Demux Data Types</title>
14 <section id="dmx_success_t">
15 <title>dmx_success_t</title>
16  <programlisting>
17  typedef enum {
18    DMX_OK = 0, /&#x22C6; Received Ok &#x22C6;/
19    DMX_LENGTH_ERROR, /&#x22C6; Incorrect length &#x22C6;/
20    DMX_OVERRUN_ERROR, /&#x22C6; Receiver ring buffer overrun &#x22C6;/
21    DMX_CRC_ERROR, /&#x22C6; Incorrect CRC &#x22C6;/
22    DMX_FRAME_ERROR, /&#x22C6; Frame alignment error &#x22C6;/
23    DMX_FIFO_ERROR, /&#x22C6; Receiver FIFO overrun &#x22C6;/
24    DMX_MISSED_ERROR /&#x22C6; Receiver missed packet &#x22C6;/
25  } dmx_success_t;
26 </programlisting>
28 </section>
29 <section id="ts_filter_types">
30 <title>TS filter types</title>
31  <programlisting>
32  /&#x22C6;--------------------------------------------------------------------------&#x22C6;/
33  /&#x22C6; TS packet reception &#x22C6;/
34  /&#x22C6;--------------------------------------------------------------------------&#x22C6;/
36  /&#x22C6; TS filter type for set_type() &#x22C6;/
38  #define TS_PACKET       1   /&#x22C6; send TS packets (188 bytes) to callback (default) &#x22C6;/
39  #define TS_PAYLOAD_ONLY 2   /&#x22C6; in case TS_PACKET is set, only send the TS
40                                 payload (&#x003C;=184 bytes per packet) to callback &#x22C6;/
41  #define TS_DECODER      4   /&#x22C6; send stream to built-in decoder (if present) &#x22C6;/
42 </programlisting>
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,   /&#x22C6; also send packets to audio decoder (if it exists) &#x22C6;/
53          DMX_TS_PES_VIDEO,   /&#x22C6; ... &#x22C6;/
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; /&#x22C6; Set to non-zero when filtering in progress &#x22C6;/
66          struct dmx_demux_s&#x22C6; parent; /&#x22C6; Back-pointer &#x22C6;/
67          void&#x22C6; priv; /&#x22C6; Pointer to private data of the API client &#x22C6;/
68          int (&#x22C6;set) (struct dmx_ts_feed_s&#x22C6; feed,
69                      __u16 pid,
70                      size_t callback_length,
71                      size_t circular_buffer_size,
72                      int descramble,
73                      struct timespec timeout);
74          int (&#x22C6;start_filtering) (struct dmx_ts_feed_s&#x22C6; feed);
75          int (&#x22C6;stop_filtering) (struct dmx_ts_feed_s&#x22C6; feed);
76          int (&#x22C6;set_type) (struct dmx_ts_feed_s&#x22C6; feed,
77                           int type,
78                           dmx_ts_pes_t pes_type);
79  };
81  typedef struct dmx_ts_feed_s dmx_ts_feed_t;
82 </programlisting>
83  <programlisting>
84  /&#x22C6;--------------------------------------------------------------------------&#x22C6;/
85  /&#x22C6; PES packet reception (not supported yet) &#x22C6;/
86  /&#x22C6;--------------------------------------------------------------------------&#x22C6;/
88  typedef struct dmx_pes_filter_s {
89          struct dmx_pes_s&#x22C6; parent; /&#x22C6; Back-pointer &#x22C6;/
90          void&#x22C6; priv; /&#x22C6; Pointer to private data of the API client &#x22C6;/
91  } dmx_pes_filter_t;
92 </programlisting>
93  <programlisting>
94  typedef struct dmx_pes_feed_s {
95          int is_filtering; /&#x22C6; Set to non-zero when filtering in progress &#x22C6;/
96          struct dmx_demux_s&#x22C6; parent; /&#x22C6; Back-pointer &#x22C6;/
97          void&#x22C6; priv; /&#x22C6; Pointer to private data of the API client &#x22C6;/
98          int (&#x22C6;set) (struct dmx_pes_feed_s&#x22C6; feed,
99                      __u16 pid,
100                      size_t circular_buffer_size,
101                      int descramble,
102                      struct timespec timeout);
103          int (&#x22C6;start_filtering) (struct dmx_pes_feed_s&#x22C6; feed);
104          int (&#x22C6;stop_filtering) (struct dmx_pes_feed_s&#x22C6; feed);
105          int (&#x22C6;allocate_filter) (struct dmx_pes_feed_s&#x22C6; feed,
106                                  dmx_pes_filter_t&#x22C6;&#x22C6; filter);
107          int (&#x22C6;release_filter) (struct dmx_pes_feed_s&#x22C6; feed,
108                                 dmx_pes_filter_t&#x22C6; 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&#x22C6; parent; /&#x22C6; Back-pointer &#x22C6;/
116          void&#x22C6; priv; /&#x22C6; Pointer to private data of the API client &#x22C6;/
117  } dmx_section_filter_t;
118 </programlisting>
119  <programlisting>
120  struct dmx_section_feed_s {
121          int is_filtering; /&#x22C6; Set to non-zero when filtering in progress &#x22C6;/
122          struct dmx_demux_s&#x22C6; parent; /&#x22C6; Back-pointer &#x22C6;/
123          void&#x22C6; priv; /&#x22C6; Pointer to private data of the API client &#x22C6;/
124          int (&#x22C6;set) (struct dmx_section_feed_s&#x22C6; feed,
125                      __u16 pid,
126                      size_t circular_buffer_size,
127                      int descramble,
128                      int check_crc);
129          int (&#x22C6;allocate_filter) (struct dmx_section_feed_s&#x22C6; feed,
130                                  dmx_section_filter_t&#x22C6;&#x22C6; filter);
131          int (&#x22C6;release_filter) (struct dmx_section_feed_s&#x22C6; feed,
132                                 dmx_section_filter_t&#x22C6; filter);
133          int (&#x22C6;start_filtering) (struct dmx_section_feed_s&#x22C6; feed);
134          int (&#x22C6;stop_filtering) (struct dmx_section_feed_s&#x22C6; feed);
135  };
136  typedef struct dmx_section_feed_s dmx_section_feed_t;
138  /&#x22C6;--------------------------------------------------------------------------&#x22C6;/
139  /&#x22C6; Callback functions &#x22C6;/
140  /&#x22C6;--------------------------------------------------------------------------&#x22C6;/
142  typedef int (&#x22C6;dmx_ts_cb) ( __u8 &#x22C6; buffer1,
143                             size_t buffer1_length,
144                             __u8 &#x22C6; buffer2,
145                             size_t buffer2_length,
146                             dmx_ts_feed_t&#x22C6; source,
147                             dmx_success_t success);
149  typedef int (&#x22C6;dmx_section_cb) ( __u8 &#x22C6; buffer1,
150                                  size_t buffer1_len,
151                                  __u8 &#x22C6; buffer2,
152                                  size_t buffer2_len,
153                                  dmx_section_filter_t &#x22C6; source,
154                                  dmx_success_t success);
156  typedef int (&#x22C6;dmx_pes_cb) ( __u8 &#x22C6; buffer1,
157                              size_t buffer1_len,
158                              __u8 &#x22C6; buffer2,
159                              size_t buffer2_len,
160                              dmx_pes_filter_t&#x22C6; source,
161                              dmx_success_t success);
163  /&#x22C6;--------------------------------------------------------------------------&#x22C6;/
164  /&#x22C6; DVB Front-End &#x22C6;/
165  /&#x22C6;--------------------------------------------------------------------------&#x22C6;/
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, /&#x22C6; DVB-ASI interface &#x22C6;/
174          DMX_MEMORY_FE
175  } dmx_frontend_source_t;
177  typedef struct {
178          /&#x22C6; The following char&#x22C6; fields point to NULL terminated strings &#x22C6;/
179          char&#x22C6; id;                    /&#x22C6; Unique front-end identifier &#x22C6;/
180          char&#x22C6; vendor;                /&#x22C6; Name of the front-end vendor &#x22C6;/
181          char&#x22C6; model;                 /&#x22C6; Name of the front-end model &#x22C6;/
182          struct list_head connectivity_list; /&#x22C6; List of front-ends that can
183                                                 be connected to a particular
184                                                 demux &#x22C6;/
185          void&#x22C6; priv;     /&#x22C6; Pointer to private data of the API client &#x22C6;/
186          dmx_frontend_source_t source;
187  } dmx_frontend_t;
189  /&#x22C6;--------------------------------------------------------------------------&#x22C6;/
190  /&#x22C6; MPEG-2 TS Demux &#x22C6;/
191  /&#x22C6;--------------------------------------------------------------------------&#x22C6;/
193  /&#x22C6;
194   &#x22C6; Flags OR'ed in the capabilites field of struct dmx_demux_s.
195   &#x22C6;/
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    /&#x22C6; write() available &#x22C6;/
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>
207 </section>
208 <section id="demux_demux_t">
209 <title>demux_demux_t</title>
210  <programlisting>
211  /&#x22C6;
212   &#x22C6; DMX_FE_ENTRY(): Casts elements in the list of registered
213   &#x22C6; front-ends from the generic type struct list_head
214   &#x22C6; to the type &#x22C6; dmx_frontend_t
215   &#x22C6;.
216  &#x22C6;/
218  #define DMX_FE_ENTRY(list) list_entry(list, dmx_frontend_t, connectivity_list)
220  struct dmx_demux_s {
221          /&#x22C6; The following char&#x22C6; fields point to NULL terminated strings &#x22C6;/
222          char&#x22C6; id;                    /&#x22C6; Unique demux identifier &#x22C6;/
223          char&#x22C6; vendor;                /&#x22C6; Name of the demux vendor &#x22C6;/
224          char&#x22C6; model;                 /&#x22C6; Name of the demux model &#x22C6;/
225          __u32 capabilities;          /&#x22C6; Bitfield of capability flags &#x22C6;/
226          dmx_frontend_t&#x22C6; frontend;    /&#x22C6; Front-end connected to the demux &#x22C6;/
227          struct list_head reg_list;   /&#x22C6; List of registered demuxes &#x22C6;/
228          void&#x22C6; priv;                  /&#x22C6; Pointer to private data of the API client &#x22C6;/
229          int users;                   /&#x22C6; Number of users &#x22C6;/
230          int (&#x22C6;open) (struct dmx_demux_s&#x22C6; demux);
231          int (&#x22C6;close) (struct dmx_demux_s&#x22C6; demux);
232          int (&#x22C6;write) (struct dmx_demux_s&#x22C6; demux, const char&#x22C6; buf, size_t count);
233          int (&#x22C6;allocate_ts_feed) (struct dmx_demux_s&#x22C6; demux,
234                                   dmx_ts_feed_t&#x22C6;&#x22C6; feed,
235                                   dmx_ts_cb callback);
236          int (&#x22C6;release_ts_feed) (struct dmx_demux_s&#x22C6; demux,
237                                  dmx_ts_feed_t&#x22C6; feed);
238          int (&#x22C6;allocate_pes_feed) (struct dmx_demux_s&#x22C6; demux,
239                                    dmx_pes_feed_t&#x22C6;&#x22C6; feed,
240                                    dmx_pes_cb callback);
241          int (&#x22C6;release_pes_feed) (struct dmx_demux_s&#x22C6; demux,
242                                   dmx_pes_feed_t&#x22C6; feed);
243          int (&#x22C6;allocate_section_feed) (struct dmx_demux_s&#x22C6; demux,
244                                        dmx_section_feed_t&#x22C6;&#x22C6; feed,
245                                        dmx_section_cb callback);
246          int (&#x22C6;release_section_feed) (struct dmx_demux_s&#x22C6; demux,
247                                       dmx_section_feed_t&#x22C6; feed);
248          int (&#x22C6;descramble_mac_address) (struct dmx_demux_s&#x22C6; demux,
249                                         __u8&#x22C6; buffer1,
250                                         size_t buffer1_length,
251                                         __u8&#x22C6; buffer2,
252                                         size_t buffer2_length,
253                                         __u16 pid);
254          int (&#x22C6;descramble_section_payload) (struct dmx_demux_s&#x22C6; demux,
255                                             __u8&#x22C6; buffer1,
256                                             size_t buffer1_length,
257                                             __u8&#x22C6; buffer2, size_t buffer2_length,
258                                             __u16 pid);
259          int (&#x22C6;add_frontend) (struct dmx_demux_s&#x22C6; demux,
260                               dmx_frontend_t&#x22C6; frontend);
261          int (&#x22C6;remove_frontend) (struct dmx_demux_s&#x22C6; demux,
262                                  dmx_frontend_t&#x22C6; frontend);
263          struct list_head&#x22C6; (&#x22C6;get_frontends) (struct dmx_demux_s&#x22C6; demux);
264          int (&#x22C6;connect_frontend) (struct dmx_demux_s&#x22C6; demux,
265                                   dmx_frontend_t&#x22C6; frontend);
266          int (&#x22C6;disconnect_frontend) (struct dmx_demux_s&#x22C6; demux);
269          /&#x22C6; added because js cannot keep track of these himself &#x22C6;/
270          int (&#x22C6;get_pes_pids) (struct dmx_demux_s&#x22C6; demux, __u16 &#x22C6;pids);
271  };
272  typedef struct dmx_demux_s dmx_demux_t;
273 </programlisting>
275 </section>
276 <section id="demux_directory">
277 <title>Demux directory</title>
278  <programlisting>
279  /&#x22C6;
280   &#x22C6; DMX_DIR_ENTRY(): Casts elements in the list of registered
281   &#x22C6; demuxes from the generic type struct list_head&#x22C6; to the type dmx_demux_t
282   &#x22C6;.
283   &#x22C6;/
285  #define DMX_DIR_ENTRY(list) list_entry(list, dmx_demux_t, reg_list)
287  int dmx_register_demux (dmx_demux_t&#x22C6; demux);
288  int dmx_unregister_demux (dmx_demux_t&#x22C6; demux);
289  struct list_head&#x22C6; 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>
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 &#x22C6;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>
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 &#x22C6;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>
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 &#x22C6;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 &#8220;function not available&#8221;.
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>
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&#x22C6; 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>
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&#x22C6; 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>
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&#x22C6; demux, const char&#x22C6; 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>
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&#x22C6; demux,
694  dmx_ts_feed_t&#x22C6;&#x22C6; 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>
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&#x22C6; demux,
770  dmx_ts_feed_t&#x22C6; 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>
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&#x22C6; demux,
828  dmx_section_feed_t &#x22C6;&#x22C6;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>
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&#x22C6; demux,
906  dmx_section_feed_t &#x22C6;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>
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&#x22C6; demux, __u8
962  &#x22C6;buffer1, size_t buffer1_length, __u8 &#x22C6;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>
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 &#8220;plug-in&#8221; 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&#x22C6; demux,
1075  __u8 &#x22C6;buffer1, size_t buffer1_length, __u8 &#x22C6;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>
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 &#x22C6;demux, dmx_frontend_t
1176  &#x22C6;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>
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&#x22C6; demux,
1258  dmx_frontend_t&#x22C6; 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>
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&#x22C6; get_frontends(dmx_demux_t&#x22C6; 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>
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&#x22C6; demux,
1376  dmx_frontend_t&#x22C6; 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>
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&#x22C6; 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 &#8220;bottom half&#8221; mechanism or start a tasklet instead of making the callback
1485 function call directly from a hardware interrupt.
1486 </para>
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 &#8221;wrapped&#8221; 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&#8212;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&#x22C6; buffer1, size_t buffer1_length,
1559  __u8&#x22C6; buffer2, size_t buffer2_length, dmx_ts_feed_t&#x22C6;
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>
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&#x22C6; buffer1, size_t
1659  buffer1_length, __u8&#x22C6; buffer2, size_t
1660  buffer2_length, dmx_section_filter_t&#x22C6; 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>
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&#x22C6; 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>
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&#x22C6; 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>
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&#x22C6; 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>
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&#x22C6; 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>
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 &#8211; 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&#x22C6; feed,
2101  dmx_section_filter_t&#x22C6;&#x22C6; 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>
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&#x22C6; feed,
2165  dmx_section_filter_t&#x22C6; 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>
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&#x22C6; 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>
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&#x22C6; 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>
2309 </section>