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>
2006-02-07 11:49:14 +03:00
# include <linux/mutex.h>
2005-04-17 02:20:36 +04:00
# 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
2009-06-06 16:31:34 +04:00
# define MAX_PID 0x1fff
2009-11-02 00:46:53 +03:00
# define SPEED_PKTS_INTERVAL 50000
2005-04-17 02:20:36 +04:00
struct dvb_demux_filter {
2005-09-10 00:02:26 +04:00
struct dmx_section_filter filter ;
u8 maskandmode [ DMX_MAX_FILTER_SIZE ] ;
u8 maskandnotmode [ DMX_MAX_FILTER_SIZE ] ;
2005-04-17 02:20:36 +04:00
int doneq ;
2005-09-10 00:02:26 +04:00
struct dvb_demux_filter * next ;
struct dvb_demux_feed * feed ;
int index ;
int state ;
int type ;
2005-04-17 02:20:36 +04:00
2005-09-10 00:02:26 +04:00
u16 hw_handle ;
struct timer_list timer ;
2005-04-17 02:20:36 +04:00
} ;
# define DMX_FEED_ENTRY(pos) list_entry(pos, struct dvb_demux_feed, list_head)
struct dvb_demux_feed {
2005-09-10 00:02:26 +04:00
union {
struct dmx_ts_feed ts ;
struct dmx_section_feed sec ;
2005-04-17 02:20:36 +04:00
} feed ;
2005-09-10 00:02:26 +04:00
union {
dmx_ts_cb ts ;
dmx_section_cb sec ;
2005-04-17 02:20:36 +04:00
} cb ;
2005-09-10 00:02:26 +04:00
struct dvb_demux * demux ;
2005-04-17 02:20:36 +04:00
void * priv ;
2005-09-10 00:02:26 +04:00
int type ;
int state ;
u16 pid ;
u8 * buffer ;
int buffer_size ;
2005-04-17 02:20:36 +04:00
2005-09-10 00:02:26 +04:00
struct timespec timeout ;
struct dvb_demux_filter * filter ;
2005-04-17 02:20:36 +04:00
2005-09-10 00:02:26 +04:00
int ts_type ;
enum dmx_ts_pes pes_type ;
2005-04-17 02:20:36 +04:00
2005-09-10 00:02:26 +04:00
int cc ;
int pusi_seen ; /* prevents feeding of garbage from previous section */
2005-04-17 02:20:36 +04:00
2005-09-10 00:02:26 +04:00
u16 peslen ;
2005-04-17 02:20:36 +04:00
struct list_head list_head ;
2005-09-10 00:02:26 +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 {
2005-09-10 00:02:26 +04:00
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 ,
2005-04-17 02:20:36 +04:00
const u8 * buf , size_t len ) ;
2005-09-10 00:02:26 +04:00
u32 ( * check_crc32 ) ( struct dvb_demux_feed * feed ,
2005-04-17 02:20:36 +04:00
const u8 * buf , size_t len ) ;
2005-09-10 00:02:26 +04:00
void ( * memcopy ) ( struct dvb_demux_feed * feed , u8 * dst ,
2005-04-17 02:20:36 +04:00
const u8 * src , size_t len ) ;
2005-09-10 00:02:26 +04:00
int users ;
2005-04-17 02:20:36 +04:00
# define MAX_DVB_DEMUX_USERS 10
2005-09-10 00:02:26 +04:00
struct dvb_demux_filter * filter ;
struct dvb_demux_feed * feed ;
2005-04-17 02:20:36 +04:00
2005-09-10 00:02:26 +04:00
struct list_head frontend_list ;
2005-04-17 02:20:36 +04:00
2013-04-04 20:25:30 +04:00
struct dvb_demux_feed * pesfilter [ DMX_PES_OTHER ] ;
u16 pids [ DMX_PES_OTHER ] ;
2005-09-10 00:02:26 +04:00
int playing ;
int recording ;
2005-04-17 02:20:36 +04:00
# define DMX_MAX_PID 0x2000
struct list_head feed_list ;
2005-09-10 00:02:26 +04:00
u8 tsbuf [ 204 ] ;
int tsbufp ;
2005-04-17 02:20:36 +04:00
2006-02-07 11:49:14 +03:00
struct mutex mutex ;
2005-04-17 02:20:36 +04:00
spinlock_t lock ;
2009-06-06 16:31:34 +04:00
uint8_t * cnt_storage ; /* for TS continuity check */
2009-11-02 00:46:53 +03:00
struct timespec speed_last_time ; /* for TS speed check */
uint32_t speed_pkts_cnt ; /* for TS speed check */
2005-04-17 02:20:36 +04:00
} ;
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-09-10 00:02:26 +04:00
void dvb_dmx_swfilter_packets ( struct dvb_demux * dvbdmx , const u8 * buf ,
size_t count ) ;
2005-04-17 02:20:36 +04:00
void dvb_dmx_swfilter ( struct dvb_demux * demux , const u8 * buf , size_t count ) ;
2005-09-10 00:02:26 +04:00
void dvb_dmx_swfilter_204 ( struct dvb_demux * demux , const u8 * buf ,
size_t count ) ;
2011-08-28 01:46:37 +04:00
void dvb_dmx_swfilter_raw ( struct dvb_demux * demux , const u8 * buf ,
size_t count ) ;
2005-04-17 02:20:36 +04:00
# endif /* _DVB_DEMUX_H_ */