Back to home page

OSCL-LXR

 
 

    


0001 /*
0002  * dvb_demux.h: DVB kernel demux API
0003  *
0004  * Copyright (C) 2000-2001 Marcus Metzler & Ralph Metzler
0005  *                         for convergence integrated media GmbH
0006  *
0007  * This program is free software; you can redistribute it and/or
0008  * modify it under the terms of the GNU Lesser General Public License
0009  * as published by the Free Software Foundation; either version 2.1
0010  * of the License, or (at your option) any later version.
0011  *
0012  * This program is distributed in the hope that it will be useful,
0013  * but WITHOUT ANY WARRANTY; without even the implied warranty of
0014  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
0015  * GNU General Public License for more details.
0016  *
0017  */
0018 
0019 #ifndef _DVB_DEMUX_H_
0020 #define _DVB_DEMUX_H_
0021 
0022 #include <linux/time.h>
0023 #include <linux/timer.h>
0024 #include <linux/spinlock.h>
0025 #include <linux/mutex.h>
0026 
0027 #include <media/demux.h>
0028 
0029 /**
0030  * enum dvb_dmx_filter_type - type of demux feed.
0031  *
0032  * @DMX_TYPE_TS:    feed is in TS mode.
0033  * @DMX_TYPE_SEC:   feed is in Section mode.
0034  */
0035 enum dvb_dmx_filter_type {
0036     DMX_TYPE_TS,
0037     DMX_TYPE_SEC,
0038 };
0039 
0040 /**
0041  * enum dvb_dmx_state - state machine for a demux filter.
0042  *
0043  * @DMX_STATE_FREE:     indicates that the filter is freed.
0044  * @DMX_STATE_ALLOCATED:    indicates that the filter was allocated
0045  *              to be used.
0046  * @DMX_STATE_READY:        indicates that the filter is ready
0047  *              to be used.
0048  * @DMX_STATE_GO:       indicates that the filter is running.
0049  */
0050 enum dvb_dmx_state {
0051     DMX_STATE_FREE,
0052     DMX_STATE_ALLOCATED,
0053     DMX_STATE_READY,
0054     DMX_STATE_GO,
0055 };
0056 
0057 #define DVB_DEMUX_MASK_MAX 18
0058 
0059 #define MAX_PID 0x1fff
0060 
0061 #define SPEED_PKTS_INTERVAL 50000
0062 
0063 /**
0064  * struct dvb_demux_filter - Describes a DVB demux section filter.
0065  *
0066  * @filter:     Section filter as defined by &struct dmx_section_filter.
0067  * @maskandmode:    logical ``and`` bit mask.
0068  * @maskandnotmode: logical ``and not`` bit mask.
0069  * @doneq:      flag that indicates when a filter is ready.
0070  * @next:       pointer to the next section filter.
0071  * @feed:       &struct dvb_demux_feed pointer.
0072  * @index:      index of the used demux filter.
0073  * @state:      state of the filter as described by &enum dvb_dmx_state.
0074  * @type:       type of the filter as described
0075  *          by &enum dvb_dmx_filter_type.
0076  */
0077 
0078 struct dvb_demux_filter {
0079     struct dmx_section_filter filter;
0080     u8 maskandmode[DMX_MAX_FILTER_SIZE];
0081     u8 maskandnotmode[DMX_MAX_FILTER_SIZE];
0082     bool doneq;
0083 
0084     struct dvb_demux_filter *next;
0085     struct dvb_demux_feed *feed;
0086     int index;
0087     enum dvb_dmx_state state;
0088     enum dvb_dmx_filter_type type;
0089 
0090     /* private: used only by av7110 */
0091     u16 hw_handle;
0092 };
0093 
0094 /**
0095  * struct dvb_demux_feed - describes a DVB field
0096  *
0097  * @feed:   a union describing a digital TV feed.
0098  *      Depending on the feed type, it can be either
0099  *      @feed.ts or @feed.sec.
0100  * @feed.ts:    a &struct dmx_ts_feed pointer.
0101  *      For TS feed only.
0102  * @feed.sec:   a &struct dmx_section_feed pointer.
0103  *      For section feed only.
0104  * @cb:     a union describing digital TV callbacks.
0105  *      Depending on the feed type, it can be either
0106  *      @cb.ts or @cb.sec.
0107  * @cb.ts:  a dmx_ts_cb() calback function pointer.
0108  *      For TS feed only.
0109  * @cb.sec: a dmx_section_cb() callback function pointer.
0110  *      For section feed only.
0111  * @demux:  pointer to &struct dvb_demux.
0112  * @priv:   private data that can optionally be used by a DVB driver.
0113  * @type:   type of the filter, as defined by &enum dvb_dmx_filter_type.
0114  * @state:  state of the filter as defined by &enum dvb_dmx_state.
0115  * @pid:    PID to be filtered.
0116  * @timeout:    feed timeout.
0117  * @filter: pointer to &struct dvb_demux_filter.
0118  * @buffer_flags: Buffer flags used to report discontinuity users via DVB
0119  *        memory mapped API, as defined by &enum dmx_buffer_flags.
0120  * @ts_type:    type of TS, as defined by &enum ts_filter_type.
0121  * @pes_type:   type of PES, as defined by &enum dmx_ts_pes.
0122  * @cc:     MPEG-TS packet continuity counter
0123  * @pusi_seen:  if true, indicates that a discontinuity was detected.
0124  *      it is used to prevent feeding of garbage from previous section.
0125  * @peslen: length of the PES (Packet Elementary Stream).
0126  * @list_head:  head for the list of digital TV demux feeds.
0127  * @index:  a unique index for each feed. Can be used as hardware
0128  *      pid filter index.
0129  */
0130 struct dvb_demux_feed {
0131     union {
0132         struct dmx_ts_feed ts;
0133         struct dmx_section_feed sec;
0134     } feed;
0135 
0136     union {
0137         dmx_ts_cb ts;
0138         dmx_section_cb sec;
0139     } cb;
0140 
0141     struct dvb_demux *demux;
0142     void *priv;
0143     enum dvb_dmx_filter_type type;
0144     enum dvb_dmx_state state;
0145     u16 pid;
0146 
0147     ktime_t timeout;
0148     struct dvb_demux_filter *filter;
0149 
0150     u32 buffer_flags;
0151 
0152     enum ts_filter_type ts_type;
0153     enum dmx_ts_pes pes_type;
0154 
0155     int cc;
0156     bool pusi_seen;
0157 
0158     u16 peslen;
0159 
0160     struct list_head list_head;
0161     unsigned int index;
0162 };
0163 
0164 /**
0165  * struct dvb_demux - represents a digital TV demux
0166  * @dmx:        embedded &struct dmx_demux with demux capabilities
0167  *          and callbacks.
0168  * @priv:       private data that can optionally be used by
0169  *          a DVB driver.
0170  * @filternum:      maximum amount of DVB filters.
0171  * @feednum:        maximum amount of DVB feeds.
0172  * @start_feed:     callback routine to be called in order to start
0173  *          a DVB feed.
0174  * @stop_feed:      callback routine to be called in order to stop
0175  *          a DVB feed.
0176  * @write_to_decoder:   callback routine to be called if the feed is TS and
0177  *          it is routed to an A/V decoder, when a new TS packet
0178  *          is received.
0179  *          Used only on av7110-av.c.
0180  * @check_crc32:    callback routine to check CRC. If not initialized,
0181  *          dvb_demux will use an internal one.
0182  * @memcopy:        callback routine to memcopy received data.
0183  *          If not initialized, dvb_demux will default to memcpy().
0184  * @users:      counter for the number of demux opened file descriptors.
0185  *          Currently, it is limited to 10 users.
0186  * @filter:     pointer to &struct dvb_demux_filter.
0187  * @feed:       pointer to &struct dvb_demux_feed.
0188  * @frontend_list:  &struct list_head with frontends used by the demux.
0189  * @pesfilter:      array of &struct dvb_demux_feed with the PES types
0190  *          that will be filtered.
0191  * @pids:       list of filtered program IDs.
0192  * @feed_list:      &struct list_head with feeds.
0193  * @tsbuf:      temporary buffer used internally to store TS packets.
0194  * @tsbufp:     temporary buffer index used internally.
0195  * @mutex:      pointer to &struct mutex used to protect feed set
0196  *          logic.
0197  * @lock:       pointer to &spinlock_t, used to protect buffer handling.
0198  * @cnt_storage:    buffer used for TS/TEI continuity check.
0199  * @speed_last_time:    &ktime_t used for TS speed check.
0200  * @speed_pkts_cnt: packets count used for TS speed check.
0201  */
0202 struct dvb_demux {
0203     struct dmx_demux dmx;
0204     void *priv;
0205     int filternum;
0206     int feednum;
0207     int (*start_feed)(struct dvb_demux_feed *feed);
0208     int (*stop_feed)(struct dvb_demux_feed *feed);
0209     int (*write_to_decoder)(struct dvb_demux_feed *feed,
0210                  const u8 *buf, size_t len);
0211     u32 (*check_crc32)(struct dvb_demux_feed *feed,
0212                 const u8 *buf, size_t len);
0213     void (*memcopy)(struct dvb_demux_feed *feed, u8 *dst,
0214              const u8 *src, size_t len);
0215 
0216     int users;
0217 #define MAX_DVB_DEMUX_USERS 10
0218     struct dvb_demux_filter *filter;
0219     struct dvb_demux_feed *feed;
0220 
0221     struct list_head frontend_list;
0222 
0223     struct dvb_demux_feed *pesfilter[DMX_PES_OTHER];
0224     u16 pids[DMX_PES_OTHER];
0225 
0226 #define DMX_MAX_PID 0x2000
0227     struct list_head feed_list;
0228     u8 tsbuf[204];
0229     int tsbufp;
0230 
0231     struct mutex mutex;
0232     spinlock_t lock;
0233 
0234     uint8_t *cnt_storage; /* for TS continuity check */
0235 
0236     ktime_t speed_last_time; /* for TS speed check */
0237     uint32_t speed_pkts_cnt; /* for TS speed check */
0238 
0239     /* private: used only on av7110 */
0240     int playing;
0241     int recording;
0242 };
0243 
0244 /**
0245  * dvb_dmx_init - initialize a digital TV demux struct.
0246  *
0247  * @demux: &struct dvb_demux to be initialized.
0248  *
0249  * Before being able to register a digital TV demux struct, drivers
0250  * should call this routine. On its typical usage, some fields should
0251  * be initialized at the driver before calling it.
0252  *
0253  * A typical usecase is::
0254  *
0255  *  dvb->demux.dmx.capabilities =
0256  *      DMX_TS_FILTERING | DMX_SECTION_FILTERING |
0257  *      DMX_MEMORY_BASED_FILTERING;
0258  *  dvb->demux.priv       = dvb;
0259  *  dvb->demux.filternum  = 256;
0260  *  dvb->demux.feednum    = 256;
0261  *  dvb->demux.start_feed = driver_start_feed;
0262  *  dvb->demux.stop_feed  = driver_stop_feed;
0263  *  ret = dvb_dmx_init(&dvb->demux);
0264  *  if (ret < 0)
0265  *      return ret;
0266  */
0267 int dvb_dmx_init(struct dvb_demux *demux);
0268 
0269 /**
0270  * dvb_dmx_release - releases a digital TV demux internal buffers.
0271  *
0272  * @demux: &struct dvb_demux to be released.
0273  *
0274  * The DVB core internally allocates data at @demux. This routine
0275  * releases those data. Please notice that the struct itelf is not
0276  * released, as it can be embedded on other structs.
0277  */
0278 void dvb_dmx_release(struct dvb_demux *demux);
0279 
0280 /**
0281  * dvb_dmx_swfilter_packets - use dvb software filter for a buffer with
0282  *  multiple MPEG-TS packets with 188 bytes each.
0283  *
0284  * @demux: pointer to &struct dvb_demux
0285  * @buf: buffer with data to be filtered
0286  * @count: number of MPEG-TS packets with size of 188.
0287  *
0288  * The routine will discard a DVB packet that don't start with 0x47.
0289  *
0290  * Use this routine if the DVB demux fills MPEG-TS buffers that are
0291  * already aligned.
0292  *
0293  * NOTE: The @buf size should have size equal to ``count * 188``.
0294  */
0295 void dvb_dmx_swfilter_packets(struct dvb_demux *demux, const u8 *buf,
0296                   size_t count);
0297 
0298 /**
0299  * dvb_dmx_swfilter -  use dvb software filter for a buffer with
0300  *  multiple MPEG-TS packets with 188 bytes each.
0301  *
0302  * @demux: pointer to &struct dvb_demux
0303  * @buf: buffer with data to be filtered
0304  * @count: number of MPEG-TS packets with size of 188.
0305  *
0306  * If a DVB packet doesn't start with 0x47, it will seek for the first
0307  * byte that starts with 0x47.
0308  *
0309  * Use this routine if the DVB demux fill buffers that may not start with
0310  * a packet start mark (0x47).
0311  *
0312  * NOTE: The @buf size should have size equal to ``count * 188``.
0313  */
0314 void dvb_dmx_swfilter(struct dvb_demux *demux, const u8 *buf, size_t count);
0315 
0316 /**
0317  * dvb_dmx_swfilter_204 -  use dvb software filter for a buffer with
0318  *  multiple MPEG-TS packets with 204 bytes each.
0319  *
0320  * @demux: pointer to &struct dvb_demux
0321  * @buf: buffer with data to be filtered
0322  * @count: number of MPEG-TS packets with size of 204.
0323  *
0324  * If a DVB packet doesn't start with 0x47, it will seek for the first
0325  * byte that starts with 0x47.
0326  *
0327  * Use this routine if the DVB demux fill buffers that may not start with
0328  * a packet start mark (0x47).
0329  *
0330  * NOTE: The @buf size should have size equal to ``count * 204``.
0331  */
0332 void dvb_dmx_swfilter_204(struct dvb_demux *demux, const u8 *buf,
0333               size_t count);
0334 
0335 /**
0336  * dvb_dmx_swfilter_raw -  make the raw data available to userspace without
0337  *  filtering
0338  *
0339  * @demux: pointer to &struct dvb_demux
0340  * @buf: buffer with data
0341  * @count: number of packets to be passed. The actual size of each packet
0342  *  depends on the &dvb_demux->feed->cb.ts logic.
0343  *
0344  * Use it if the driver needs to deliver the raw payload to userspace without
0345  * passing through the kernel demux. That is meant to support some
0346  * delivery systems that aren't based on MPEG-TS.
0347  *
0348  * This function relies on &dvb_demux->feed->cb.ts to actually handle the
0349  * buffer.
0350  */
0351 void dvb_dmx_swfilter_raw(struct dvb_demux *demux, const u8 *buf,
0352               size_t count);
0353 
0354 #endif /* _DVB_DEMUX_H_ */