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