Mercurial > libavformat.hg
annotate dv1394.h @ 1116:22a86dfd052d libavformat
Fix typo
| author | lucabe |
|---|---|
| date | Thu, 15 Jun 2006 07:36:57 +0000 |
| parents | edbe5c3717f9 |
| children | 2c9aa272e75d |
| rev | line source |
|---|---|
| 27 | 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, | |
|
896
edbe5c3717f9
Update licensing information: The FSF changed postal address.
diego
parents:
887
diff
changeset
|
23 * Inc.,51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
|
edbe5c3717f9
Update licensing information: The FSF changed postal address.
diego
parents:
887
diff
changeset
|
24 * |
| 27 | 25 */ |
| 26 | |
| 27 #ifndef _DV_1394_H | |
| 28 #define _DV_1394_H | |
| 29 | |
|
185
d98ed04d62a6
patch for DV capturing by Dan Dennedy <dan at dennedy dot org>
romansh
parents:
156
diff
changeset
|
30 #define DV1394_DEFAULT_CHANNEL 63 |
| 27 | 31 #define DV1394_DEFAULT_CARD 0 |
| 32 #define DV1394_RING_FRAMES 20 | |
| 33 | |
| 34 #define DV1394_WIDTH 720 | |
| 156 | 35 #define DV1394_NTSC_HEIGHT 480 |
| 36 #define DV1394_PAL_HEIGHT 576 | |
| 27 | 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. | |
| 885 | 61 |
| 27 | 62 Example 1: |
| 63 To play a raw .DV file: cat foo.DV > /dev/dv1394 | |
| 887 | 64 (cat will use write() internally) |
| 27 | 65 |
| 66 Example 2: | |
| 67 static struct dv1394_init init = { | |
| 887 | 68 0x63, (broadcast channel) |
| 27 | 69 4, (four-frame ringbuffer) |
| 887 | 70 DV1394_NTSC, (send NTSC video) |
| 71 0, 0 (default empty packet rate) | |
| 27 | 72 } |
| 73 | |
| 887 | 74 ioctl(fd, DV1394_INIT, &init); |
| 27 | 75 |
| 887 | 76 while(1) { |
| 77 read( <a raw DV file>, buf, DV1394_NTSC_FRAME_SIZE ); | |
| 78 write( <the dv1394 FD>, buf, DV1394_NTSC_FRAME_SIZE ); | |
| 27 | 79 } |
| 80 | |
| 81 2) | |
| 82 | |
| 83 For more control over buffering, and to avoid unnecessary copies | |
| 885 | 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() | |
| 27 | 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 | |
| 887 | 108 *--------------------------------------* |
| 27 | 109 | CLEAR | DV data | DV data | CLEAR | |
| 110 *--------------------------------------* | |
| 885 | 111 <ACTIVE> |
| 27 | 112 |
| 887 | 113 transmission goes in this direction --->>> |
| 27 | 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 | |
| 885 | 122 |
| 27 | 123 If you called DV1394_GET_STATUS at this instant, you would |
| 124 receive the following values: | |
| 885 | 125 |
| 27 | 126 n_frames = 4 |
| 887 | 127 active_frame = 1 |
| 128 first_clear_frame = 3 | |
| 129 n_clear_frames = 2 | |
| 27 | 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!) | |
| 885 | 156 |
| 27 | 157 while( frames left ) { |
| 885 | 158 |
| 27 | 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) | |
| 885 | 166 |
| 27 | 167 poll(pfd, 1, -1); (or select(); add a timeout if you want) |
| 168 | |
| 169 if(pfd->revents) { | |
| 170 struct dv1394_status status; | |
| 885 | 171 |
| 27 | 172 ioctl(dv1394_fd, DV1394_GET_STATUS, &status); |
| 173 | |
| 887 | 174 if(status.dropped_frames > 0) { |
| 175 reset_dv1394(); | |
| 27 | 176 } else { |
| 177 for(int i = 0; i < status.n_clear_frames; i++) { | |
| 887 | 178 copy_DV_frame(); |
| 27 | 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). | |
| 885 | 195 |
| 27 | 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 */ | |
|
185
d98ed04d62a6
patch for DV capturing by Dan Dennedy <dan at dennedy dot org>
romansh
parents:
156
diff
changeset
|
203 #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
|
204 #define DV1394_PAL_PACKETS_PER_FRAME 300 |
| 27 | 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) | |
|
185
d98ed04d62a6
patch for DV capturing by Dan Dennedy <dan at dennedy dot org>
romansh
parents:
156
diff
changeset
|
208 #define DV1394_PAL_FRAME_SIZE (480 * DV1394_PAL_PACKETS_PER_FRAME) |
| 27 | 209 |
| 210 | |
| 211 /* ioctl() commands */ | |
| 212 | |
| 213 enum { | |
| 887 | 214 /* I don't like using 0 as a valid ioctl() */ |
| 215 DV1394_INVALID = 0, | |
| 27 | 216 |
| 217 | |
| 887 | 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, | |
| 27 | 222 |
| 223 | |
| 887 | 224 /* stop transmitting video and free the ringbuffer */ |
| 225 DV1394_SHUTDOWN, | |
| 27 | 226 |
| 227 | |
| 887 | 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, | |
| 27 | 233 |
| 234 | |
| 887 | 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, | |
| 27 | 239 |
| 887 | 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, | |
| 27 | 245 |
| 246 | |
| 887 | 247 DV1394_START_RECEIVE, |
| 27 | 248 |
| 249 | |
| 887 | 250 /* pass a struct dv1394_status* as the parameter (see below) */ |
| 251 DV1394_GET_STATUS, | |
| 27 | 252 }; |
| 253 | |
| 254 | |
| 255 | |
| 256 enum pal_or_ntsc { | |
| 887 | 257 DV1394_NTSC = 0, |
| 258 DV1394_PAL | |
| 27 | 259 }; |
| 260 | |
| 261 | |
| 262 | |
| 263 | |
| 264 /* this is the argument to DV1394_INIT */ | |
| 265 struct dv1394_init { | |
| 887 | 266 /* DV1394_API_VERSION */ |
| 267 unsigned int api_version; | |
| 885 | 268 |
| 887 | 269 /* isochronous transmission channel to use */ |
| 270 unsigned int channel; | |
| 27 | 271 |
| 887 | 272 /* number of frames in the ringbuffer. Must be at least 2 |
| 273 and at most DV1394_MAX_FRAMES. */ | |
| 274 unsigned int n_frames; | |
| 27 | 275 |
| 887 | 276 /* send/receive PAL or NTSC video format */ |
| 277 enum pal_or_ntsc format; | |
| 27 | 278 |
| 887 | 279 /* the following are used only for transmission */ |
| 885 | 280 |
| 887 | 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; | |
| 27 | 285 |
| 887 | 286 /* set this to zero unless you want a |
| 287 non-default SYT cycle offset (default = 3 cycles) */ | |
| 288 unsigned int syt_offset; | |
| 27 | 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. */ | |
| 885 | 297 |
| 27 | 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 | |
| 885 | 314 do not work with the default rate. |
| 27 | 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. | |
| 885 | 320 |
| 27 | 321 */ |
| 322 | |
| 323 | |
| 324 | |
| 325 struct dv1394_status { | |
| 887 | 326 /* this embedded init struct returns the current dv1394 |
| 327 parameters in use */ | |
| 328 struct dv1394_init init; | |
| 27 | 329 |
| 887 | 330 /* the ringbuffer frame that is currently being |
| 331 displayed. (-1 if the device is not transmitting anything) */ | |
| 332 int active_frame; | |
| 27 | 333 |
| 887 | 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; | |
| 27 | 337 |
| 887 | 338 /* how many buffers, including first_clear_buffer, are |
| 339 ready to be filled with data */ | |
| 340 unsigned int n_clear_frames; | |
| 27 | 341 |
| 887 | 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; | |
| 27 | 346 |
| 887 | 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 */ | |
| 27 | 352 }; |
| 353 | |
| 354 | |
| 355 #endif /* _DV_1394_H */ |
