/*
 * dmxdev.h
 *
 * Copyright (C) 2000 Ralph Metzler & Marcus 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 _DMXDEV_H_
#define _DMXDEV_H_

#include <linux/types.h>
#include <linux/spinlock.h>
#include <linux/time.h>
#include <linux/timer.h>
#include <linux/wait.h>
#include <linux/fs.h>
#include <linux/string.h>
#include <linux/mutex.h>
#include <linux/slab.h>

#include <linux/dvb/dmx.h>

#include <media/dvbdev.h>
#include <media/demux.h>
#include <media/dvb_ringbuffer.h>
#include <media/dvb_vb2.h>

/**
 * enum dmxdev_type - type of demux filter type.
 *
 * @DMXDEV_TYPE_NONE:	no filter set.
 * @DMXDEV_TYPE_SEC:	section filter.
 * @DMXDEV_TYPE_PES:	Program Elementary Stream (PES) filter.
 */
enum dmxdev_type {
	DMXDEV_TYPE_NONE,
	DMXDEV_TYPE_SEC,
	DMXDEV_TYPE_PES,
};

/**
 * enum dmxdev_state - state machine for the dmxdev.
 *
 * @DMXDEV_STATE_FREE:		indicates that the filter is freed.
 * @DMXDEV_STATE_ALLOCATED:	indicates that the filter was allocated
 *				to be used.
 * @DMXDEV_STATE_SET:		indicates that the filter parameters are set.
 * @DMXDEV_STATE_GO:		indicates that the filter is running.
 * @DMXDEV_STATE_DONE:		indicates that a packet was already filtered
 *				and the filter is now disabled.
 *				Set only if %DMX_ONESHOT. See
 *				&dmx_sct_filter_params.
 * @DMXDEV_STATE_TIMEDOUT:	Indicates a timeout condition.
 */
enum dmxdev_state {
	DMXDEV_STATE_FREE,
	DMXDEV_STATE_ALLOCATED,
	DMXDEV_STATE_SET,
	DMXDEV_STATE_GO,
	DMXDEV_STATE_DONE,
	DMXDEV_STATE_TIMEDOUT
};

/**
 * struct dmxdev_feed - digital TV dmxdev feed
 *
 * @pid:	Program ID to be filtered
 * @ts:		pointer to &struct dmx_ts_feed
 * @next:	&struct list_head pointing to the next feed.
 */

struct dmxdev_feed {
	u16 pid;
	struct dmx_ts_feed *ts;
	struct list_head next;
};

/**
 * struct dmxdev_filter - digital TV dmxdev filter
 *
 * @filter:	a union describing a dmxdev filter.
 *		Currently used only for section filters.
 * @filter.sec: a &struct dmx_section_filter pointer.
 *		For section filter only.
 * @feed:	a union describing a dmxdev feed.
 *		Depending on the filter type, it can be either
 *		@feed.ts or @feed.sec.
 * @feed.ts:	a &struct list_head list.
 *		For TS and PES feeds.
 * @feed.sec:	a &struct dmx_section_feed pointer.
 *		For section feed only.
 * @params:	a union describing dmxdev filter parameters.
 *		Depending on the filter type, it can be either
 *		@params.sec or @params.pes.
 * @params.sec:	a &struct dmx_sct_filter_params embedded struct.
 *		For section filter only.
 * @params.pes:	a &struct dmx_pes_filter_params embedded struct.
 *		For PES filter only.
 * @type:	type of the dmxdev filter, as defined by &enum dmxdev_type.
 * @state:	state of the dmxdev filter, as defined by &enum dmxdev_state.
 * @dev:	pointer to &struct dmxdev.
 * @buffer:	an embedded &struct dvb_ringbuffer buffer.
 * @vb2_ctx:	control struct for VB2 handler
 * @mutex:	protects the access to &struct dmxdev_filter.
 * @timer:	&struct timer_list embedded timer, used to check for
 *		feed timeouts.
 *		Only for section filter.
 * @todo:	index for the @secheader.
 *		Only for section filter.
 * @secheader:	buffer cache to parse the section header.
 *		Only for section filter.
 */
struct dmxdev_filter {
	union {
		struct dmx_section_filter *sec;
	} filter;

	union {
		/* list of TS and PES feeds (struct dmxdev_feed) */
		struct list_head ts;
		struct dmx_section_feed *sec;
	} feed;

	union {
		struct dmx_sct_filter_params sec;
		struct dmx_pes_filter_params pes;
	} params;

	enum dmxdev_type type;
	enum dmxdev_state state;
	struct dmxdev *dev;
	struct dvb_ringbuffer buffer;
	struct dvb_vb2_ctx vb2_ctx;

	struct mutex mutex;

	/* only for sections */
	struct timer_list timer;
	int todo;
	u8 secheader[3];
};

/**
 * struct dmxdev - Describes a digital TV demux device.
 *
 * @dvbdev:		pointer to &struct dvb_device associated with
 *			the demux device node.
 * @dvr_dvbdev:		pointer to &struct dvb_device associated with
 *			the dvr device node.
 * @filter:		pointer to &struct dmxdev_filter.
 * @demux:		pointer to &struct dmx_demux.
 * @filternum:		number of filters.
 * @capabilities:	demux capabilities as defined by &enum dmx_demux_caps.
 * @may_do_mmap:	flag used to indicate if the device may do mmap.
 * @exit:		flag to indicate that the demux is being released.
 * @dvr_orig_fe:	pointer to &struct dmx_frontend.
 * @dvr_buffer:		embedded &struct dvb_ringbuffer for DVB output.
 * @dvr_vb2_ctx:	control struct for VB2 handler
 * @mutex:		protects the usage of this structure.
 * @lock:		protects access to &dmxdev->filter->data.
 */
struct dmxdev {
	struct dvb_device *dvbdev;
	struct dvb_device *dvr_dvbdev;

	struct dmxdev_filter *filter;
	struct dmx_demux *demux;

	int filternum;
	int capabilities;

	unsigned int may_do_mmap:1;
	unsigned int exit:1;
#define DMXDEV_CAP_DUPLEX 1
	struct dmx_frontend *dvr_orig_fe;

	struct dvb_ringbuffer dvr_buffer;
#define DVR_BUFFER_SIZE (10*188*1024)

	struct dvb_vb2_ctx dvr_vb2_ctx;

	struct mutex mutex;
	spinlock_t lock;
};

/**
 * dvb_dmxdev_init - initializes a digital TV demux and registers both demux
 *	and DVR devices.
 *
 * @dmxdev: pointer to &struct dmxdev.
 * @adap: pointer to &struct dvb_adapter.
 */
int dvb_dmxdev_init(struct dmxdev *dmxdev, struct dvb_adapter *adap);

/**
 * dvb_dmxdev_release - releases a digital TV demux and unregisters it.
 *
 * @dmxdev: pointer to &struct dmxdev.
 */
void dvb_dmxdev_release(struct dmxdev *dmxdev);

#endif /* _DMXDEV_H_ */
