2005-04-17 02:20:36 +04:00
/*
* dvb_demux . h : DVB kernel demux API
*
* Copyright ( C ) 2000 - 2001 Marcus Metzler & Ralph Metzler
* for convergence integrated media GmbH
*
* This program is free software ; you can redistribute it and / or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation ; either version 2.1
* of the License , or ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program ; if not , write to the Free Software
* Foundation , Inc . , 59 Temple Place - Suite 330 , Boston , MA 02111 - 1307 , USA .
*
*/
# ifndef _DVB_DEMUX_H_
# define _DVB_DEMUX_H_
# include <linux/time.h>
# include <linux/timer.h>
# include <linux/spinlock.h>
# include <asm/semaphore.h>
# include "demux.h"
# define DMX_TYPE_TS 0
# define DMX_TYPE_SEC 1
# define DMX_TYPE_PES 2
# define DMX_STATE_FREE 0
# define DMX_STATE_ALLOCATED 1
# define DMX_STATE_SET 2
# define DMX_STATE_READY 3
# define DMX_STATE_GO 4
# define DVB_DEMUX_MASK_MAX 18
struct dvb_demux_filter {
struct dmx_section_filter filter ;
u8 maskandmode [ DMX_MAX_FILTER_SIZE ] ;
u8 maskandnotmode [ DMX_MAX_FILTER_SIZE ] ;
int doneq ;
struct dvb_demux_filter * next ;
struct dvb_demux_feed * feed ;
int index ;
int state ;
int type ;
u16 hw_handle ;
struct timer_list timer ;
} ;
# define DMX_FEED_ENTRY(pos) list_entry(pos, struct dvb_demux_feed, list_head)
struct dvb_demux_feed {
union {
struct dmx_ts_feed ts ;
struct dmx_section_feed sec ;
} feed ;
union {
dmx_ts_cb ts ;
dmx_section_cb sec ;
} cb ;
struct dvb_demux * demux ;
void * priv ;
int type ;
int state ;
u16 pid ;
u8 * buffer ;
int buffer_size ;
struct timespec timeout ;
struct dvb_demux_filter * filter ;
int ts_type ;
enum dmx_ts_pes pes_type ;
int cc ;
int pusi_seen ; /* prevents feeding of garbage from previous section */
u16 peslen ;
struct list_head list_head ;
2005-09-10 00:02:24 +04:00
unsigned int index ; /* a unique index for each feed (can be used as hardware pid filter index) */
2005-04-17 02:20:36 +04:00
} ;
struct dvb_demux {
struct dmx_demux dmx ;
void * priv ;
int filternum ;
int feednum ;
int ( * start_feed ) ( struct dvb_demux_feed * feed ) ;
int ( * stop_feed ) ( struct dvb_demux_feed * feed ) ;
int ( * write_to_decoder ) ( struct dvb_demux_feed * feed ,
const u8 * buf , size_t len ) ;
u32 ( * check_crc32 ) ( struct dvb_demux_feed * feed ,
const u8 * buf , size_t len ) ;
void ( * memcopy ) ( struct dvb_demux_feed * feed , u8 * dst ,
const u8 * src , size_t len ) ;
int users ;
# define MAX_DVB_DEMUX_USERS 10
struct dvb_demux_filter * filter ;
struct dvb_demux_feed * feed ;
struct list_head frontend_list ;
struct dvb_demux_feed * pesfilter [ DMX_TS_PES_OTHER ] ;
u16 pids [ DMX_TS_PES_OTHER ] ;
int playing ;
int recording ;
# define DMX_MAX_PID 0x2000
struct list_head feed_list ;
u8 tsbuf [ 204 ] ;
int tsbufp ;
struct semaphore mutex ;
spinlock_t lock ;
} ;
int dvb_dmx_init ( struct dvb_demux * dvbdemux ) ;
2005-09-10 00:02:23 +04:00
void dvb_dmx_release ( struct dvb_demux * dvbdemux ) ;
2005-04-17 02:20:36 +04:00
void dvb_dmx_swfilter_packets ( struct dvb_demux * dvbdmx , const u8 * buf , size_t count ) ;
void dvb_dmx_swfilter ( struct dvb_demux * demux , const u8 * buf , size_t count ) ;
void dvb_dmx_swfilter_204 ( struct dvb_demux * demux , const u8 * buf , size_t count ) ;
# endif /* _DVB_DEMUX_H_ */