![]() |
|
|||
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_ */
[ Source navigation ] | [ Diff markup ] | [ Identifier search ] | [ general search ] |
This page was automatically generated by the 2.1.0 LXR engine. The LXR team |
![]() ![]() |