annotate dv1394.c @ 2136:b53a19eed95d libavformat

remove duplicate PAT scaning code and actual PAT scan also disabling the nonsense 3yr old rawts change (it would after the above chage totally break the demuxer if its left enabled)
author michael
date Mon, 04 Jun 2007 14:44:52 +0000
parents 62792a60f740
children b21c2af60bc9
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 * Linux DV1394 interface
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
3 * Copyright (c) 2003 Max Krasnyansky <maxk@qualcomm.com>
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
4 *
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1169
diff changeset
5 * This file is part of FFmpeg.
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1169
diff changeset
6 *
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1169
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
27
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
9 * 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: 1169
diff changeset
10 * 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
11 *
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1169
diff changeset
12 * 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
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
15 * Lesser General Public License for more details.
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
16 *
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
17 * 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: 1169
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
896
edbe5c3717f9 Update licensing information: The FSF changed postal address.
diego
parents: 887
diff changeset
19 * 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
20 */
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
21
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
22 #include <unistd.h>
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
23 #include <fcntl.h>
53
fb671d87824e zero copy packet handling for DV1394 by Max Krasnyansky
bellard
parents: 38
diff changeset
24 #include <errno.h>
27
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
25 #include <sys/ioctl.h>
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
26 #include <sys/mman.h>
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
27 #include <sys/poll.h>
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
28 #include <sys/time.h>
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
29 #include <time.h>
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
30
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
31 #include "avformat.h"
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
32
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
33 #undef DV1394_DEBUG
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 #include "dv1394.h"
262
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 185
diff changeset
36 #include "dv.h"
27
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
37
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
38 struct dv1394_data {
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
39 int fd;
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
40 int channel;
38
cb1eb8829175 Audio support for DV1394 by Max Krasnyansky
bellard
parents: 31
diff changeset
41 int format;
27
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
42
1739
10d7da8ecc03 remove void * used in arithmetic warnings
bcoudurier
parents: 1358
diff changeset
43 uint8_t *ring; /* Ring buffer */
27
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
44 int index; /* Current frame index */
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
45 int avail; /* Number of frames available for reading */
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
46 int done; /* Number of completed frames */
38
cb1eb8829175 Audio support for DV1394 by Max Krasnyansky
bellard
parents: 31
diff changeset
47
296
252946de6d3f * DV demuxer is now capable of decoding auxilary audio stream. So,
romansh
parents: 262
diff changeset
48 DVDemuxContext* dv_demux; /* Generic DV muxing/demuxing context */
27
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
49 };
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
50
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 482
diff changeset
51 /*
185
d98ed04d62a6 patch for DV capturing by Dan Dennedy <dan at dennedy dot org>
romansh
parents: 159
diff changeset
52 * The trick here is to kludge around well known problem with kernel Ooopsing
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 482
diff changeset
53 * when you try to capture PAL on a device node configure for NTSC. That's
185
d98ed04d62a6 patch for DV capturing by Dan Dennedy <dan at dennedy dot org>
romansh
parents: 159
diff changeset
54 * why we have to configure the device node for PAL, and then read only NTSC
d98ed04d62a6 patch for DV capturing by Dan Dennedy <dan at dennedy dot org>
romansh
parents: 159
diff changeset
55 * amount of data.
d98ed04d62a6 patch for DV capturing by Dan Dennedy <dan at dennedy dot org>
romansh
parents: 159
diff changeset
56 */
27
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
57 static int dv1394_reset(struct dv1394_data *dv)
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 struct dv1394_init init;
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
60
38
cb1eb8829175 Audio support for DV1394 by Max Krasnyansky
bellard
parents: 31
diff changeset
61 init.channel = dv->channel;
27
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
62 init.api_version = DV1394_API_VERSION;
38
cb1eb8829175 Audio support for DV1394 by Max Krasnyansky
bellard
parents: 31
diff changeset
63 init.n_frames = DV1394_RING_FRAMES;
185
d98ed04d62a6 patch for DV capturing by Dan Dennedy <dan at dennedy dot org>
romansh
parents: 159
diff changeset
64 init.format = DV1394_PAL;
27
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
65
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
66 if (ioctl(dv->fd, DV1394_INIT, &init) < 0)
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
67 return -1;
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
68
53
fb671d87824e zero copy packet handling for DV1394 by Max Krasnyansky
bellard
parents: 38
diff changeset
69 dv->avail = dv->done = 0;
27
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
70 return 0;
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
71 }
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
72
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
73 static int dv1394_start(struct dv1394_data *dv)
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
74 {
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
75 /* Tell DV1394 driver to enable receiver */
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
76 if (ioctl(dv->fd, DV1394_START_RECEIVE, 0) < 0) {
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
77 perror("Failed to start receiver");
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
78 return -1;
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
79 }
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
80 return 0;
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
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
83 static int dv1394_read_header(AVFormatContext * context, AVFormatParameters * ap)
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
84 {
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
85 struct dv1394_data *dv = context->priv_data;
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
86
296
252946de6d3f * DV demuxer is now capable of decoding auxilary audio stream. So,
romansh
parents: 262
diff changeset
87 dv->dv_demux = dv_init_demux(context);
262
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 185
diff changeset
88 if (!dv->dv_demux)
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 185
diff changeset
89 goto failed;
27
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
90
159
7d698c3213a0 tv standard selection support for dv1394 and grab (v4l)
al3x
parents: 156
diff changeset
91 if (ap->standard && !strcasecmp(ap->standard, "pal"))
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
92 dv->format = DV1394_PAL;
159
7d698c3213a0 tv standard selection support for dv1394 and grab (v4l)
al3x
parents: 156
diff changeset
93 else
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
94 dv->format = DV1394_NTSC;
31
36dd902f98d2 dv1394 channel selection by Max Krasnyansky - modified channel number to be in base 10 by default
bellard
parents: 30
diff changeset
95
36dd902f98d2 dv1394 channel selection by Max Krasnyansky - modified channel number to be in base 10 by default
bellard
parents: 30
diff changeset
96 if (ap->channel)
36dd902f98d2 dv1394 channel selection by Max Krasnyansky - modified channel number to be in base 10 by default
bellard
parents: 30
diff changeset
97 dv->channel = ap->channel;
36dd902f98d2 dv1394 channel selection by Max Krasnyansky - modified channel number to be in base 10 by default
bellard
parents: 30
diff changeset
98 else
36dd902f98d2 dv1394 channel selection by Max Krasnyansky - modified channel number to be in base 10 by default
bellard
parents: 30
diff changeset
99 dv->channel = DV1394_DEFAULT_CHANNEL;
27
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
100
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
101 /* Open and initialize DV1394 device */
1795
62792a60f740 implement new grabbing interface, as described here:
gpoirier
parents: 1739
diff changeset
102 dv->fd = open(context->filename, O_RDONLY);
27
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
103 if (dv->fd < 0) {
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
104 perror("Failed to open DV interface");
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
105 goto failed;
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
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
108 if (dv1394_reset(dv) < 0) {
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
109 perror("Failed to initialize DV interface");
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
110 goto failed;
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
111 }
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
112
185
d98ed04d62a6 patch for DV capturing by Dan Dennedy <dan at dennedy dot org>
romansh
parents: 159
diff changeset
113 dv->ring = mmap(NULL, DV1394_PAL_FRAME_SIZE * DV1394_RING_FRAMES,
27
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
114 PROT_READ, MAP_PRIVATE, dv->fd, 0);
185
d98ed04d62a6 patch for DV capturing by Dan Dennedy <dan at dennedy dot org>
romansh
parents: 159
diff changeset
115 if (dv->ring == MAP_FAILED) {
27
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
116 perror("Failed to mmap DV ring buffer");
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
117 goto failed;
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
118 }
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
119
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
120 if (dv1394_start(dv) < 0)
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
121 goto failed;
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
122
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
123 return 0;
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
124
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
125 failed:
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
126 close(dv->fd);
482
0fdc96c2f2fe sweeping change from -EIO -> AVERROR_IO
melanson
parents: 392
diff changeset
127 return AVERROR_IO;
27
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
128 }
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
129
38
cb1eb8829175 Audio support for DV1394 by Max Krasnyansky
bellard
parents: 31
diff changeset
130 static int dv1394_read_packet(AVFormatContext *context, AVPacket *pkt)
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 struct dv1394_data *dv = context->priv_data;
262
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 185
diff changeset
133 int size;
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 185
diff changeset
134
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 185
diff changeset
135 size = dv_get_packet(dv->dv_demux, pkt);
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 185
diff changeset
136 if (size > 0)
392
caf266cfadaf * enabling seek in raw DV files
romansh
parents: 370
diff changeset
137 return size;
27
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
138
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
139 if (!dv->avail) {
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
140 struct dv1394_status s;
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
141 struct pollfd p;
53
fb671d87824e zero copy packet handling for DV1394 by Max Krasnyansky
bellard
parents: 38
diff changeset
142
fb671d87824e zero copy packet handling for DV1394 by Max Krasnyansky
bellard
parents: 38
diff changeset
143 if (dv->done) {
fb671d87824e zero copy packet handling for DV1394 by Max Krasnyansky
bellard
parents: 38
diff changeset
144 /* Request more frames */
fb671d87824e zero copy packet handling for DV1394 by Max Krasnyansky
bellard
parents: 38
diff changeset
145 if (ioctl(dv->fd, DV1394_RECEIVE_FRAMES, dv->done) < 0) {
fb671d87824e zero copy packet handling for DV1394 by Max Krasnyansky
bellard
parents: 38
diff changeset
146 /* This usually means that ring buffer overflowed.
fb671d87824e zero copy packet handling for DV1394 by Max Krasnyansky
bellard
parents: 38
diff changeset
147 * We have to reset :(.
fb671d87824e zero copy packet handling for DV1394 by Max Krasnyansky
bellard
parents: 38
diff changeset
148 */
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 482
diff changeset
149
370
845f9de2c883 av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 296
diff changeset
150 av_log(context, AV_LOG_ERROR, "DV1394: Ring buffer overflow. Reseting ..\n");
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 482
diff changeset
151
53
fb671d87824e zero copy packet handling for DV1394 by Max Krasnyansky
bellard
parents: 38
diff changeset
152 dv1394_reset(dv);
fb671d87824e zero copy packet handling for DV1394 by Max Krasnyansky
bellard
parents: 38
diff changeset
153 dv1394_start(dv);
fb671d87824e zero copy packet handling for DV1394 by Max Krasnyansky
bellard
parents: 38
diff changeset
154 }
fb671d87824e zero copy packet handling for DV1394 by Max Krasnyansky
bellard
parents: 38
diff changeset
155 dv->done = 0;
fb671d87824e zero copy packet handling for DV1394 by Max Krasnyansky
bellard
parents: 38
diff changeset
156 }
fb671d87824e zero copy packet handling for DV1394 by Max Krasnyansky
bellard
parents: 38
diff changeset
157
fb671d87824e zero copy packet handling for DV1394 by Max Krasnyansky
bellard
parents: 38
diff changeset
158 /* Wait until more frames are available */
fb671d87824e zero copy packet handling for DV1394 by Max Krasnyansky
bellard
parents: 38
diff changeset
159 restart_poll:
27
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
160 p.fd = dv->fd;
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
161 p.events = POLLIN | POLLERR | POLLHUP;
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
162 if (poll(&p, 1, -1) < 0) {
53
fb671d87824e zero copy packet handling for DV1394 by Max Krasnyansky
bellard
parents: 38
diff changeset
163 if (errno == EAGAIN || errno == EINTR)
fb671d87824e zero copy packet handling for DV1394 by Max Krasnyansky
bellard
parents: 38
diff changeset
164 goto restart_poll;
27
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
165 perror("Poll failed");
482
0fdc96c2f2fe sweeping change from -EIO -> AVERROR_IO
melanson
parents: 392
diff changeset
166 return AVERROR_IO;
27
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
167 }
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
168
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
169 if (ioctl(dv->fd, DV1394_GET_STATUS, &s) < 0) {
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
170 perror("Failed to get status");
482
0fdc96c2f2fe sweeping change from -EIO -> AVERROR_IO
melanson
parents: 392
diff changeset
171 return AVERROR_IO;
27
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
172 }
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
173 #ifdef DV1394_DEBUG
1002
56db80b1131e Use AV_LOG_DEBUG loglevel instead of AV_LOG_ERROR where appropriate.
diego
parents: 1001
diff changeset
174 av_log(context, AV_LOG_DEBUG, "DV1394: status\n"
27
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
175 "\tactive_frame\t%d\n"
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
176 "\tfirst_clear_frame\t%d\n"
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
177 "\tn_clear_frames\t%d\n"
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
178 "\tdropped_frames\t%d\n",
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
179 s.active_frame, s.first_clear_frame,
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
180 s.n_clear_frames, s.dropped_frames);
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
181 #endif
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 dv->avail = s.n_clear_frames;
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
184 dv->index = s.first_clear_frame;
53
fb671d87824e zero copy packet handling for DV1394 by Max Krasnyansky
bellard
parents: 38
diff changeset
185 dv->done = 0;
27
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
186
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
187 if (s.dropped_frames) {
370
845f9de2c883 av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 296
diff changeset
188 av_log(context, AV_LOG_ERROR, "DV1394: Frame drop detected (%d). Reseting ..\n",
27
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
189 s.dropped_frames);
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
190
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
191 dv1394_reset(dv);
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
192 dv1394_start(dv);
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
193 }
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
194 }
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
195
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
196 #ifdef DV1394_DEBUG
1002
56db80b1131e Use AV_LOG_DEBUG loglevel instead of AV_LOG_ERROR where appropriate.
diego
parents: 1001
diff changeset
197 av_log(context, AV_LOG_DEBUG, "index %d, avail %d, done %d\n", dv->index, dv->avail,
27
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
198 dv->done);
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
199 #endif
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
200
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 482
diff changeset
201 size = dv_produce_packet(dv->dv_demux, pkt,
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 482
diff changeset
202 dv->ring + (dv->index * DV1394_PAL_FRAME_SIZE),
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
203 DV1394_PAL_FRAME_SIZE);
262
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 185
diff changeset
204 dv->index = (dv->index + 1) % DV1394_RING_FRAMES;
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 185
diff changeset
205 dv->done++; dv->avail--;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 482
diff changeset
206
262
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 185
diff changeset
207 return size;
27
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
208 }
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
209
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
210 static int dv1394_close(AVFormatContext * context)
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 struct dv1394_data *dv = context->priv_data;
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 /* Shutdown DV1394 receiver */
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
215 if (ioctl(dv->fd, DV1394_SHUTDOWN, 0) < 0)
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
216 perror("Failed to shutdown DV1394");
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 /* Unmap ring buffer */
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
219 if (munmap(dv->ring, DV1394_NTSC_FRAME_SIZE * DV1394_RING_FRAMES) < 0)
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
220 perror("Failed to munmap DV1394 ring buffer");
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
221
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
222 close(dv->fd);
262
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 185
diff changeset
223 av_free(dv->dv_demux);
27
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
224
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
225 return 0;
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
226 }
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
227
1169
d18cc9a1fd02 allow individual selection of muxers and demuxers
mru
parents: 1167
diff changeset
228 AVInputFormat dv1394_demuxer = {
27
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
229 .name = "dv1394",
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
230 .long_name = "dv1394 A/V grab",
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
231 .priv_data_size = sizeof(struct dv1394_data),
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
232 .read_header = dv1394_read_header,
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
233 .read_packet = dv1394_read_packet,
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
234 .read_close = dv1394_close,
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
235 .flags = AVFMT_NOFILE
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
236 };