2005-04-17 02:20:36 +04:00
/*
* demux . h
*
* Copyright ( c ) 2002 Convergence GmbH
*
* based on code :
* Copyright ( c ) 2000 Nokia Research Center
* Tampere , FINLAND
*
* 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 __DEMUX_H
# define __DEMUX_H
# include <linux/types.h>
# include <linux/errno.h>
# include <linux/list.h>
# include <linux/time.h>
2005-09-10 00:02:21 +04:00
# include <linux/dvb/dmx.h>
2005-04-17 02:20:36 +04:00
/*--------------------------------------------------------------------------*/
/* Common definitions */
/*--------------------------------------------------------------------------*/
/*
* DMX_MAX_FILTER_SIZE : Maximum length ( in bytes ) of a section / PES filter .
*/
# ifndef DMX_MAX_FILTER_SIZE
# define DMX_MAX_FILTER_SIZE 18
# endif
/*
* DMX_MAX_SECFEED_SIZE : Maximum length ( in bytes ) of a private section feed filter .
*/
2005-11-09 08:35:50 +03:00
# ifndef DMX_MAX_SECTION_SIZE
# define DMX_MAX_SECTION_SIZE 4096
# endif
2005-04-17 02:20:36 +04:00
# ifndef DMX_MAX_SECFEED_SIZE
2005-11-09 08:35:50 +03:00
# define DMX_MAX_SECFEED_SIZE (DMX_MAX_SECTION_SIZE + 188)
2005-04-17 02:20:36 +04:00
# endif
/*
* enum dmx_success : Success codes for the Demux Callback API .
*/
enum dmx_success {
DMX_OK = 0 , /* Received Ok */
DMX_LENGTH_ERROR , /* Incorrect length */
DMX_OVERRUN_ERROR , /* Receiver ring buffer overrun */
DMX_CRC_ERROR , /* Incorrect CRC */
DMX_FRAME_ERROR , /* Frame alignment error */
DMX_FIFO_ERROR , /* Receiver FIFO overrun */
DMX_MISSED_ERROR /* Receiver missed packet */
} ;
/*--------------------------------------------------------------------------*/
/* TS packet reception */
/*--------------------------------------------------------------------------*/
/* TS filter type for set() */
# define TS_PACKET 1 /* send TS packets (188 bytes) to callback (default) */
# define TS_PAYLOAD_ONLY 2 / * in case TS_PACKET is set, only send the TS
payload ( < = 184 bytes per packet ) to callback */
# define TS_DECODER 4 /* send stream to built-in decoder (if present) */
2008-04-22 21:45:47 +04:00
# define TS_DEMUX 8 / * in case TS_PACKET is set, send the TS to
the demux device , not to the dvr device */
2005-04-17 02:20:36 +04:00
/* PES type for filters which write to built-in decoder */
/* these should be kept identical to the types in dmx.h */
enum dmx_ts_pes
{ /* also send packets to decoder (if it exists) */
2005-12-12 11:37:27 +03:00
DMX_TS_PES_AUDIO0 ,
2005-04-17 02:20:36 +04:00
DMX_TS_PES_VIDEO0 ,
DMX_TS_PES_TELETEXT0 ,
DMX_TS_PES_SUBTITLE0 ,
DMX_TS_PES_PCR0 ,
2005-12-12 11:37:27 +03:00
DMX_TS_PES_AUDIO1 ,
2005-04-17 02:20:36 +04:00
DMX_TS_PES_VIDEO1 ,
DMX_TS_PES_TELETEXT1 ,
DMX_TS_PES_SUBTITLE1 ,
DMX_TS_PES_PCR1 ,
2005-12-12 11:37:27 +03:00
DMX_TS_PES_AUDIO2 ,
2005-04-17 02:20:36 +04:00
DMX_TS_PES_VIDEO2 ,
DMX_TS_PES_TELETEXT2 ,
DMX_TS_PES_SUBTITLE2 ,
DMX_TS_PES_PCR2 ,
2005-12-12 11:37:27 +03:00
DMX_TS_PES_AUDIO3 ,
2005-04-17 02:20:36 +04:00
DMX_TS_PES_VIDEO3 ,
DMX_TS_PES_TELETEXT3 ,
DMX_TS_PES_SUBTITLE3 ,
DMX_TS_PES_PCR3 ,
DMX_TS_PES_OTHER
} ;
# define DMX_TS_PES_AUDIO DMX_TS_PES_AUDIO0
# define DMX_TS_PES_VIDEO DMX_TS_PES_VIDEO0
# define DMX_TS_PES_TELETEXT DMX_TS_PES_TELETEXT0
# define DMX_TS_PES_SUBTITLE DMX_TS_PES_SUBTITLE0
# define DMX_TS_PES_PCR DMX_TS_PES_PCR0
struct dmx_ts_feed {
2005-12-12 11:37:27 +03:00
int is_filtering ; /* Set to non-zero when filtering in progress */
struct dmx_demux * parent ; /* Back-pointer */
void * priv ; /* Pointer to private data of the API client */
int ( * set ) ( struct dmx_ts_feed * feed ,
2005-04-17 02:20:36 +04:00
u16 pid ,
int type ,
enum dmx_ts_pes pes_type ,
size_t circular_buffer_size ,
struct timespec timeout ) ;
2005-12-12 11:37:27 +03:00
int ( * start_filtering ) ( struct dmx_ts_feed * feed ) ;
int ( * stop_filtering ) ( struct dmx_ts_feed * feed ) ;
2005-04-17 02:20:36 +04:00
} ;
/*--------------------------------------------------------------------------*/
/* Section reception */
/*--------------------------------------------------------------------------*/
struct dmx_section_filter {
2005-12-12 11:37:27 +03:00
u8 filter_value [ DMX_MAX_FILTER_SIZE ] ;
u8 filter_mask [ DMX_MAX_FILTER_SIZE ] ;
u8 filter_mode [ DMX_MAX_FILTER_SIZE ] ;
struct dmx_section_feed * parent ; /* Back-pointer */
void * priv ; /* Pointer to private data of the API client */
2005-04-17 02:20:36 +04:00
} ;
struct dmx_section_feed {
2005-12-12 11:37:27 +03:00
int is_filtering ; /* Set to non-zero when filtering in progress */
struct dmx_demux * parent ; /* Back-pointer */
void * priv ; /* Pointer to private data of the API client */
2005-04-17 02:20:36 +04:00
2005-12-12 11:37:27 +03:00
int check_crc ;
2005-04-17 02:20:36 +04:00
u32 crc_val ;
2005-12-12 11:37:27 +03:00
u8 * secbuf ;
u8 secbuf_base [ DMX_MAX_SECFEED_SIZE ] ;
u16 secbufp , seclen , tsfeedp ;
2005-04-17 02:20:36 +04:00
2005-12-12 11:37:27 +03:00
int ( * set ) ( struct dmx_section_feed * feed ,
2005-04-17 02:20:36 +04:00
u16 pid ,
size_t circular_buffer_size ,
int check_crc ) ;
2005-12-12 11:37:27 +03:00
int ( * allocate_filter ) ( struct dmx_section_feed * feed ,
2005-04-17 02:20:36 +04:00
struct dmx_section_filter * * filter ) ;
2005-12-12 11:37:27 +03:00
int ( * release_filter ) ( struct dmx_section_feed * feed ,
2005-04-17 02:20:36 +04:00
struct dmx_section_filter * filter ) ;
2005-12-12 11:37:27 +03:00
int ( * start_filtering ) ( struct dmx_section_feed * feed ) ;
int ( * stop_filtering ) ( struct dmx_section_feed * feed ) ;
2005-04-17 02:20:36 +04:00
} ;
/*--------------------------------------------------------------------------*/
/* Callback functions */
/*--------------------------------------------------------------------------*/
typedef int ( * dmx_ts_cb ) ( const u8 * buffer1 ,
size_t buffer1_length ,
const u8 * buffer2 ,
size_t buffer2_length ,
struct dmx_ts_feed * source ,
enum dmx_success success ) ;
typedef int ( * dmx_section_cb ) ( const u8 * buffer1 ,
size_t buffer1_len ,
const u8 * buffer2 ,
size_t buffer2_len ,
struct dmx_section_filter * source ,
enum dmx_success success ) ;
/*--------------------------------------------------------------------------*/
/* DVB Front-End */
/*--------------------------------------------------------------------------*/
enum dmx_frontend_source {
DMX_MEMORY_FE ,
DMX_FRONTEND_0 ,
DMX_FRONTEND_1 ,
DMX_FRONTEND_2 ,
DMX_FRONTEND_3 ,
DMX_STREAM_0 , /* external stream input, e.g. LVDS */
DMX_STREAM_1 ,
DMX_STREAM_2 ,
DMX_STREAM_3
} ;
struct dmx_frontend {
2005-12-12 11:37:27 +03:00
struct list_head connectivity_list ; /* List of front-ends that can
2005-04-17 02:20:36 +04:00
be connected to a particular
demux */
2005-12-12 11:37:27 +03:00
enum dmx_frontend_source source ;
2005-04-17 02:20:36 +04:00
} ;
/*--------------------------------------------------------------------------*/
/* MPEG-2 TS Demux */
/*--------------------------------------------------------------------------*/
/*
2006-03-08 04:20:23 +03:00
* Flags OR ' ed in the capabilities field of struct dmx_demux .
2005-04-17 02:20:36 +04:00
*/
# define DMX_TS_FILTERING 1
# define DMX_PES_FILTERING 2
# define DMX_SECTION_FILTERING 4
# define DMX_MEMORY_BASED_FILTERING 8 /* write() available */
# define DMX_CRC_CHECKING 16
# define DMX_TS_DESCRAMBLING 32
/*
* Demux resource type identifier .
*/
/*
* DMX_FE_ENTRY ( ) : Casts elements in the list of registered
* front - ends from the generic type struct list_head
* to the type * struct dmx_frontend
* .
*/
# define DMX_FE_ENTRY(list) list_entry(list, struct dmx_frontend, connectivity_list)
struct dmx_demux {
2005-12-12 11:37:27 +03:00
u32 capabilities ; /* Bitfield of capability flags */
struct dmx_frontend * frontend ; /* Front-end connected to the demux */
void * priv ; /* Pointer to private data of the API client */
int ( * open ) ( struct dmx_demux * demux ) ;
int ( * close ) ( struct dmx_demux * demux ) ;
2008-06-22 21:20:19 +04:00
int ( * write ) ( struct dmx_demux * demux , const char __user * buf , size_t count ) ;
2005-12-12 11:37:27 +03:00
int ( * allocate_ts_feed ) ( struct dmx_demux * demux ,
2005-04-17 02:20:36 +04:00
struct dmx_ts_feed * * feed ,
dmx_ts_cb callback ) ;
2005-12-12 11:37:27 +03:00
int ( * release_ts_feed ) ( struct dmx_demux * demux ,
2005-04-17 02:20:36 +04:00
struct dmx_ts_feed * feed ) ;
2005-12-12 11:37:27 +03:00
int ( * allocate_section_feed ) ( struct dmx_demux * demux ,
2005-04-17 02:20:36 +04:00
struct dmx_section_feed * * feed ,
dmx_section_cb callback ) ;
2005-12-12 11:37:27 +03:00
int ( * release_section_feed ) ( struct dmx_demux * demux ,
2005-04-17 02:20:36 +04:00
struct dmx_section_feed * feed ) ;
2005-12-12 11:37:27 +03:00
int ( * add_frontend ) ( struct dmx_demux * demux ,
2005-04-17 02:20:36 +04:00
struct dmx_frontend * frontend ) ;
2005-12-12 11:37:27 +03:00
int ( * remove_frontend ) ( struct dmx_demux * demux ,
2005-04-17 02:20:36 +04:00
struct dmx_frontend * frontend ) ;
2005-12-12 11:37:27 +03:00
struct list_head * ( * get_frontends ) ( struct dmx_demux * demux ) ;
int ( * connect_frontend ) ( struct dmx_demux * demux ,
2005-04-17 02:20:36 +04:00
struct dmx_frontend * frontend ) ;
2005-12-12 11:37:27 +03:00
int ( * disconnect_frontend ) ( struct dmx_demux * demux ) ;
2005-04-17 02:20:36 +04:00
2005-12-12 11:37:27 +03:00
int ( * get_pes_pids ) ( struct dmx_demux * demux , u16 * pids ) ;
2005-04-17 02:20:36 +04:00
2005-09-10 00:02:21 +04:00
int ( * get_caps ) ( struct dmx_demux * demux , struct dmx_caps * caps ) ;
int ( * set_source ) ( struct dmx_demux * demux , const dmx_source_t * src ) ;
2005-12-12 11:37:27 +03:00
int ( * get_stc ) ( struct dmx_demux * demux , unsigned int num ,
2005-04-17 02:20:36 +04:00
u64 * stc , unsigned int * base ) ;
} ;
# endif /* #ifndef __DEMUX_H */