annotate dv1394.h @ 2400:fcaecfb05781 libavformat

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