1 | /*
|
---|
2 | * dv1394.h - DV input/output over IEEE 1394 on OHCI chips
|
---|
3 | * Copyright (C)2001 Daniel Maas <dmaas@dcine.com>
|
---|
4 | * receive, proc_fs by Dan Dennedy <dan@dennedy.org>
|
---|
5 | *
|
---|
6 | * based on:
|
---|
7 | * video1394.h - driver for OHCI 1394 boards
|
---|
8 | * Copyright (C)1999,2000 Sebastien Rougeaux <sebastien.rougeaux@anu.edu.au>
|
---|
9 | * Peter Schlaile <udbz@rz.uni-karlsruhe.de>
|
---|
10 | *
|
---|
11 | * This program is free software; you can redistribute it and/or modify
|
---|
12 | * it under the terms of the GNU General Public License as published by
|
---|
13 | * the Free Software Foundation; either version 2 of the License, or
|
---|
14 | * (at your option) any later version.
|
---|
15 | *
|
---|
16 | * This program is distributed in the hope that it will be useful,
|
---|
17 | * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
---|
18 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
---|
19 | * GNU General Public License for more details.
|
---|
20 | *
|
---|
21 | * You should have received a copy of the GNU General Public License
|
---|
22 | * along with this program; if not, write to the Free Software Foundation,
|
---|
23 | * Inc.,51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
---|
24 | *
|
---|
25 | */
|
---|
26 |
|
---|
27 | #ifndef _DV_1394_H
|
---|
28 | #define _DV_1394_H
|
---|
29 |
|
---|
30 | #define DV1394_DEFAULT_CHANNEL 63
|
---|
31 | #define DV1394_DEFAULT_CARD 0
|
---|
32 | #define DV1394_RING_FRAMES 20
|
---|
33 |
|
---|
34 | #define DV1394_WIDTH 720
|
---|
35 | #define DV1394_NTSC_HEIGHT 480
|
---|
36 | #define DV1394_PAL_HEIGHT 576
|
---|
37 |
|
---|
38 | /* This is the public user-space interface. Try not to break it. */
|
---|
39 |
|
---|
40 | #define DV1394_API_VERSION 0x20011127
|
---|
41 |
|
---|
42 | /* ********************
|
---|
43 | ** **
|
---|
44 | ** DV1394 API **
|
---|
45 | ** **
|
---|
46 | ********************
|
---|
47 |
|
---|
48 | There are two methods of operating the DV1394 DV output device.
|
---|
49 |
|
---|
50 | 1)
|
---|
51 |
|
---|
52 | The simplest is an interface based on write(): simply write
|
---|
53 | full DV frames of data to the device, and they will be transmitted
|
---|
54 | as quickly as possible. The FD may be set for non-blocking I/O,
|
---|
55 | in which case you can use select() or poll() to wait for output
|
---|
56 | buffer space.
|
---|
57 |
|
---|
58 | To set the DV output parameters (e.g. whether you want NTSC or PAL
|
---|
59 | video), use the DV1394_INIT ioctl, passing in the parameters you
|
---|
60 | want in a struct dv1394_init.
|
---|
61 |
|
---|
62 | Example 1:
|
---|
63 | To play a raw .DV file: cat foo.DV > /dev/dv1394
|
---|
64 | (cat will use write() internally)
|
---|
65 |
|
---|
66 | Example 2:
|
---|
67 | static struct dv1394_init init = {
|
---|
68 | 0x63, (broadcast channel)
|
---|
69 | 4, (four-frame ringbuffer)
|
---|
70 | DV1394_NTSC, (send NTSC video)
|
---|
71 | 0, 0 (default empty packet rate)
|
---|
72 | }
|
---|
73 |
|
---|
74 | ioctl(fd, DV1394_INIT, &init);
|
---|
75 |
|
---|
76 | while(1) {
|
---|
77 | read( <a raw DV file>, buf, DV1394_NTSC_FRAME_SIZE );
|
---|
78 | write( <the dv1394 FD>, buf, DV1394_NTSC_FRAME_SIZE );
|
---|
79 | }
|
---|
80 |
|
---|
81 | 2)
|
---|
82 |
|
---|
83 | For more control over buffering, and to avoid unnecessary copies
|
---|
84 | of the DV data, you can use the more sophisticated the mmap() interface.
|
---|
85 | First, call the DV1394_INIT ioctl to specify your parameters,
|
---|
86 | including the number of frames in the ringbuffer. Then, calling mmap()
|
---|
87 | on the dv1394 device will give you direct access to the ringbuffer
|
---|
88 | from which the DV card reads your frame data.
|
---|
89 |
|
---|
90 | The ringbuffer is simply one large, contiguous region of memory
|
---|
91 | containing two or more frames of packed DV data. Each frame of DV data
|
---|
92 | is 120000 bytes (NTSC) or 144000 bytes (PAL).
|
---|
93 |
|
---|
94 | Fill one or more frames in the ringbuffer, then use the DV1394_SUBMIT_FRAMES
|
---|
95 | ioctl to begin I/O. You can use either the DV1394_WAIT_FRAMES ioctl
|
---|
96 | or select()/poll() to wait until the frames are transmitted. Next, you'll
|
---|
97 | need to call the DV1394_GET_STATUS ioctl to determine which ringbuffer
|
---|
98 | frames are clear (ready to be filled with new DV data). Finally, use
|
---|
99 | DV1394_SUBMIT_FRAMES again to send the new data to the DV output.
|
---|
100 |
|
---|
101 |
|
---|
102 | Example: here is what a four-frame ringbuffer might look like
|
---|
103 | during DV transmission:
|
---|
104 |
|
---|
105 |
|
---|
106 | frame 0 frame 1 frame 2 frame 3
|
---|
107 |
|
---|
108 | *--------------------------------------*
|
---|
109 | | CLEAR | DV data | DV data | CLEAR |
|
---|
110 | *--------------------------------------*
|
---|
111 | <ACTIVE>
|
---|
112 |
|
---|
113 | transmission goes in this direction --->>>
|
---|
114 |
|
---|
115 |
|
---|
116 | The DV hardware is currently transmitting the data in frame 1.
|
---|
117 | Once frame 1 is finished, it will automatically transmit frame 2.
|
---|
118 | (if frame 2 finishes before frame 3 is submitted, the device
|
---|
119 | will continue to transmit frame 2, and will increase the dropped_frames
|
---|
120 | counter each time it repeats the transmission).
|
---|
121 |
|
---|
122 |
|
---|
123 | If you called DV1394_GET_STATUS at this instant, you would
|
---|
124 | receive the following values:
|
---|
125 |
|
---|
126 | n_frames = 4
|
---|
127 | active_frame = 1
|
---|
128 | first_clear_frame = 3
|
---|
129 | n_clear_frames = 2
|
---|
130 |
|
---|
131 | At this point, you should write new DV data into frame 3 and optionally
|
---|
132 | frame 0. Then call DV1394_SUBMIT_FRAMES to inform the device that
|
---|
133 | it may transmit the new frames.
|
---|
134 |
|
---|
135 | ERROR HANDLING
|
---|
136 |
|
---|
137 | An error (buffer underflow/overflow or a break in the DV stream due
|
---|
138 | to a 1394 bus reset) can be detected by checking the dropped_frames
|
---|
139 | field of struct dv1394_status (obtained through the
|
---|
140 | DV1394_GET_STATUS ioctl).
|
---|
141 |
|
---|
142 | The best way to recover from such an error is to re-initialize
|
---|
143 | dv1394, either by using the DV1394_INIT ioctl call, or closing the
|
---|
144 | file descriptor and opening it again. (note that you must unmap all
|
---|
145 | ringbuffer mappings when closing the file descriptor, or else
|
---|
146 | dv1394 will still be considered 'in use').
|
---|
147 |
|
---|
148 | MAIN LOOP
|
---|
149 |
|
---|
150 | For maximum efficiency and robustness against bus errors, you are
|
---|
151 | advised to model the main loop of your application after the
|
---|
152 | following pseudo-code example:
|
---|
153 |
|
---|
154 | (checks of system call return values omitted for brevity; always
|
---|
155 | check return values in your code!)
|
---|
156 |
|
---|
157 | while( frames left ) {
|
---|
158 |
|
---|
159 | struct pollfd *pfd = ...;
|
---|
160 |
|
---|
161 | pfd->fd = dv1394_fd;
|
---|
162 | pfd->revents = 0;
|
---|
163 | pfd->events = POLLOUT | POLLIN; (OUT for transmit, IN for receive)
|
---|
164 |
|
---|
165 | (add other sources of I/O here)
|
---|
166 |
|
---|
167 | poll(pfd, 1, -1); (or select(); add a timeout if you want)
|
---|
168 |
|
---|
169 | if(pfd->revents) {
|
---|
170 | struct dv1394_status status;
|
---|
171 |
|
---|
172 | ioctl(dv1394_fd, DV1394_GET_STATUS, &status);
|
---|
173 |
|
---|
174 | if(status.dropped_frames > 0) {
|
---|
175 | reset_dv1394();
|
---|
176 | } else {
|
---|
177 | for(int i = 0; i < status.n_clear_frames; i++) {
|
---|
178 | copy_DV_frame();
|
---|
179 | }
|
---|
180 | }
|
---|
181 | }
|
---|
182 | }
|
---|
183 |
|
---|
184 | where copy_DV_frame() reads or writes on the dv1394 file descriptor
|
---|
185 | (read/write mode) or copies data to/from the mmap ringbuffer and
|
---|
186 | then calls ioctl(DV1394_SUBMIT_FRAMES) to notify dv1394 that new
|
---|
187 | frames are availble (mmap mode).
|
---|
188 |
|
---|
189 | reset_dv1394() is called in the event of a buffer
|
---|
190 | underflow/overflow or a halt in the DV stream (e.g. due to a 1394
|
---|
191 | bus reset). To guarantee recovery from the error, this function
|
---|
192 | should close the dv1394 file descriptor (and munmap() all
|
---|
193 | ringbuffer mappings, if you are using them), then re-open the
|
---|
194 | dv1394 device (and re-map the ringbuffer).
|
---|
195 |
|
---|
196 | */
|
---|
197 |
|
---|
198 |
|
---|
199 | /* maximum number of frames in the ringbuffer */
|
---|
200 | #define DV1394_MAX_FRAMES 32
|
---|
201 |
|
---|
202 | /* number of *full* isochronous packets per DV frame */
|
---|
203 | #define DV1394_NTSC_PACKETS_PER_FRAME 250
|
---|
204 | #define DV1394_PAL_PACKETS_PER_FRAME 300
|
---|
205 |
|
---|
206 | /* size of one frame's worth of DV data, in bytes */
|
---|
207 | #define DV1394_NTSC_FRAME_SIZE (480 * DV1394_NTSC_PACKETS_PER_FRAME)
|
---|
208 | #define DV1394_PAL_FRAME_SIZE (480 * DV1394_PAL_PACKETS_PER_FRAME)
|
---|
209 |
|
---|
210 |
|
---|
211 | /* ioctl() commands */
|
---|
212 |
|
---|
213 | enum {
|
---|
214 | /* I don't like using 0 as a valid ioctl() */
|
---|
215 | DV1394_INVALID = 0,
|
---|
216 |
|
---|
217 |
|
---|
218 | /* get the driver ready to transmit video.
|
---|
219 | pass a struct dv1394_init* as the parameter (see below),
|
---|
220 | or NULL to get default parameters */
|
---|
221 | DV1394_INIT,
|
---|
222 |
|
---|
223 |
|
---|
224 | /* stop transmitting video and free the ringbuffer */
|
---|
225 | DV1394_SHUTDOWN,
|
---|
226 |
|
---|
227 |
|
---|
228 | /* submit N new frames to be transmitted, where
|
---|
229 | the index of the first new frame is first_clear_buffer,
|
---|
230 | and the index of the last new frame is
|
---|
231 | (first_clear_buffer + N) % n_frames */
|
---|
232 | DV1394_SUBMIT_FRAMES,
|
---|
233 |
|
---|
234 |
|
---|
235 | /* block until N buffers are clear (pass N as the parameter)
|
---|
236 | Because we re-transmit the last frame on underrun, there
|
---|
237 | will at most be n_frames - 1 clear frames at any time */
|
---|
238 | DV1394_WAIT_FRAMES,
|
---|
239 |
|
---|
240 | /* capture new frames that have been received, where
|
---|
241 | the index of the first new frame is first_clear_buffer,
|
---|
242 | and the index of the last new frame is
|
---|
243 | (first_clear_buffer + N) % n_frames */
|
---|
244 | DV1394_RECEIVE_FRAMES,
|
---|
245 |
|
---|
246 |
|
---|
247 | DV1394_START_RECEIVE,
|
---|
248 |
|
---|
249 |
|
---|
250 | /* pass a struct dv1394_status* as the parameter (see below) */
|
---|
251 | DV1394_GET_STATUS,
|
---|
252 | };
|
---|
253 |
|
---|
254 |
|
---|
255 |
|
---|
256 | enum pal_or_ntsc {
|
---|
257 | DV1394_NTSC = 0,
|
---|
258 | DV1394_PAL
|
---|
259 | };
|
---|
260 |
|
---|
261 |
|
---|
262 |
|
---|
263 |
|
---|
264 | /* this is the argument to DV1394_INIT */
|
---|
265 | struct dv1394_init {
|
---|
266 | /* DV1394_API_VERSION */
|
---|
267 | unsigned int api_version;
|
---|
268 |
|
---|
269 | /* isochronous transmission channel to use */
|
---|
270 | unsigned int channel;
|
---|
271 |
|
---|
272 | /* number of frames in the ringbuffer. Must be at least 2
|
---|
273 | and at most DV1394_MAX_FRAMES. */
|
---|
274 | unsigned int n_frames;
|
---|
275 |
|
---|
276 | /* send/receive PAL or NTSC video format */
|
---|
277 | enum pal_or_ntsc format;
|
---|
278 |
|
---|
279 | /* the following are used only for transmission */
|
---|
280 |
|
---|
281 | /* set these to zero unless you want a
|
---|
282 | non-default empty packet rate (see below) */
|
---|
283 | unsigned long cip_n;
|
---|
284 | unsigned long cip_d;
|
---|
285 |
|
---|
286 | /* set this to zero unless you want a
|
---|
287 | non-default SYT cycle offset (default = 3 cycles) */
|
---|
288 | unsigned int syt_offset;
|
---|
289 | };
|
---|
290 |
|
---|
291 | /* NOTE: you may only allocate the DV frame ringbuffer once each time
|
---|
292 | you open the dv1394 device. DV1394_INIT will fail if you call it a
|
---|
293 | second time with different 'n_frames' or 'format' arguments (which
|
---|
294 | would imply a different size for the ringbuffer). If you need a
|
---|
295 | different buffer size, simply close and re-open the device, then
|
---|
296 | initialize it with your new settings. */
|
---|
297 |
|
---|
298 | /* Q: What are cip_n and cip_d? */
|
---|
299 |
|
---|
300 | /*
|
---|
301 | A: DV video streams do not utilize 100% of the potential bandwidth offered
|
---|
302 | by IEEE 1394 (FireWire). To achieve the correct rate of data transmission,
|
---|
303 | DV devices must periodically insert empty packets into the 1394 data stream.
|
---|
304 | Typically there is one empty packet per 14-16 data-carrying packets.
|
---|
305 |
|
---|
306 | Some DV devices will accept a wide range of empty packet rates, while others
|
---|
307 | require a precise rate. If the dv1394 driver produces empty packets at
|
---|
308 | a rate that your device does not accept, you may see ugly patterns on the
|
---|
309 | DV output, or even no output at all.
|
---|
310 |
|
---|
311 | The default empty packet insertion rate seems to work for many people; if
|
---|
312 | your DV output is stable, you can simply ignore this discussion. However,
|
---|
313 | we have exposed the empty packet rate as a parameter to support devices that
|
---|
314 | do not work with the default rate.
|
---|
315 |
|
---|
316 | The decision to insert an empty packet is made with a numerator/denominator
|
---|
317 | algorithm. Empty packets are produced at an average rate of CIP_N / CIP_D.
|
---|
318 | You can alter the empty packet rate by passing non-zero values for cip_n
|
---|
319 | and cip_d to the INIT ioctl.
|
---|
320 |
|
---|
321 | */
|
---|
322 |
|
---|
323 |
|
---|
324 |
|
---|
325 | struct dv1394_status {
|
---|
326 | /* this embedded init struct returns the current dv1394
|
---|
327 | parameters in use */
|
---|
328 | struct dv1394_init init;
|
---|
329 |
|
---|
330 | /* the ringbuffer frame that is currently being
|
---|
331 | displayed. (-1 if the device is not transmitting anything) */
|
---|
332 | int active_frame;
|
---|
333 |
|
---|
334 | /* index of the first buffer (ahead of active_frame) that
|
---|
335 | is ready to be filled with data */
|
---|
336 | unsigned int first_clear_frame;
|
---|
337 |
|
---|
338 | /* how many buffers, including first_clear_buffer, are
|
---|
339 | ready to be filled with data */
|
---|
340 | unsigned int n_clear_frames;
|
---|
341 |
|
---|
342 | /* how many times the DV stream has underflowed, overflowed,
|
---|
343 | or otherwise encountered an error, since the previous call
|
---|
344 | to DV1394_GET_STATUS */
|
---|
345 | unsigned int dropped_frames;
|
---|
346 |
|
---|
347 | /* N.B. The dropped_frames counter is only a lower bound on the actual
|
---|
348 | number of dropped frames, with the special case that if dropped_frames
|
---|
349 | is zero, then it is guaranteed that NO frames have been dropped
|
---|
350 | since the last call to DV1394_GET_STATUS.
|
---|
351 | */
|
---|
352 | };
|
---|
353 |
|
---|
354 |
|
---|
355 | #endif /* _DV_1394_H */
|
---|