2005-04-16 15:20:36 -07: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 .
*
*/
# ifndef _DVB_DEMUX_H_
# define _DVB_DEMUX_H_
# include <linux/time.h>
# include <linux/timer.h>
# include <linux/spinlock.h>
2006-02-07 06:49:14 -02:00
# include <linux/mutex.h>
2005-04-16 15:20:36 -07:00
# include "demux.h"
2017-09-19 17:43:49 -04:00
/**
* enum dvb_dmx_filter_type - type of demux feed .
*
* @ DMX_TYPE_TS : feed is in TS mode .
* @ DMX_TYPE_SEC : feed is in Section mode .
*/
enum dvb_dmx_filter_type {
DMX_TYPE_TS ,
DMX_TYPE_SEC ,
} ;
2005-04-16 15:20:36 -07:00
2017-09-19 17:44:07 -04:00
/**
* enum dvb_dmx_state - state machine for a demux filter .
*
* @ DMX_STATE_FREE : indicates that the filter is freed .
* @ DMX_STATE_ALLOCATED : indicates that the filter was allocated
* to be used .
* @ DMX_STATE_READY : indicates that the filter is ready
* to be used .
* @ DMX_STATE_GO : indicates that the filter is running .
*/
enum dvb_dmx_state {
DMX_STATE_FREE ,
DMX_STATE_ALLOCATED ,
DMX_STATE_READY ,
DMX_STATE_GO ,
} ;
2005-04-16 15:20:36 -07:00
# define DVB_DEMUX_MASK_MAX 18
2009-06-06 09:31:34 -03:00
# define MAX_PID 0x1fff
2009-11-01 18:46:53 -03:00
# define SPEED_PKTS_INTERVAL 50000
2017-09-19 19:04:08 -04:00
/**
* struct dvb_demux_filter - Describes a DVB demux section filter .
*
* @ filter : Section filter as defined by & struct dmx_section_filter .
* @ maskandmode : logical ` ` and ` ` bit mask .
* @ maskandnotmode : logical ` ` and not ` ` bit mask .
* @ doneq : flag that indicates when a filter is ready .
* @ next : pointer to the next section filter .
* @ feed : & struct dvb_demux_feed pointer .
* @ index : index of the used demux filter .
* @ state : state of the filter as described by & enum dvb_dmx_state .
* @ type : type of the filter as described
* by & enum dvb_dmx_filter_type .
*/
2005-04-16 15:20:36 -07:00
struct dvb_demux_filter {
2005-09-09 13:02:26 -07:00
struct dmx_section_filter filter ;
u8 maskandmode [ DMX_MAX_FILTER_SIZE ] ;
u8 maskandnotmode [ DMX_MAX_FILTER_SIZE ] ;
2017-09-19 18:10:13 -04:00
bool doneq ;
2005-04-16 15:20:36 -07:00
2005-09-09 13:02:26 -07:00
struct dvb_demux_filter * next ;
struct dvb_demux_feed * feed ;
int index ;
2017-09-19 17:44:07 -04:00
enum dvb_dmx_state state ;
2017-09-19 17:43:49 -04:00
enum dvb_dmx_filter_type type ;
2005-04-16 15:20:36 -07:00
2017-09-19 19:04:08 -04:00
/* private: used only by av7110 */
2005-09-09 13:02:26 -07:00
u16 hw_handle ;
2005-04-16 15:20:36 -07:00
} ;
2017-09-19 19:04:08 -04:00
/**
* struct dvb_demux_feed - describes a DVB field
*
* @ feed : a digital TV feed . It can either be a TS or a section feed :
* - if the feed is TS , it contains & struct dvb_ts_feed ;
* - if the feed is section , it contains
* & struct dmx_section_feed .
* @ cb : digital TV callbacks . depending on the feed type , it can be :
* - if the feed is TS , it contains a dmx_ts_cb ( ) callback ;
* - if the feed is section , it contains a dmx_section_cb ( )
* callback .
*
* @ demux : pointer to & struct dvb_demux .
* @ priv : private data for the filter handling routine .
* @ type : type of the filter , as defined by & enum dvb_dmx_filter_type .
* @ state : state of the filter as defined by & enum dvb_dmx_state .
* @ pid : PID to be filtered .
* @ timeout : feed timeout .
* @ filter : pointer to & struct dvb_demux_filter .
* @ ts_type : type of TS , as defined by & enum ts_filter_type .
* @ pes_type : type of PES , as defined by & enum dmx_ts_pes .
* @ cc : MPEG - TS packet continuity counter
* @ pusi_seen : if true , indicates that a discontinuity was detected .
* it is used to prevent feeding of garbage from previous section .
* @ peslen : length of the PES ( Packet Elementary Stream ) .
* @ list_head : head for the list of digital TV demux feeds .
* @ index : a unique index for each feed . Can be used as hardware
* pid filter index .
*
*/
2005-04-16 15:20:36 -07:00
struct dvb_demux_feed {
2005-09-09 13:02:26 -07:00
union {
struct dmx_ts_feed ts ;
struct dmx_section_feed sec ;
2005-04-16 15:20:36 -07:00
} feed ;
2005-09-09 13:02:26 -07:00
union {
dmx_ts_cb ts ;
dmx_section_cb sec ;
2005-04-16 15:20:36 -07:00
} cb ;
2005-09-09 13:02:26 -07:00
struct dvb_demux * demux ;
2005-04-16 15:20:36 -07:00
void * priv ;
2017-09-19 17:43:49 -04:00
enum dvb_dmx_filter_type type ;
2017-09-19 17:44:07 -04:00
enum dvb_dmx_state state ;
2005-09-09 13:02:26 -07:00
u16 pid ;
2005-04-16 15:20:36 -07:00
2016-06-17 17:46:28 -03:00
ktime_t timeout ;
2005-09-09 13:02:26 -07:00
struct dvb_demux_filter * filter ;
2005-04-16 15:20:36 -07:00
2017-09-19 19:01:09 -04:00
enum ts_filter_type ts_type ;
2005-09-09 13:02:26 -07:00
enum dmx_ts_pes pes_type ;
2005-04-16 15:20:36 -07:00
2005-09-09 13:02:26 -07:00
int cc ;
2017-09-19 19:04:08 -04:00
bool pusi_seen ;
2005-04-16 15:20:36 -07:00
2005-09-09 13:02:26 -07:00
u16 peslen ;
2005-04-16 15:20:36 -07:00
struct list_head list_head ;
2017-09-19 19:04:08 -04:00
unsigned int index ;
2005-04-16 15:20:36 -07:00
} ;
struct dvb_demux {
2005-09-09 13:02:26 -07: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-16 15:20:36 -07:00
const u8 * buf , size_t len ) ;
2005-09-09 13:02:26 -07:00
u32 ( * check_crc32 ) ( struct dvb_demux_feed * feed ,
2005-04-16 15:20:36 -07:00
const u8 * buf , size_t len ) ;
2005-09-09 13:02:26 -07:00
void ( * memcopy ) ( struct dvb_demux_feed * feed , u8 * dst ,
2005-04-16 15:20:36 -07:00
const u8 * src , size_t len ) ;
2005-09-09 13:02:26 -07:00
int users ;
2005-04-16 15:20:36 -07:00
# define MAX_DVB_DEMUX_USERS 10
2005-09-09 13:02:26 -07:00
struct dvb_demux_filter * filter ;
struct dvb_demux_feed * feed ;
2005-04-16 15:20:36 -07:00
2005-09-09 13:02:26 -07:00
struct list_head frontend_list ;
2005-04-16 15:20:36 -07:00
2013-04-04 13:25:30 -03:00
struct dvb_demux_feed * pesfilter [ DMX_PES_OTHER ] ;
u16 pids [ DMX_PES_OTHER ] ;
2005-09-09 13:02:26 -07:00
int playing ;
int recording ;
2005-04-16 15:20:36 -07:00
# define DMX_MAX_PID 0x2000
struct list_head feed_list ;
2005-09-09 13:02:26 -07:00
u8 tsbuf [ 204 ] ;
int tsbufp ;
2005-04-16 15:20:36 -07:00
2006-02-07 06:49:14 -02:00
struct mutex mutex ;
2005-04-16 15:20:36 -07:00
spinlock_t lock ;
2009-06-06 09:31:34 -03:00
uint8_t * cnt_storage ; /* for TS continuity check */
2009-11-01 18:46:53 -03:00
2016-06-17 17:46:28 -03:00
ktime_t speed_last_time ; /* for TS speed check */
2009-11-01 18:46:53 -03:00
uint32_t speed_pkts_cnt ; /* for TS speed check */
2005-04-16 15:20:36 -07:00
} ;
int dvb_dmx_init ( struct dvb_demux * dvbdemux ) ;
2005-09-09 13:02:23 -07:00
void dvb_dmx_release ( struct dvb_demux * dvbdemux ) ;
2005-09-09 13:02:26 -07:00
void dvb_dmx_swfilter_packets ( struct dvb_demux * dvbdmx , const u8 * buf ,
size_t count ) ;
2005-04-16 15:20:36 -07:00
void dvb_dmx_swfilter ( struct dvb_demux * demux , const u8 * buf , size_t count ) ;
2005-09-09 13:02:26 -07:00
void dvb_dmx_swfilter_204 ( struct dvb_demux * demux , const u8 * buf ,
size_t count ) ;
2011-08-27 18:46:37 -03:00
void dvb_dmx_swfilter_raw ( struct dvb_demux * demux , const u8 * buf ,
size_t count ) ;
2005-04-16 15:20:36 -07:00
# endif /* _DVB_DEMUX_H_ */