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/time.h> |
25 | #include <linux/timer.h> |
26 | #include <linux/wait.h> |
27 | #include <linux/fs.h> |
28 | #include <linux/string.h> |
29 | #include <linux/mutex.h> |
30 | #include <linux/slab.h> |
31 | |
32 | #include <linux/dvb/dmx.h> |
33 | |
34 | #include <media/dvbdev.h> |
35 | #include <media/demux.h> |
36 | #include <media/dvb_ringbuffer.h> |
37 | #include <media/dvb_vb2.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 | */ |
46 | enum 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 | */ |
66 | enum 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 | |
83 | struct 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 union describing a dmxdev filter. |
93 | * Currently used only for section filters. |
94 | * @filter.sec: a &struct dmx_section_filter pointer. |
95 | * For section filter only. |
96 | * @feed: a union describing a dmxdev feed. |
97 | * Depending on the filter type, it can be either |
98 | * @feed.ts or @feed.sec. |
99 | * @feed.ts: a &struct list_head list. |
100 | * For TS and PES feeds. |
101 | * @feed.sec: a &struct dmx_section_feed pointer. |
102 | * For section feed only. |
103 | * @params: a union describing dmxdev filter parameters. |
104 | * Depending on the filter type, it can be either |
105 | * @params.sec or @params.pes. |
106 | * @params.sec: a &struct dmx_sct_filter_params embedded struct. |
107 | * For section filter only. |
108 | * @params.pes: a &struct dmx_pes_filter_params embedded struct. |
109 | * For PES filter only. |
110 | * @type: type of the dmxdev filter, as defined by &enum dmxdev_type. |
111 | * @state: state of the dmxdev filter, as defined by &enum dmxdev_state. |
112 | * @dev: pointer to &struct dmxdev. |
113 | * @buffer: an embedded &struct dvb_ringbuffer buffer. |
114 | * @vb2_ctx: control struct for VB2 handler |
115 | * @mutex: protects the access to &struct dmxdev_filter. |
116 | * @timer: &struct timer_list embedded timer, used to check for |
117 | * feed timeouts. |
118 | * Only for section filter. |
119 | * @todo: index for the @secheader. |
120 | * Only for section filter. |
121 | * @secheader: buffer cache to parse the section header. |
122 | * Only for section filter. |
123 | */ |
124 | struct dmxdev_filter { |
125 | union { |
126 | struct dmx_section_filter *sec; |
127 | } filter; |
128 | |
129 | union { |
130 | /* list of TS and PES feeds (struct dmxdev_feed) */ |
131 | struct list_head ts; |
132 | struct dmx_section_feed *sec; |
133 | } feed; |
134 | |
135 | union { |
136 | struct dmx_sct_filter_params sec; |
137 | struct dmx_pes_filter_params pes; |
138 | } params; |
139 | |
140 | enum dmxdev_type type; |
141 | enum dmxdev_state state; |
142 | struct dmxdev *dev; |
143 | struct dvb_ringbuffer buffer; |
144 | struct dvb_vb2_ctx vb2_ctx; |
145 | |
146 | struct mutex mutex; |
147 | |
148 | /* only for sections */ |
149 | struct timer_list timer; |
150 | int todo; |
151 | u8 [3]; |
152 | }; |
153 | |
154 | /** |
155 | * struct dmxdev - Describes a digital TV demux device. |
156 | * |
157 | * @dvbdev: pointer to &struct dvb_device associated with |
158 | * the demux device node. |
159 | * @dvr_dvbdev: pointer to &struct dvb_device associated with |
160 | * the dvr device node. |
161 | * @filter: pointer to &struct dmxdev_filter. |
162 | * @demux: pointer to &struct dmx_demux. |
163 | * @filternum: number of filters. |
164 | * @capabilities: demux capabilities as defined by &enum dmx_demux_caps. |
165 | * @may_do_mmap: flag used to indicate if the device may do mmap. |
166 | * @exit: flag to indicate that the demux is being released. |
167 | * @dvr_orig_fe: pointer to &struct dmx_frontend. |
168 | * @dvr_buffer: embedded &struct dvb_ringbuffer for DVB output. |
169 | * @dvr_vb2_ctx: control struct for VB2 handler |
170 | * @mutex: protects the usage of this structure. |
171 | * @lock: protects access to &dmxdev->filter->data. |
172 | */ |
173 | struct dmxdev { |
174 | struct dvb_device *dvbdev; |
175 | struct dvb_device *dvr_dvbdev; |
176 | |
177 | struct dmxdev_filter *filter; |
178 | struct dmx_demux *demux; |
179 | |
180 | int filternum; |
181 | int capabilities; |
182 | |
183 | unsigned int may_do_mmap:1; |
184 | unsigned int exit:1; |
185 | #define DMXDEV_CAP_DUPLEX 1 |
186 | struct dmx_frontend *dvr_orig_fe; |
187 | |
188 | struct dvb_ringbuffer dvr_buffer; |
189 | #define DVR_BUFFER_SIZE (10*188*1024) |
190 | |
191 | struct dvb_vb2_ctx dvr_vb2_ctx; |
192 | |
193 | struct mutex mutex; |
194 | spinlock_t lock; |
195 | }; |
196 | |
197 | /** |
198 | * dvb_dmxdev_init - initializes a digital TV demux and registers both demux |
199 | * and DVR devices. |
200 | * |
201 | * @dmxdev: pointer to &struct dmxdev. |
202 | * @adap: pointer to &struct dvb_adapter. |
203 | */ |
204 | int dvb_dmxdev_init(struct dmxdev *dmxdev, struct dvb_adapter *adap); |
205 | |
206 | /** |
207 | * dvb_dmxdev_release - releases a digital TV demux and unregisters it. |
208 | * |
209 | * @dmxdev: pointer to &struct dmxdev. |
210 | */ |
211 | void dvb_dmxdev_release(struct dmxdev *dmxdev); |
212 | |
213 | #endif /* _DMXDEV_H_ */ |
214 | |