162306a36Sopenharmony_ci/* 262306a36Sopenharmony_ci * dmxdev.h 362306a36Sopenharmony_ci * 462306a36Sopenharmony_ci * Copyright (C) 2000 Ralph Metzler & Marcus Metzler 562306a36Sopenharmony_ci * for convergence integrated media GmbH 662306a36Sopenharmony_ci * 762306a36Sopenharmony_ci * This program is free software; you can redistribute it and/or 862306a36Sopenharmony_ci * modify it under the terms of the GNU Lesser General Public License 962306a36Sopenharmony_ci * as published by the Free Software Foundation; either version 2.1 1062306a36Sopenharmony_ci * of the License, or (at your option) any later version. 1162306a36Sopenharmony_ci * 1262306a36Sopenharmony_ci * This program is distributed in the hope that it will be useful, 1362306a36Sopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 1462306a36Sopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1562306a36Sopenharmony_ci * GNU General Public License for more details. 1662306a36Sopenharmony_ci * 1762306a36Sopenharmony_ci */ 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ci#ifndef _DMXDEV_H_ 2062306a36Sopenharmony_ci#define _DMXDEV_H_ 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci#include <linux/types.h> 2362306a36Sopenharmony_ci#include <linux/spinlock.h> 2462306a36Sopenharmony_ci#include <linux/time.h> 2562306a36Sopenharmony_ci#include <linux/timer.h> 2662306a36Sopenharmony_ci#include <linux/wait.h> 2762306a36Sopenharmony_ci#include <linux/fs.h> 2862306a36Sopenharmony_ci#include <linux/string.h> 2962306a36Sopenharmony_ci#include <linux/mutex.h> 3062306a36Sopenharmony_ci#include <linux/slab.h> 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ci#include <linux/dvb/dmx.h> 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ci#include <media/dvbdev.h> 3562306a36Sopenharmony_ci#include <media/demux.h> 3662306a36Sopenharmony_ci#include <media/dvb_ringbuffer.h> 3762306a36Sopenharmony_ci#include <media/dvb_vb2.h> 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ci/** 4062306a36Sopenharmony_ci * enum dmxdev_type - type of demux filter type. 4162306a36Sopenharmony_ci * 4262306a36Sopenharmony_ci * @DMXDEV_TYPE_NONE: no filter set. 4362306a36Sopenharmony_ci * @DMXDEV_TYPE_SEC: section filter. 4462306a36Sopenharmony_ci * @DMXDEV_TYPE_PES: Program Elementary Stream (PES) filter. 4562306a36Sopenharmony_ci */ 4662306a36Sopenharmony_cienum dmxdev_type { 4762306a36Sopenharmony_ci DMXDEV_TYPE_NONE, 4862306a36Sopenharmony_ci DMXDEV_TYPE_SEC, 4962306a36Sopenharmony_ci DMXDEV_TYPE_PES, 5062306a36Sopenharmony_ci}; 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_ci/** 5362306a36Sopenharmony_ci * enum dmxdev_state - state machine for the dmxdev. 5462306a36Sopenharmony_ci * 5562306a36Sopenharmony_ci * @DMXDEV_STATE_FREE: indicates that the filter is freed. 5662306a36Sopenharmony_ci * @DMXDEV_STATE_ALLOCATED: indicates that the filter was allocated 5762306a36Sopenharmony_ci * to be used. 5862306a36Sopenharmony_ci * @DMXDEV_STATE_SET: indicates that the filter parameters are set. 5962306a36Sopenharmony_ci * @DMXDEV_STATE_GO: indicates that the filter is running. 6062306a36Sopenharmony_ci * @DMXDEV_STATE_DONE: indicates that a packet was already filtered 6162306a36Sopenharmony_ci * and the filter is now disabled. 6262306a36Sopenharmony_ci * Set only if %DMX_ONESHOT. See 6362306a36Sopenharmony_ci * &dmx_sct_filter_params. 6462306a36Sopenharmony_ci * @DMXDEV_STATE_TIMEDOUT: Indicates a timeout condition. 6562306a36Sopenharmony_ci */ 6662306a36Sopenharmony_cienum dmxdev_state { 6762306a36Sopenharmony_ci DMXDEV_STATE_FREE, 6862306a36Sopenharmony_ci DMXDEV_STATE_ALLOCATED, 6962306a36Sopenharmony_ci DMXDEV_STATE_SET, 7062306a36Sopenharmony_ci DMXDEV_STATE_GO, 7162306a36Sopenharmony_ci DMXDEV_STATE_DONE, 7262306a36Sopenharmony_ci DMXDEV_STATE_TIMEDOUT 7362306a36Sopenharmony_ci}; 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_ci/** 7662306a36Sopenharmony_ci * struct dmxdev_feed - digital TV dmxdev feed 7762306a36Sopenharmony_ci * 7862306a36Sopenharmony_ci * @pid: Program ID to be filtered 7962306a36Sopenharmony_ci * @ts: pointer to &struct dmx_ts_feed 8062306a36Sopenharmony_ci * @next: &struct list_head pointing to the next feed. 8162306a36Sopenharmony_ci */ 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_cistruct dmxdev_feed { 8462306a36Sopenharmony_ci u16 pid; 8562306a36Sopenharmony_ci struct dmx_ts_feed *ts; 8662306a36Sopenharmony_ci struct list_head next; 8762306a36Sopenharmony_ci}; 8862306a36Sopenharmony_ci 8962306a36Sopenharmony_ci/** 9062306a36Sopenharmony_ci * struct dmxdev_filter - digital TV dmxdev filter 9162306a36Sopenharmony_ci * 9262306a36Sopenharmony_ci * @filter: a union describing a dmxdev filter. 9362306a36Sopenharmony_ci * Currently used only for section filters. 9462306a36Sopenharmony_ci * @filter.sec: a &struct dmx_section_filter pointer. 9562306a36Sopenharmony_ci * For section filter only. 9662306a36Sopenharmony_ci * @feed: a union describing a dmxdev feed. 9762306a36Sopenharmony_ci * Depending on the filter type, it can be either 9862306a36Sopenharmony_ci * @feed.ts or @feed.sec. 9962306a36Sopenharmony_ci * @feed.ts: a &struct list_head list. 10062306a36Sopenharmony_ci * For TS and PES feeds. 10162306a36Sopenharmony_ci * @feed.sec: a &struct dmx_section_feed pointer. 10262306a36Sopenharmony_ci * For section feed only. 10362306a36Sopenharmony_ci * @params: a union describing dmxdev filter parameters. 10462306a36Sopenharmony_ci * Depending on the filter type, it can be either 10562306a36Sopenharmony_ci * @params.sec or @params.pes. 10662306a36Sopenharmony_ci * @params.sec: a &struct dmx_sct_filter_params embedded struct. 10762306a36Sopenharmony_ci * For section filter only. 10862306a36Sopenharmony_ci * @params.pes: a &struct dmx_pes_filter_params embedded struct. 10962306a36Sopenharmony_ci * For PES filter only. 11062306a36Sopenharmony_ci * @type: type of the dmxdev filter, as defined by &enum dmxdev_type. 11162306a36Sopenharmony_ci * @state: state of the dmxdev filter, as defined by &enum dmxdev_state. 11262306a36Sopenharmony_ci * @dev: pointer to &struct dmxdev. 11362306a36Sopenharmony_ci * @buffer: an embedded &struct dvb_ringbuffer buffer. 11462306a36Sopenharmony_ci * @vb2_ctx: control struct for VB2 handler 11562306a36Sopenharmony_ci * @mutex: protects the access to &struct dmxdev_filter. 11662306a36Sopenharmony_ci * @timer: &struct timer_list embedded timer, used to check for 11762306a36Sopenharmony_ci * feed timeouts. 11862306a36Sopenharmony_ci * Only for section filter. 11962306a36Sopenharmony_ci * @todo: index for the @secheader. 12062306a36Sopenharmony_ci * Only for section filter. 12162306a36Sopenharmony_ci * @secheader: buffer cache to parse the section header. 12262306a36Sopenharmony_ci * Only for section filter. 12362306a36Sopenharmony_ci */ 12462306a36Sopenharmony_cistruct dmxdev_filter { 12562306a36Sopenharmony_ci union { 12662306a36Sopenharmony_ci struct dmx_section_filter *sec; 12762306a36Sopenharmony_ci } filter; 12862306a36Sopenharmony_ci 12962306a36Sopenharmony_ci union { 13062306a36Sopenharmony_ci /* list of TS and PES feeds (struct dmxdev_feed) */ 13162306a36Sopenharmony_ci struct list_head ts; 13262306a36Sopenharmony_ci struct dmx_section_feed *sec; 13362306a36Sopenharmony_ci } feed; 13462306a36Sopenharmony_ci 13562306a36Sopenharmony_ci union { 13662306a36Sopenharmony_ci struct dmx_sct_filter_params sec; 13762306a36Sopenharmony_ci struct dmx_pes_filter_params pes; 13862306a36Sopenharmony_ci } params; 13962306a36Sopenharmony_ci 14062306a36Sopenharmony_ci enum dmxdev_type type; 14162306a36Sopenharmony_ci enum dmxdev_state state; 14262306a36Sopenharmony_ci struct dmxdev *dev; 14362306a36Sopenharmony_ci struct dvb_ringbuffer buffer; 14462306a36Sopenharmony_ci struct dvb_vb2_ctx vb2_ctx; 14562306a36Sopenharmony_ci 14662306a36Sopenharmony_ci struct mutex mutex; 14762306a36Sopenharmony_ci 14862306a36Sopenharmony_ci /* only for sections */ 14962306a36Sopenharmony_ci struct timer_list timer; 15062306a36Sopenharmony_ci int todo; 15162306a36Sopenharmony_ci u8 secheader[3]; 15262306a36Sopenharmony_ci}; 15362306a36Sopenharmony_ci 15462306a36Sopenharmony_ci/** 15562306a36Sopenharmony_ci * struct dmxdev - Describes a digital TV demux device. 15662306a36Sopenharmony_ci * 15762306a36Sopenharmony_ci * @dvbdev: pointer to &struct dvb_device associated with 15862306a36Sopenharmony_ci * the demux device node. 15962306a36Sopenharmony_ci * @dvr_dvbdev: pointer to &struct dvb_device associated with 16062306a36Sopenharmony_ci * the dvr device node. 16162306a36Sopenharmony_ci * @filter: pointer to &struct dmxdev_filter. 16262306a36Sopenharmony_ci * @demux: pointer to &struct dmx_demux. 16362306a36Sopenharmony_ci * @filternum: number of filters. 16462306a36Sopenharmony_ci * @capabilities: demux capabilities as defined by &enum dmx_demux_caps. 16562306a36Sopenharmony_ci * @may_do_mmap: flag used to indicate if the device may do mmap. 16662306a36Sopenharmony_ci * @exit: flag to indicate that the demux is being released. 16762306a36Sopenharmony_ci * @dvr_orig_fe: pointer to &struct dmx_frontend. 16862306a36Sopenharmony_ci * @dvr_buffer: embedded &struct dvb_ringbuffer for DVB output. 16962306a36Sopenharmony_ci * @dvr_vb2_ctx: control struct for VB2 handler 17062306a36Sopenharmony_ci * @mutex: protects the usage of this structure. 17162306a36Sopenharmony_ci * @lock: protects access to &dmxdev->filter->data. 17262306a36Sopenharmony_ci */ 17362306a36Sopenharmony_cistruct dmxdev { 17462306a36Sopenharmony_ci struct dvb_device *dvbdev; 17562306a36Sopenharmony_ci struct dvb_device *dvr_dvbdev; 17662306a36Sopenharmony_ci 17762306a36Sopenharmony_ci struct dmxdev_filter *filter; 17862306a36Sopenharmony_ci struct dmx_demux *demux; 17962306a36Sopenharmony_ci 18062306a36Sopenharmony_ci int filternum; 18162306a36Sopenharmony_ci int capabilities; 18262306a36Sopenharmony_ci 18362306a36Sopenharmony_ci unsigned int may_do_mmap:1; 18462306a36Sopenharmony_ci unsigned int exit:1; 18562306a36Sopenharmony_ci#define DMXDEV_CAP_DUPLEX 1 18662306a36Sopenharmony_ci struct dmx_frontend *dvr_orig_fe; 18762306a36Sopenharmony_ci 18862306a36Sopenharmony_ci struct dvb_ringbuffer dvr_buffer; 18962306a36Sopenharmony_ci#define DVR_BUFFER_SIZE (10*188*1024) 19062306a36Sopenharmony_ci 19162306a36Sopenharmony_ci struct dvb_vb2_ctx dvr_vb2_ctx; 19262306a36Sopenharmony_ci 19362306a36Sopenharmony_ci struct mutex mutex; 19462306a36Sopenharmony_ci spinlock_t lock; 19562306a36Sopenharmony_ci}; 19662306a36Sopenharmony_ci 19762306a36Sopenharmony_ci/** 19862306a36Sopenharmony_ci * dvb_dmxdev_init - initializes a digital TV demux and registers both demux 19962306a36Sopenharmony_ci * and DVR devices. 20062306a36Sopenharmony_ci * 20162306a36Sopenharmony_ci * @dmxdev: pointer to &struct dmxdev. 20262306a36Sopenharmony_ci * @adap: pointer to &struct dvb_adapter. 20362306a36Sopenharmony_ci */ 20462306a36Sopenharmony_ciint dvb_dmxdev_init(struct dmxdev *dmxdev, struct dvb_adapter *adap); 20562306a36Sopenharmony_ci 20662306a36Sopenharmony_ci/** 20762306a36Sopenharmony_ci * dvb_dmxdev_release - releases a digital TV demux and unregisters it. 20862306a36Sopenharmony_ci * 20962306a36Sopenharmony_ci * @dmxdev: pointer to &struct dmxdev. 21062306a36Sopenharmony_ci */ 21162306a36Sopenharmony_civoid dvb_dmxdev_release(struct dmxdev *dmxdev); 21262306a36Sopenharmony_ci 21362306a36Sopenharmony_ci#endif /* _DMXDEV_H_ */ 214