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 * You should have received a copy of the GNU Lesser General Public License 18 * along with this program; if not, write to the Free Software 19 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 20 * 21 */ 22 23#ifndef _DVB_DEMUX_H_ 24#define _DVB_DEMUX_H_ 25 26#include <linux/time.h> 27#include <linux/timer.h> 28#include <linux/spinlock.h> 29#include <linux/mutex.h> 30 31#include "demux.h" 32 33#define DMX_TYPE_TS 0 34#define DMX_TYPE_SEC 1 35#define DMX_TYPE_PES 2 36 37#define DMX_STATE_FREE 0 38#define DMX_STATE_ALLOCATED 1 39#define DMX_STATE_SET 2 40#define DMX_STATE_READY 3 41#define DMX_STATE_GO 4 42 43#define DVB_DEMUX_MASK_MAX 18 44 45struct 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 63struct 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 u8 *buffer; 80 int buffer_size; 81 82 struct timespec timeout; 83 struct dvb_demux_filter *filter; 84 85 int ts_type; 86 enum dmx_ts_pes pes_type; 87 88 int cc; 89 int pusi_seen; /* prevents feeding of garbage from previous section */ 90 91 u16 peslen; 92 93 struct list_head list_head; 94 unsigned int index; /* a unique index for each feed (can be used as hardware pid filter index) */ 95}; 96 97struct dvb_demux { 98 struct dmx_demux dmx; 99 void *priv; 100 int filternum; 101 int feednum; 102 int (*start_feed)(struct dvb_demux_feed *feed); 103 int (*stop_feed)(struct dvb_demux_feed *feed); 104 int (*write_to_decoder)(struct dvb_demux_feed *feed, 105 const u8 *buf, size_t len); 106 u32 (*check_crc32)(struct dvb_demux_feed *feed, 107 const u8 *buf, size_t len); 108 void (*memcopy)(struct dvb_demux_feed *feed, u8 *dst, 109 const u8 *src, size_t len); 110 111 int users; 112#define MAX_DVB_DEMUX_USERS 10 113 struct dvb_demux_filter *filter; 114 struct dvb_demux_feed *feed; 115 116 struct list_head frontend_list; 117 118 struct dvb_demux_feed *pesfilter[DMX_TS_PES_OTHER]; 119 u16 pids[DMX_TS_PES_OTHER]; 120 int playing; 121 int recording; 122 123#define DMX_MAX_PID 0x2000 124 struct list_head feed_list; 125 u8 tsbuf[204]; 126 int tsbufp; 127 128 struct mutex mutex; 129 spinlock_t lock; 130}; 131 132int dvb_dmx_init(struct dvb_demux *dvbdemux); 133void dvb_dmx_release(struct dvb_demux *dvbdemux); 134void dvb_dmx_swfilter_packets(struct dvb_demux *dvbdmx, const u8 *buf, 135 size_t count); 136void dvb_dmx_swfilter(struct dvb_demux *demux, const u8 *buf, size_t count); 137void dvb_dmx_swfilter_204(struct dvb_demux *demux, const u8 *buf, 138 size_t count); 139 140#endif /* _DVB_DEMUX_H_ */ 141