Back to home page

OSCL-LXR

 
 

    


0001 /*
0002  * demux.h
0003  *
0004  * The Kernel Digital TV Demux kABI defines a driver-internal interface for
0005  * registering low-level, hardware specific driver to a hardware independent
0006  * demux layer.
0007  *
0008  * Copyright (c) 2002 Convergence GmbH
0009  *
0010  * based on code:
0011  * Copyright (c) 2000 Nokia Research Center
0012  *                    Tampere, FINLAND
0013  *
0014  * This program is free software; you can redistribute it and/or
0015  * modify it under the terms of the GNU Lesser General Public License
0016  * as published by the Free Software Foundation; either version 2.1
0017  * of the License, or (at your option) any later version.
0018  *
0019  * This program is distributed in the hope that it will be useful,
0020  * but WITHOUT ANY WARRANTY; without even the implied warranty of
0021  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
0022  * GNU General Public License for more details.
0023  *
0024  */
0025 
0026 #ifndef __DEMUX_H
0027 #define __DEMUX_H
0028 
0029 #include <linux/types.h>
0030 #include <linux/errno.h>
0031 #include <linux/list.h>
0032 #include <linux/time.h>
0033 #include <linux/dvb/dmx.h>
0034 
0035 /*
0036  * Common definitions
0037  */
0038 
0039 /*
0040  * DMX_MAX_FILTER_SIZE: Maximum length (in bytes) of a section/PES filter.
0041  */
0042 
0043 #ifndef DMX_MAX_FILTER_SIZE
0044 #define DMX_MAX_FILTER_SIZE 18
0045 #endif
0046 
0047 /*
0048  * DMX_MAX_SECFEED_SIZE: Maximum length (in bytes) of a private section feed
0049  * filter.
0050  */
0051 
0052 #ifndef DMX_MAX_SECTION_SIZE
0053 #define DMX_MAX_SECTION_SIZE 4096
0054 #endif
0055 #ifndef DMX_MAX_SECFEED_SIZE
0056 #define DMX_MAX_SECFEED_SIZE (DMX_MAX_SECTION_SIZE + 188)
0057 #endif
0058 
0059 /*
0060  * TS packet reception
0061  */
0062 
0063 /**
0064  * enum ts_filter_type - filter type bitmap for dmx_ts_feed.set\(\)
0065  *
0066  * @TS_PACKET:      Send TS packets (188 bytes) to callback (default).
0067  * @TS_PAYLOAD_ONLY:    In case TS_PACKET is set, only send the TS payload
0068  *          (<=184 bytes per packet) to callback
0069  * @TS_DECODER:     Send stream to built-in decoder (if present).
0070  * @TS_DEMUX:       In case TS_PACKET is set, send the TS to the demux
0071  *          device, not to the dvr device
0072  */
0073 enum ts_filter_type {
0074     TS_PACKET = 1,
0075     TS_PAYLOAD_ONLY = 2,
0076     TS_DECODER = 4,
0077     TS_DEMUX = 8,
0078 };
0079 
0080 /**
0081  * struct dmx_ts_feed - Structure that contains a TS feed filter
0082  *
0083  * @is_filtering:   Set to non-zero when filtering in progress
0084  * @parent:     pointer to struct dmx_demux
0085  * @priv:       pointer to private data of the API client
0086  * @set:        sets the TS filter
0087  * @start_filtering:    starts TS filtering
0088  * @stop_filtering: stops TS filtering
0089  *
0090  * A TS feed is typically mapped to a hardware PID filter on the demux chip.
0091  * Using this API, the client can set the filtering properties to start/stop
0092  * filtering TS packets on a particular TS feed.
0093  */
0094 struct dmx_ts_feed {
0095     int is_filtering;
0096     struct dmx_demux *parent;
0097     void *priv;
0098     int (*set)(struct dmx_ts_feed *feed,
0099            u16 pid,
0100            int type,
0101            enum dmx_ts_pes pes_type,
0102            ktime_t timeout);
0103     int (*start_filtering)(struct dmx_ts_feed *feed);
0104     int (*stop_filtering)(struct dmx_ts_feed *feed);
0105 };
0106 
0107 /*
0108  * Section reception
0109  */
0110 
0111 /**
0112  * struct dmx_section_filter - Structure that describes a section filter
0113  *
0114  * @filter_value: Contains up to 16 bytes (128 bits) of the TS section header
0115  *        that will be matched by the section filter
0116  * @filter_mask:  Contains a 16 bytes (128 bits) filter mask with the bits
0117  *        specified by @filter_value that will be used on the filter
0118  *        match logic.
0119  * @filter_mode:  Contains a 16 bytes (128 bits) filter mode.
0120  * @parent:   Back-pointer to struct dmx_section_feed.
0121  * @priv:     Pointer to private data of the API client.
0122  *
0123  *
0124  * The @filter_mask controls which bits of @filter_value are compared with
0125  * the section headers/payload. On a binary value of 1 in filter_mask, the
0126  * corresponding bits are compared. The filter only accepts sections that are
0127  * equal to filter_value in all the tested bit positions.
0128  */
0129 struct dmx_section_filter {
0130     u8 filter_value[DMX_MAX_FILTER_SIZE];
0131     u8 filter_mask[DMX_MAX_FILTER_SIZE];
0132     u8 filter_mode[DMX_MAX_FILTER_SIZE];
0133     struct dmx_section_feed *parent;
0134 
0135     void *priv;
0136 };
0137 
0138 /**
0139  * struct dmx_section_feed - Structure that contains a section feed filter
0140  *
0141  * @is_filtering:   Set to non-zero when filtering in progress
0142  * @parent:     pointer to struct dmx_demux
0143  * @priv:       pointer to private data of the API client
0144  * @check_crc:      If non-zero, check the CRC values of filtered sections.
0145  * @set:        sets the section filter
0146  * @allocate_filter:    This function is used to allocate a section filter on
0147  *          the demux. It should only be called when no filtering
0148  *          is in progress on this section feed. If a filter cannot
0149  *          be allocated, the function fails with -ENOSPC.
0150  * @release_filter: This function releases all the resources of a
0151  *          previously allocated section filter. The function
0152  *          should not be called while filtering is in progress
0153  *          on this section feed. After calling this function,
0154  *          the caller should not try to dereference the filter
0155  *          pointer.
0156  * @start_filtering:    starts section filtering
0157  * @stop_filtering: stops section filtering
0158  *
0159  * A TS feed is typically mapped to a hardware PID filter on the demux chip.
0160  * Using this API, the client can set the filtering properties to start/stop
0161  * filtering TS packets on a particular TS feed.
0162  */
0163 struct dmx_section_feed {
0164     int is_filtering;
0165     struct dmx_demux *parent;
0166     void *priv;
0167 
0168     int check_crc;
0169 
0170     /* private: Used internally at dvb_demux.c */
0171     u32 crc_val;
0172 
0173     u8 *secbuf;
0174     u8 secbuf_base[DMX_MAX_SECFEED_SIZE];
0175     u16 secbufp, seclen, tsfeedp;
0176 
0177     /* public: */
0178     int (*set)(struct dmx_section_feed *feed,
0179            u16 pid,
0180            int check_crc);
0181     int (*allocate_filter)(struct dmx_section_feed *feed,
0182                    struct dmx_section_filter **filter);
0183     int (*release_filter)(struct dmx_section_feed *feed,
0184                   struct dmx_section_filter *filter);
0185     int (*start_filtering)(struct dmx_section_feed *feed);
0186     int (*stop_filtering)(struct dmx_section_feed *feed);
0187 };
0188 
0189 /**
0190  * typedef dmx_ts_cb - DVB demux TS filter callback function prototype
0191  *
0192  * @buffer1:        Pointer to the start of the filtered TS packets.
0193  * @buffer1_length: Length of the TS data in buffer1.
0194  * @buffer2:        Pointer to the tail of the filtered TS packets, or NULL.
0195  * @buffer2_length: Length of the TS data in buffer2.
0196  * @source:     Indicates which TS feed is the source of the callback.
0197  * @buffer_flags:   Address where buffer flags are stored. Those are
0198  *          used to report discontinuity users via DVB
0199  *          memory mapped API, as defined by
0200  *          &enum dmx_buffer_flags.
0201  *
0202  * This function callback prototype, provided by the client of the demux API,
0203  * is called from the demux code. The function is only called when filtering
0204  * on a TS feed has been enabled using the start_filtering\(\) function at
0205  * the &dmx_demux.
0206  * Any TS packets that match the filter settings are copied to a circular
0207  * buffer. The filtered TS packets are delivered to the client using this
0208  * callback function.
0209  * It is expected that the @buffer1 and @buffer2 callback parameters point to
0210  * addresses within the circular buffer, but other implementations are also
0211  * possible. Note that the called party should not try to free the memory
0212  * the @buffer1 and @buffer2 parameters point to.
0213  *
0214  * When this function is called, the @buffer1 parameter typically points to
0215  * the start of the first undelivered TS packet within a circular buffer.
0216  * The @buffer2 buffer parameter is normally NULL, except when the received
0217  * TS packets have crossed the last address of the circular buffer and
0218  * "wrapped" to the beginning of the buffer. In the latter case the @buffer1
0219  * parameter would contain an address within the circular buffer, while the
0220  * @buffer2 parameter would contain the first address of the circular buffer.
0221  * The number of bytes delivered with this function (i.e. @buffer1_length +
0222  * @buffer2_length) is usually equal to the value of callback_length parameter
0223  * given in the set() function, with one exception: if a timeout occurs before
0224  * receiving callback_length bytes of TS data, any undelivered packets are
0225  * immediately delivered to the client by calling this function. The timeout
0226  * duration is controlled by the set() function in the TS Feed API.
0227  *
0228  * If a TS packet is received with errors that could not be fixed by the
0229  * TS-level forward error correction (FEC), the Transport_error_indicator
0230  * flag of the TS packet header should be set. The TS packet should not be
0231  * discarded, as the error can possibly be corrected by a higher layer
0232  * protocol. If the called party is slow in processing the callback, it
0233  * is possible that the circular buffer eventually fills up. If this happens,
0234  * the demux driver should discard any TS packets received while the buffer
0235  * is full and return -EOVERFLOW.
0236  *
0237  * The type of data returned to the callback can be selected by the
0238  * &dmx_ts_feed.@set function. The type parameter decides if the raw
0239  * TS packet (TS_PACKET) or just the payload (TS_PACKET|TS_PAYLOAD_ONLY)
0240  * should be returned. If additionally the TS_DECODER bit is set the stream
0241  * will also be sent to the hardware MPEG decoder.
0242  *
0243  * Return:
0244  *
0245  * - 0, on success;
0246  *
0247  * - -EOVERFLOW, on buffer overflow.
0248  */
0249 typedef int (*dmx_ts_cb)(const u8 *buffer1,
0250              size_t buffer1_length,
0251              const u8 *buffer2,
0252              size_t buffer2_length,
0253              struct dmx_ts_feed *source,
0254              u32 *buffer_flags);
0255 
0256 /**
0257  * typedef dmx_section_cb - DVB demux TS filter callback function prototype
0258  *
0259  * @buffer1:        Pointer to the start of the filtered section, e.g.
0260  *          within the circular buffer of the demux driver.
0261  * @buffer1_len:    Length of the filtered section data in @buffer1,
0262  *          including headers and CRC.
0263  * @buffer2:        Pointer to the tail of the filtered section data,
0264  *          or NULL. Useful to handle the wrapping of a
0265  *          circular buffer.
0266  * @buffer2_len:    Length of the filtered section data in @buffer2,
0267  *          including headers and CRC.
0268  * @source:     Indicates which section feed is the source of the
0269  *          callback.
0270  * @buffer_flags:   Address where buffer flags are stored. Those are
0271  *          used to report discontinuity users via DVB
0272  *          memory mapped API, as defined by
0273  *          &enum dmx_buffer_flags.
0274  *
0275  * This function callback prototype, provided by the client of the demux API,
0276  * is called from the demux code. The function is only called when
0277  * filtering of sections has been enabled using the function
0278  * &dmx_ts_feed.@start_filtering. When the demux driver has received a
0279  * complete section that matches at least one section filter, the client
0280  * is notified via this callback function. Normally this function is called
0281  * for each received section; however, it is also possible to deliver
0282  * multiple sections with one callback, for example when the system load
0283  * is high. If an error occurs while receiving a section, this
0284  * function should be called with the corresponding error type set in the
0285  * success field, whether or not there is data to deliver. The Section Feed
0286  * implementation should maintain a circular buffer for received sections.
0287  * However, this is not necessary if the Section Feed API is implemented as
0288  * a client of the TS Feed API, because the TS Feed implementation then
0289  * buffers the received data. The size of the circular buffer can be
0290  * configured using the &dmx_ts_feed.@set function in the Section Feed API.
0291  * If there is no room in the circular buffer when a new section is received,
0292  * the section must be discarded. If this happens, the value of the success
0293  * parameter should be DMX_OVERRUN_ERROR on the next callback.
0294  */
0295 typedef int (*dmx_section_cb)(const u8 *buffer1,
0296                   size_t buffer1_len,
0297                   const u8 *buffer2,
0298                   size_t buffer2_len,
0299                   struct dmx_section_filter *source,
0300                   u32 *buffer_flags);
0301 
0302 /*
0303  * DVB Front-End
0304  */
0305 
0306 /**
0307  * enum dmx_frontend_source - Used to identify the type of frontend
0308  *
0309  * @DMX_MEMORY_FE:  The source of the demux is memory. It means that
0310  *          the MPEG-TS to be filtered comes from userspace,
0311  *          via write() syscall.
0312  *
0313  * @DMX_FRONTEND_0: The source of the demux is a frontend connected
0314  *          to the demux.
0315  */
0316 enum dmx_frontend_source {
0317     DMX_MEMORY_FE,
0318     DMX_FRONTEND_0,
0319 };
0320 
0321 /**
0322  * struct dmx_frontend - Structure that lists the frontends associated with
0323  *           a demux
0324  *
0325  * @connectivity_list:  List of front-ends that can be connected to a
0326  *          particular demux;
0327  * @source:     Type of the frontend.
0328  *
0329  * FIXME: this structure should likely be replaced soon by some
0330  *  media-controller based logic.
0331  */
0332 struct dmx_frontend {
0333     struct list_head connectivity_list;
0334     enum dmx_frontend_source source;
0335 };
0336 
0337 /*
0338  * MPEG-2 TS Demux
0339  */
0340 
0341 /**
0342  * enum dmx_demux_caps - MPEG-2 TS Demux capabilities bitmap
0343  *
0344  * @DMX_TS_FILTERING:       set if TS filtering is supported;
0345  * @DMX_SECTION_FILTERING:  set if section filtering is supported;
0346  * @DMX_MEMORY_BASED_FILTERING: set if write() available.
0347  *
0348  * Those flags are OR'ed in the &dmx_demux.capabilities field
0349  */
0350 enum dmx_demux_caps {
0351     DMX_TS_FILTERING = 1,
0352     DMX_SECTION_FILTERING = 4,
0353     DMX_MEMORY_BASED_FILTERING = 8,
0354 };
0355 
0356 /*
0357  * Demux resource type identifier.
0358  */
0359 
0360 /**
0361  * DMX_FE_ENTRY - Casts elements in the list of registered
0362  *        front-ends from the generic type struct list_head
0363  *        to the type * struct dmx_frontend
0364  *
0365  * @list: list of struct dmx_frontend
0366  */
0367 #define DMX_FE_ENTRY(list) \
0368     list_entry(list, struct dmx_frontend, connectivity_list)
0369 
0370 /**
0371  * struct dmx_demux - Structure that contains the demux capabilities and
0372  *            callbacks.
0373  *
0374  * @capabilities: Bitfield of capability flags.
0375  *
0376  * @frontend: Front-end connected to the demux
0377  *
0378  * @priv: Pointer to private data of the API client
0379  *
0380  * @open: This function reserves the demux for use by the caller and, if
0381  *  necessary, initializes the demux. When the demux is no longer needed,
0382  *  the function @close should be called. It should be possible for
0383  *  multiple clients to access the demux at the same time. Thus, the
0384  *  function implementation should increment the demux usage count when
0385  *  @open is called and decrement it when @close is called.
0386  *  The @demux function parameter contains a pointer to the demux API and
0387  *  instance data.
0388  *  It returns:
0389  *  0 on success;
0390  *  -EUSERS, if maximum usage count was reached;
0391  *  -EINVAL, on bad parameter.
0392  *
0393  * @close: This function reserves the demux for use by the caller and, if
0394  *  necessary, initializes the demux. When the demux is no longer needed,
0395  *  the function @close should be called. It should be possible for
0396  *  multiple clients to access the demux at the same time. Thus, the
0397  *  function implementation should increment the demux usage count when
0398  *  @open is called and decrement it when @close is called.
0399  *  The @demux function parameter contains a pointer to the demux API and
0400  *  instance data.
0401  *  It returns:
0402  *  0 on success;
0403  *  -ENODEV, if demux was not in use (e. g. no users);
0404  *  -EINVAL, on bad parameter.
0405  *
0406  * @write: This function provides the demux driver with a memory buffer
0407  *  containing TS packets. Instead of receiving TS packets from the DVB
0408  *  front-end, the demux driver software will read packets from memory.
0409  *  Any clients of this demux with active TS, PES or Section filters will
0410  *  receive filtered data via the Demux callback API (see 0). The function
0411  *  returns when all the data in the buffer has been consumed by the demux.
0412  *  Demux hardware typically cannot read TS from memory. If this is the
0413  *  case, memory-based filtering has to be implemented entirely in software.
0414  *  The @demux function parameter contains a pointer to the demux API and
0415  *  instance data.
0416  *  The @buf function parameter contains a pointer to the TS data in
0417  *  kernel-space memory.
0418  *  The @count function parameter contains the length of the TS data.
0419  *  It returns:
0420  *  0 on success;
0421  *  -ERESTARTSYS, if mutex lock was interrupted;
0422  *  -EINTR, if a signal handling is pending;
0423  *  -ENODEV, if demux was removed;
0424  *  -EINVAL, on bad parameter.
0425  *
0426  * @allocate_ts_feed: Allocates a new TS feed, which is used to filter the TS
0427  *  packets carrying a certain PID. The TS feed normally corresponds to a
0428  *  hardware PID filter on the demux chip.
0429  *  The @demux function parameter contains a pointer to the demux API and
0430  *  instance data.
0431  *  The @feed function parameter contains a pointer to the TS feed API and
0432  *  instance data.
0433  *  The @callback function parameter contains a pointer to the callback
0434  *  function for passing received TS packet.
0435  *  It returns:
0436  *  0 on success;
0437  *  -ERESTARTSYS, if mutex lock was interrupted;
0438  *  -EBUSY, if no more TS feeds is available;
0439  *  -EINVAL, on bad parameter.
0440  *
0441  * @release_ts_feed: Releases the resources allocated with @allocate_ts_feed.
0442  *  Any filtering in progress on the TS feed should be stopped before
0443  *  calling this function.
0444  *  The @demux function parameter contains a pointer to the demux API and
0445  *  instance data.
0446  *  The @feed function parameter contains a pointer to the TS feed API and
0447  *  instance data.
0448  *  It returns:
0449  *  0 on success;
0450  *  -EINVAL on bad parameter.
0451  *
0452  * @allocate_section_feed: Allocates a new section feed, i.e. a demux resource
0453  *  for filtering and receiving sections. On platforms with hardware
0454  *  support for section filtering, a section feed is directly mapped to
0455  *  the demux HW. On other platforms, TS packets are first PID filtered in
0456  *  hardware and a hardware section filter then emulated in software. The
0457  *  caller obtains an API pointer of type dmx_section_feed_t as an out
0458  *  parameter. Using this API the caller can set filtering parameters and
0459  *  start receiving sections.
0460  *  The @demux function parameter contains a pointer to the demux API and
0461  *  instance data.
0462  *  The @feed function parameter contains a pointer to the TS feed API and
0463  *  instance data.
0464  *  The @callback function parameter contains a pointer to the callback
0465  *  function for passing received TS packet.
0466  *  It returns:
0467  *  0 on success;
0468  *  -EBUSY, if no more TS feeds is available;
0469  *  -EINVAL, on bad parameter.
0470  *
0471  * @release_section_feed: Releases the resources allocated with
0472  *  @allocate_section_feed, including allocated filters. Any filtering in
0473  *  progress on the section feed should be stopped before calling this
0474  *  function.
0475  *  The @demux function parameter contains a pointer to the demux API and
0476  *  instance data.
0477  *  The @feed function parameter contains a pointer to the TS feed API and
0478  *  instance data.
0479  *  It returns:
0480  *  0 on success;
0481  *  -EINVAL, on bad parameter.
0482  *
0483  * @add_frontend: Registers a connectivity between a demux and a front-end,
0484  *  i.e., indicates that the demux can be connected via a call to
0485  *  @connect_frontend to use the given front-end as a TS source. The
0486  *  client of this function has to allocate dynamic or static memory for
0487  *  the frontend structure and initialize its fields before calling this
0488  *  function. This function is normally called during the driver
0489  *  initialization. The caller must not free the memory of the frontend
0490  *  struct before successfully calling @remove_frontend.
0491  *  The @demux function parameter contains a pointer to the demux API and
0492  *  instance data.
0493  *  The @frontend function parameter contains a pointer to the front-end
0494  *  instance data.
0495  *  It returns:
0496  *  0 on success;
0497  *  -EINVAL, on bad parameter.
0498  *
0499  * @remove_frontend: Indicates that the given front-end, registered by a call
0500  *  to @add_frontend, can no longer be connected as a TS source by this
0501  *  demux. The function should be called when a front-end driver or a demux
0502  *  driver is removed from the system. If the front-end is in use, the
0503  *  function fails with the return value of -EBUSY. After successfully
0504  *  calling this function, the caller can free the memory of the frontend
0505  *  struct if it was dynamically allocated before the @add_frontend
0506  *  operation.
0507  *  The @demux function parameter contains a pointer to the demux API and
0508  *  instance data.
0509  *  The @frontend function parameter contains a pointer to the front-end
0510  *  instance data.
0511  *  It returns:
0512  *  0 on success;
0513  *  -ENODEV, if the front-end was not found,
0514  *  -EINVAL, on bad parameter.
0515  *
0516  * @get_frontends: Provides the APIs of the front-ends that have been
0517  *  registered for this demux. Any of the front-ends obtained with this
0518  *  call can be used as a parameter for @connect_frontend. The include
0519  *  file demux.h contains the macro DMX_FE_ENTRY() for converting an
0520  *  element of the generic type struct &list_head * to the type
0521  *  struct &dmx_frontend *. The caller must not free the memory of any of
0522  *  the elements obtained via this function call.
0523  *  The @demux function parameter contains a pointer to the demux API and
0524  *  instance data.
0525  *  It returns a struct list_head pointer to the list of front-end
0526  *  interfaces, or NULL in the case of an empty list.
0527  *
0528  * @connect_frontend: Connects the TS output of the front-end to the input of
0529  *  the demux. A demux can only be connected to a front-end registered to
0530  *  the demux with the function @add_frontend. It may or may not be
0531  *  possible to connect multiple demuxes to the same front-end, depending
0532  *  on the capabilities of the HW platform. When not used, the front-end
0533  *  should be released by calling @disconnect_frontend.
0534  *  The @demux function parameter contains a pointer to the demux API and
0535  *  instance data.
0536  *  The @frontend function parameter contains a pointer to the front-end
0537  *  instance data.
0538  *  It returns:
0539  *  0 on success;
0540  *  -EINVAL, on bad parameter.
0541  *
0542  * @disconnect_frontend: Disconnects the demux and a front-end previously
0543  *  connected by a @connect_frontend call.
0544  *  The @demux function parameter contains a pointer to the demux API and
0545  *  instance data.
0546  *  It returns:
0547  *  0 on success;
0548  *  -EINVAL on bad parameter.
0549  *
0550  * @get_pes_pids: Get the PIDs for DMX_PES_AUDIO0, DMX_PES_VIDEO0,
0551  *  DMX_PES_TELETEXT0, DMX_PES_SUBTITLE0 and DMX_PES_PCR0.
0552  *  The @demux function parameter contains a pointer to the demux API and
0553  *  instance data.
0554  *  The @pids function parameter contains an array with five u16 elements
0555  *  where the PIDs will be stored.
0556  *  It returns:
0557  *  0 on success;
0558  *  -EINVAL on bad parameter.
0559  */
0560 struct dmx_demux {
0561     enum dmx_demux_caps capabilities;
0562     struct dmx_frontend *frontend;
0563     void *priv;
0564     int (*open)(struct dmx_demux *demux);
0565     int (*close)(struct dmx_demux *demux);
0566     int (*write)(struct dmx_demux *demux, const char __user *buf,
0567              size_t count);
0568     int (*allocate_ts_feed)(struct dmx_demux *demux,
0569                 struct dmx_ts_feed **feed,
0570                 dmx_ts_cb callback);
0571     int (*release_ts_feed)(struct dmx_demux *demux,
0572                    struct dmx_ts_feed *feed);
0573     int (*allocate_section_feed)(struct dmx_demux *demux,
0574                      struct dmx_section_feed **feed,
0575                      dmx_section_cb callback);
0576     int (*release_section_feed)(struct dmx_demux *demux,
0577                     struct dmx_section_feed *feed);
0578     int (*add_frontend)(struct dmx_demux *demux,
0579                 struct dmx_frontend *frontend);
0580     int (*remove_frontend)(struct dmx_demux *demux,
0581                    struct dmx_frontend *frontend);
0582     struct list_head *(*get_frontends)(struct dmx_demux *demux);
0583     int (*connect_frontend)(struct dmx_demux *demux,
0584                 struct dmx_frontend *frontend);
0585     int (*disconnect_frontend)(struct dmx_demux *demux);
0586 
0587     int (*get_pes_pids)(struct dmx_demux *demux, u16 *pids);
0588 
0589     /* private: */
0590 
0591     /*
0592      * Only used at av7110, to read some data from firmware.
0593      * As this was never documented, we have no clue about what's
0594      * there, and its usage on other drivers aren't encouraged.
0595      */
0596     int (*get_stc)(struct dmx_demux *demux, unsigned int num,
0597                u64 *stc, unsigned int *base);
0598 };
0599 
0600 #endif /* #ifndef __DEMUX_H */