1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * dmxdev.h 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * Copyright (C) 2000 Ralph Metzler & Marcus Metzler 5*4882a593Smuzhiyun * for convergence integrated media GmbH 6*4882a593Smuzhiyun * 7*4882a593Smuzhiyun * This program is free software; you can redistribute it and/or 8*4882a593Smuzhiyun * modify it under the terms of the GNU Lesser General Public License 9*4882a593Smuzhiyun * as published by the Free Software Foundation; either version 2.1 10*4882a593Smuzhiyun * of the License, or (at your option) any later version. 11*4882a593Smuzhiyun * 12*4882a593Smuzhiyun * This program is distributed in the hope that it will be useful, 13*4882a593Smuzhiyun * but WITHOUT ANY WARRANTY; without even the implied warranty of 14*4882a593Smuzhiyun * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15*4882a593Smuzhiyun * GNU General Public License for more details. 16*4882a593Smuzhiyun * 17*4882a593Smuzhiyun */ 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun #ifndef _DMXDEV_H_ 20*4882a593Smuzhiyun #define _DMXDEV_H_ 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun #include <linux/types.h> 23*4882a593Smuzhiyun #include <linux/spinlock.h> 24*4882a593Smuzhiyun #include <linux/kernel.h> 25*4882a593Smuzhiyun #include <linux/time.h> 26*4882a593Smuzhiyun #include <linux/timer.h> 27*4882a593Smuzhiyun #include <linux/wait.h> 28*4882a593Smuzhiyun #include <linux/fs.h> 29*4882a593Smuzhiyun #include <linux/string.h> 30*4882a593Smuzhiyun #include <linux/mutex.h> 31*4882a593Smuzhiyun #include <linux/slab.h> 32*4882a593Smuzhiyun 33*4882a593Smuzhiyun #include <linux/dvb/dmx.h> 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun #include <media/dvbdev.h> 36*4882a593Smuzhiyun #include <media/demux.h> 37*4882a593Smuzhiyun #include <media/dvb_ringbuffer.h> 38*4882a593Smuzhiyun #include <media/dvb_vb2.h> 39*4882a593Smuzhiyun 40*4882a593Smuzhiyun /** 41*4882a593Smuzhiyun * enum dmxdev_type - type of demux filter type. 42*4882a593Smuzhiyun * 43*4882a593Smuzhiyun * @DMXDEV_TYPE_NONE: no filter set. 44*4882a593Smuzhiyun * @DMXDEV_TYPE_SEC: section filter. 45*4882a593Smuzhiyun * @DMXDEV_TYPE_PES: Program Elementary Stream (PES) filter. 46*4882a593Smuzhiyun */ 47*4882a593Smuzhiyun enum dmxdev_type { 48*4882a593Smuzhiyun DMXDEV_TYPE_NONE, 49*4882a593Smuzhiyun DMXDEV_TYPE_SEC, 50*4882a593Smuzhiyun DMXDEV_TYPE_PES, 51*4882a593Smuzhiyun }; 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun /** 54*4882a593Smuzhiyun * enum dmxdev_state - state machine for the dmxdev. 55*4882a593Smuzhiyun * 56*4882a593Smuzhiyun * @DMXDEV_STATE_FREE: indicates that the filter is freed. 57*4882a593Smuzhiyun * @DMXDEV_STATE_ALLOCATED: indicates that the filter was allocated 58*4882a593Smuzhiyun * to be used. 59*4882a593Smuzhiyun * @DMXDEV_STATE_SET: indicates that the filter parameters are set. 60*4882a593Smuzhiyun * @DMXDEV_STATE_GO: indicates that the filter is running. 61*4882a593Smuzhiyun * @DMXDEV_STATE_DONE: indicates that a packet was already filtered 62*4882a593Smuzhiyun * and the filter is now disabled. 63*4882a593Smuzhiyun * Set only if %DMX_ONESHOT. See 64*4882a593Smuzhiyun * &dmx_sct_filter_params. 65*4882a593Smuzhiyun * @DMXDEV_STATE_TIMEDOUT: Indicates a timeout condition. 66*4882a593Smuzhiyun */ 67*4882a593Smuzhiyun enum dmxdev_state { 68*4882a593Smuzhiyun DMXDEV_STATE_FREE, 69*4882a593Smuzhiyun DMXDEV_STATE_ALLOCATED, 70*4882a593Smuzhiyun DMXDEV_STATE_SET, 71*4882a593Smuzhiyun DMXDEV_STATE_GO, 72*4882a593Smuzhiyun DMXDEV_STATE_DONE, 73*4882a593Smuzhiyun DMXDEV_STATE_TIMEDOUT 74*4882a593Smuzhiyun }; 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun /** 77*4882a593Smuzhiyun * struct dmxdev_feed - digital TV dmxdev feed 78*4882a593Smuzhiyun * 79*4882a593Smuzhiyun * @pid: Program ID to be filtered 80*4882a593Smuzhiyun * @ts: pointer to &struct dmx_ts_feed 81*4882a593Smuzhiyun * @next: &struct list_head pointing to the next feed. 82*4882a593Smuzhiyun */ 83*4882a593Smuzhiyun 84*4882a593Smuzhiyun struct dmxdev_feed { 85*4882a593Smuzhiyun u16 pid; 86*4882a593Smuzhiyun struct dmx_ts_feed *ts; 87*4882a593Smuzhiyun struct list_head next; 88*4882a593Smuzhiyun }; 89*4882a593Smuzhiyun 90*4882a593Smuzhiyun /** 91*4882a593Smuzhiyun * struct dmxdev_filter - digital TV dmxdev filter 92*4882a593Smuzhiyun * 93*4882a593Smuzhiyun * @filter: a union describing a dmxdev filter. 94*4882a593Smuzhiyun * Currently used only for section filters. 95*4882a593Smuzhiyun * @filter.sec: a &struct dmx_section_filter pointer. 96*4882a593Smuzhiyun * For section filter only. 97*4882a593Smuzhiyun * @feed: a union describing a dmxdev feed. 98*4882a593Smuzhiyun * Depending on the filter type, it can be either 99*4882a593Smuzhiyun * @feed.ts or @feed.sec. 100*4882a593Smuzhiyun * @feed.ts: a &struct list_head list. 101*4882a593Smuzhiyun * For TS and PES feeds. 102*4882a593Smuzhiyun * @feed.sec: a &struct dmx_section_feed pointer. 103*4882a593Smuzhiyun * For section feed only. 104*4882a593Smuzhiyun * @params: a union describing dmxdev filter parameters. 105*4882a593Smuzhiyun * Depending on the filter type, it can be either 106*4882a593Smuzhiyun * @params.sec or @params.pes. 107*4882a593Smuzhiyun * @params.sec: a &struct dmx_sct_filter_params embedded struct. 108*4882a593Smuzhiyun * For section filter only. 109*4882a593Smuzhiyun * @params.pes: a &struct dmx_pes_filter_params embedded struct. 110*4882a593Smuzhiyun * For PES filter only. 111*4882a593Smuzhiyun * @type: type of the dmxdev filter, as defined by &enum dmxdev_type. 112*4882a593Smuzhiyun * @state: state of the dmxdev filter, as defined by &enum dmxdev_state. 113*4882a593Smuzhiyun * @dev: pointer to &struct dmxdev. 114*4882a593Smuzhiyun * @buffer: an embedded &struct dvb_ringbuffer buffer. 115*4882a593Smuzhiyun * @vb2_ctx: control struct for VB2 handler 116*4882a593Smuzhiyun * @mutex: protects the access to &struct dmxdev_filter. 117*4882a593Smuzhiyun * @timer: &struct timer_list embedded timer, used to check for 118*4882a593Smuzhiyun * feed timeouts. 119*4882a593Smuzhiyun * Only for section filter. 120*4882a593Smuzhiyun * @todo: index for the @secheader. 121*4882a593Smuzhiyun * Only for section filter. 122*4882a593Smuzhiyun * @secheader: buffer cache to parse the section header. 123*4882a593Smuzhiyun * Only for section filter. 124*4882a593Smuzhiyun */ 125*4882a593Smuzhiyun struct dmxdev_filter { 126*4882a593Smuzhiyun union { 127*4882a593Smuzhiyun struct dmx_section_filter *sec; 128*4882a593Smuzhiyun } filter; 129*4882a593Smuzhiyun 130*4882a593Smuzhiyun union { 131*4882a593Smuzhiyun /* list of TS and PES feeds (struct dmxdev_feed) */ 132*4882a593Smuzhiyun struct list_head ts; 133*4882a593Smuzhiyun struct dmx_section_feed *sec; 134*4882a593Smuzhiyun } feed; 135*4882a593Smuzhiyun 136*4882a593Smuzhiyun union { 137*4882a593Smuzhiyun struct dmx_sct_filter_params sec; 138*4882a593Smuzhiyun struct dmx_pes_filter_params pes; 139*4882a593Smuzhiyun } params; 140*4882a593Smuzhiyun 141*4882a593Smuzhiyun enum dmxdev_type type; 142*4882a593Smuzhiyun enum dmxdev_state state; 143*4882a593Smuzhiyun struct dmxdev *dev; 144*4882a593Smuzhiyun struct dvb_ringbuffer buffer; 145*4882a593Smuzhiyun struct dvb_vb2_ctx vb2_ctx; 146*4882a593Smuzhiyun 147*4882a593Smuzhiyun struct mutex mutex; 148*4882a593Smuzhiyun 149*4882a593Smuzhiyun /* only for sections */ 150*4882a593Smuzhiyun struct timer_list timer; 151*4882a593Smuzhiyun int todo; 152*4882a593Smuzhiyun u8 secheader[3]; 153*4882a593Smuzhiyun }; 154*4882a593Smuzhiyun 155*4882a593Smuzhiyun /** 156*4882a593Smuzhiyun * struct dmxdev - Describes a digital TV demux device. 157*4882a593Smuzhiyun * 158*4882a593Smuzhiyun * @dvbdev: pointer to &struct dvb_device associated with 159*4882a593Smuzhiyun * the demux device node. 160*4882a593Smuzhiyun * @dvr_dvbdev: pointer to &struct dvb_device associated with 161*4882a593Smuzhiyun * the dvr device node. 162*4882a593Smuzhiyun * @filter: pointer to &struct dmxdev_filter. 163*4882a593Smuzhiyun * @demux: pointer to &struct dmx_demux. 164*4882a593Smuzhiyun * @filternum: number of filters. 165*4882a593Smuzhiyun * @capabilities: demux capabilities as defined by &enum dmx_demux_caps. 166*4882a593Smuzhiyun * @may_do_mmap: flag used to indicate if the device may do mmap. 167*4882a593Smuzhiyun * @exit: flag to indicate that the demux is being released. 168*4882a593Smuzhiyun * @dvr_orig_fe: pointer to &struct dmx_frontend. 169*4882a593Smuzhiyun * @dvr_buffer: embedded &struct dvb_ringbuffer for DVB output. 170*4882a593Smuzhiyun * @dvr_vb2_ctx: control struct for VB2 handler 171*4882a593Smuzhiyun * @mutex: protects the usage of this structure. 172*4882a593Smuzhiyun * @lock: protects access to &dmxdev->filter->data. 173*4882a593Smuzhiyun */ 174*4882a593Smuzhiyun struct dmxdev { 175*4882a593Smuzhiyun struct dvb_device *dvbdev; 176*4882a593Smuzhiyun struct dvb_device *dvr_dvbdev; 177*4882a593Smuzhiyun 178*4882a593Smuzhiyun struct dmxdev_filter *filter; 179*4882a593Smuzhiyun struct dmx_demux *demux; 180*4882a593Smuzhiyun 181*4882a593Smuzhiyun int filternum; 182*4882a593Smuzhiyun int capabilities; 183*4882a593Smuzhiyun 184*4882a593Smuzhiyun unsigned int may_do_mmap:1; 185*4882a593Smuzhiyun unsigned int exit:1; 186*4882a593Smuzhiyun #define DMXDEV_CAP_DUPLEX 1 187*4882a593Smuzhiyun struct dmx_frontend *dvr_orig_fe; 188*4882a593Smuzhiyun 189*4882a593Smuzhiyun struct dvb_ringbuffer dvr_buffer; 190*4882a593Smuzhiyun #define DVR_BUFFER_SIZE (10*188*1024) 191*4882a593Smuzhiyun 192*4882a593Smuzhiyun struct dvb_vb2_ctx dvr_vb2_ctx; 193*4882a593Smuzhiyun 194*4882a593Smuzhiyun struct mutex mutex; 195*4882a593Smuzhiyun spinlock_t lock; 196*4882a593Smuzhiyun }; 197*4882a593Smuzhiyun 198*4882a593Smuzhiyun /** 199*4882a593Smuzhiyun * dvb_dmxdev_init - initializes a digital TV demux and registers both demux 200*4882a593Smuzhiyun * and DVR devices. 201*4882a593Smuzhiyun * 202*4882a593Smuzhiyun * @dmxdev: pointer to &struct dmxdev. 203*4882a593Smuzhiyun * @adap: pointer to &struct dvb_adapter. 204*4882a593Smuzhiyun */ 205*4882a593Smuzhiyun int dvb_dmxdev_init(struct dmxdev *dmxdev, struct dvb_adapter *adap); 206*4882a593Smuzhiyun 207*4882a593Smuzhiyun /** 208*4882a593Smuzhiyun * dvb_dmxdev_release - releases a digital TV demux and unregisters it. 209*4882a593Smuzhiyun * 210*4882a593Smuzhiyun * @dmxdev: pointer to &struct dmxdev. 211*4882a593Smuzhiyun */ 212*4882a593Smuzhiyun void dvb_dmxdev_release(struct dmxdev *dmxdev); 213*4882a593Smuzhiyun 214*4882a593Smuzhiyun #endif /* _DMXDEV_H_ */ 215