1 /* 2 * dvb_demux.h: DVB kernel demux API 3 * 4 * Copyright (C) 2000-2001 Marcus Metzler & Ralph Metzler 5 * for convergence integrated media GmbH 6 * 7 * This program is free software; you can redistribute it and/or 8 * modify it under the terms of the GNU Lesser General Public License 9 * as published by the Free Software Foundation; either version 2.1 10 * of the License, or (at your option) any later version. 11 * 12 * This program is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 * GNU General Public License for more details. 16 * 17 */ 18 19 #ifndef _DVB_DEMUX_H_ 20 #define _DVB_DEMUX_H_ 21 22 #include <linux/time.h> 23 #include <linux/timer.h> 24 #include <linux/spinlock.h> 25 #include <linux/mutex.h> 26 27 #include "demux.h" 28 29 #define DMX_TYPE_TS 0 30 #define DMX_TYPE_SEC 1 31 #define DMX_TYPE_PES 2 32 33 #define DMX_STATE_FREE 0 34 #define DMX_STATE_ALLOCATED 1 35 #define DMX_STATE_SET 2 36 #define DMX_STATE_READY 3 37 #define DMX_STATE_GO 4 38 39 #define DVB_DEMUX_MASK_MAX 18 40 41 #define MAX_PID 0x1fff 42 43 #define SPEED_PKTS_INTERVAL 50000 44 45 struct dvb_demux_filter { 46 struct dmx_section_filter filter; 47 u8 maskandmode[DMX_MAX_FILTER_SIZE]; 48 u8 maskandnotmode[DMX_MAX_FILTER_SIZE]; 49 int doneq; 50 51 struct dvb_demux_filter *next; 52 struct dvb_demux_feed *feed; 53 int index; 54 int state; 55 int type; 56 57 u16 hw_handle; 58 struct timer_list timer; 59 }; 60 61 #define DMX_FEED_ENTRY(pos) list_entry(pos, struct dvb_demux_feed, list_head) 62 63 struct dvb_demux_feed { 64 union { 65 struct dmx_ts_feed ts; 66 struct dmx_section_feed sec; 67 } feed; 68 69 union { 70 dmx_ts_cb ts; 71 dmx_section_cb sec; 72 } cb; 73 74 struct dvb_demux *demux; 75 void *priv; 76 int type; 77 int state; 78 u16 pid; 79 80 ktime_t timeout; 81 struct dvb_demux_filter *filter; 82 83 int ts_type; 84 enum dmx_ts_pes pes_type; 85 86 int cc; 87 int pusi_seen; /* prevents feeding of garbage from previous section */ 88 89 u16 peslen; 90 91 struct list_head list_head; 92 unsigned int index; /* a unique index for each feed (can be used as hardware pid filter index) */ 93 }; 94 95 struct dvb_demux { 96 struct dmx_demux dmx; 97 void *priv; 98 int filternum; 99 int feednum; 100 int (*start_feed)(struct dvb_demux_feed *feed); 101 int (*stop_feed)(struct dvb_demux_feed *feed); 102 int (*write_to_decoder)(struct dvb_demux_feed *feed, 103 const u8 *buf, size_t len); 104 u32 (*check_crc32)(struct dvb_demux_feed *feed, 105 const u8 *buf, size_t len); 106 void (*memcopy)(struct dvb_demux_feed *feed, u8 *dst, 107 const u8 *src, size_t len); 108 109 int users; 110 #define MAX_DVB_DEMUX_USERS 10 111 struct dvb_demux_filter *filter; 112 struct dvb_demux_feed *feed; 113 114 struct list_head frontend_list; 115 116 struct dvb_demux_feed *pesfilter[DMX_PES_OTHER]; 117 u16 pids[DMX_PES_OTHER]; 118 int playing; 119 int recording; 120 121 #define DMX_MAX_PID 0x2000 122 struct list_head feed_list; 123 u8 tsbuf[204]; 124 int tsbufp; 125 126 struct mutex mutex; 127 spinlock_t lock; 128 129 uint8_t *cnt_storage; /* for TS continuity check */ 130 131 ktime_t speed_last_time; /* for TS speed check */ 132 uint32_t speed_pkts_cnt; /* for TS speed check */ 133 }; 134 135 int dvb_dmx_init(struct dvb_demux *dvbdemux); 136 void dvb_dmx_release(struct dvb_demux *dvbdemux); 137 void dvb_dmx_swfilter_packets(struct dvb_demux *dvbdmx, const u8 *buf, 138 size_t count); 139 void dvb_dmx_swfilter(struct dvb_demux *demux, const u8 *buf, size_t count); 140 void dvb_dmx_swfilter_204(struct dvb_demux *demux, const u8 *buf, 141 size_t count); 142 void dvb_dmx_swfilter_raw(struct dvb_demux *demux, const u8 *buf, 143 size_t count); 144 145 #endif /* _DVB_DEMUX_H_ */ 146