ffmpeg / libavformat / dv1394.h @ 5509bffa
History | View | Annotate | Download (12 KB)
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 */ |