annotate dv1394.c @ 1407:fb4bf3858f77 libavformat

Make read_packet fail is the v4l2 driver returns an unexpected frame size (driver's bug? If not, we will have to support this in some way)
author lucabe
date Sun, 22 Oct 2006 09:56:08 +0000
parents 0899bfe4105c
children 10d7da8ecc03
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
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
43 void *ring; /* Ring buffer */
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;
30
90fd30dd68b3 grab device is in AVFormatParameter (at least better than global variable)
bellard
parents: 27
diff changeset
86 const char *video_device;
27
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
87
296
252946de6d3f * DV demuxer is now capable of decoding auxilary audio stream. So,
romansh
parents: 262
diff changeset
88 dv->dv_demux = dv_init_demux(context);
262
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 185
diff changeset
89 if (!dv->dv_demux)
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 185
diff changeset
90 goto failed;
27
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
91
159
7d698c3213a0 tv standard selection support for dv1394 and grab (v4l)
al3x
parents: 156
diff changeset
92 if (ap->standard && !strcasecmp(ap->standard, "pal"))
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
93 dv->format = DV1394_PAL;
159
7d698c3213a0 tv standard selection support for dv1394 and grab (v4l)
al3x
parents: 156
diff changeset
94 else
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
95 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
96
36dd902f98d2 dv1394 channel selection by Max Krasnyansky - modified channel number to be in base 10 by default
bellard
parents: 30
diff changeset
97 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
98 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
99 else
36dd902f98d2 dv1394 channel selection by Max Krasnyansky - modified channel number to be in base 10 by default
bellard
parents: 30
diff changeset
100 dv->channel = DV1394_DEFAULT_CHANNEL;
27
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 /* Open and initialize DV1394 device */
30
90fd30dd68b3 grab device is in AVFormatParameter (at least better than global variable)
bellard
parents: 27
diff changeset
103 video_device = ap->device;
90fd30dd68b3 grab device is in AVFormatParameter (at least better than global variable)
bellard
parents: 27
diff changeset
104 if (!video_device)
90fd30dd68b3 grab device is in AVFormatParameter (at least better than global variable)
bellard
parents: 27
diff changeset
105 video_device = "/dev/dv1394/0";
27
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
106 dv->fd = open(video_device, O_RDONLY);
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
107 if (dv->fd < 0) {
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
108 perror("Failed to open DV interface");
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
109 goto failed;
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
110 }
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 if (dv1394_reset(dv) < 0) {
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
113 perror("Failed to initialize DV interface");
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
114 goto failed;
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
185
d98ed04d62a6 patch for DV capturing by Dan Dennedy <dan at dennedy dot org>
romansh
parents: 159
diff changeset
117 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
118 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
119 if (dv->ring == MAP_FAILED) {
27
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
120 perror("Failed to mmap DV ring buffer");
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
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
124 if (dv1394_start(dv) < 0)
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
125 goto failed;
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
126
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
127 return 0;
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 failed:
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
130 close(dv->fd);
482
0fdc96c2f2fe sweeping change from -EIO -> AVERROR_IO
melanson
parents: 392
diff changeset
131 return AVERROR_IO;
27
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
132 }
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
133
38
cb1eb8829175 Audio support for DV1394 by Max Krasnyansky
bellard
parents: 31
diff changeset
134 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
135 {
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
136 struct dv1394_data *dv = context->priv_data;
262
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 185
diff changeset
137 int size;
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 185
diff changeset
138
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 185
diff changeset
139 size = dv_get_packet(dv->dv_demux, pkt);
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 185
diff changeset
140 if (size > 0)
392
caf266cfadaf * enabling seek in raw DV files
romansh
parents: 370
diff changeset
141 return size;
27
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 if (!dv->avail) {
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
144 struct dv1394_status s;
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
145 struct pollfd p;
53
fb671d87824e zero copy packet handling for DV1394 by Max Krasnyansky
bellard
parents: 38
diff changeset
146
fb671d87824e zero copy packet handling for DV1394 by Max Krasnyansky
bellard
parents: 38
diff changeset
147 if (dv->done) {
fb671d87824e zero copy packet handling for DV1394 by Max Krasnyansky
bellard
parents: 38
diff changeset
148 /* Request more frames */
fb671d87824e zero copy packet handling for DV1394 by Max Krasnyansky
bellard
parents: 38
diff changeset
149 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
150 /* This usually means that ring buffer overflowed.
fb671d87824e zero copy packet handling for DV1394 by Max Krasnyansky
bellard
parents: 38
diff changeset
151 * We have to reset :(.
fb671d87824e zero copy packet handling for DV1394 by Max Krasnyansky
bellard
parents: 38
diff changeset
152 */
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 482
diff changeset
153
370
845f9de2c883 av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 296
diff changeset
154 av_log(context, AV_LOG_ERROR, "DV1394: Ring buffer overflow. Reseting ..\n");
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 482
diff changeset
155
53
fb671d87824e zero copy packet handling for DV1394 by Max Krasnyansky
bellard
parents: 38
diff changeset
156 dv1394_reset(dv);
fb671d87824e zero copy packet handling for DV1394 by Max Krasnyansky
bellard
parents: 38
diff changeset
157 dv1394_start(dv);
fb671d87824e zero copy packet handling for DV1394 by Max Krasnyansky
bellard
parents: 38
diff changeset
158 }
fb671d87824e zero copy packet handling for DV1394 by Max Krasnyansky
bellard
parents: 38
diff changeset
159 dv->done = 0;
fb671d87824e zero copy packet handling for DV1394 by Max Krasnyansky
bellard
parents: 38
diff changeset
160 }
fb671d87824e zero copy packet handling for DV1394 by Max Krasnyansky
bellard
parents: 38
diff changeset
161
fb671d87824e zero copy packet handling for DV1394 by Max Krasnyansky
bellard
parents: 38
diff changeset
162 /* Wait until more frames are available */
fb671d87824e zero copy packet handling for DV1394 by Max Krasnyansky
bellard
parents: 38
diff changeset
163 restart_poll:
27
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
164 p.fd = dv->fd;
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
165 p.events = POLLIN | POLLERR | POLLHUP;
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
166 if (poll(&p, 1, -1) < 0) {
53
fb671d87824e zero copy packet handling for DV1394 by Max Krasnyansky
bellard
parents: 38
diff changeset
167 if (errno == EAGAIN || errno == EINTR)
fb671d87824e zero copy packet handling for DV1394 by Max Krasnyansky
bellard
parents: 38
diff changeset
168 goto restart_poll;
27
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
169 perror("Poll failed");
482
0fdc96c2f2fe sweeping change from -EIO -> AVERROR_IO
melanson
parents: 392
diff changeset
170 return AVERROR_IO;
27
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
171 }
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 if (ioctl(dv->fd, DV1394_GET_STATUS, &s) < 0) {
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
174 perror("Failed to get status");
482
0fdc96c2f2fe sweeping change from -EIO -> AVERROR_IO
melanson
parents: 392
diff changeset
175 return AVERROR_IO;
27
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
176 }
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
177 #ifdef DV1394_DEBUG
1002
56db80b1131e Use AV_LOG_DEBUG loglevel instead of AV_LOG_ERROR where appropriate.
diego
parents: 1001
diff changeset
178 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
179 "\tactive_frame\t%d\n"
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
180 "\tfirst_clear_frame\t%d\n"
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
181 "\tn_clear_frames\t%d\n"
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
182 "\tdropped_frames\t%d\n",
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
183 s.active_frame, s.first_clear_frame,
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
184 s.n_clear_frames, s.dropped_frames);
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
185 #endif
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 dv->avail = s.n_clear_frames;
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
188 dv->index = s.first_clear_frame;
53
fb671d87824e zero copy packet handling for DV1394 by Max Krasnyansky
bellard
parents: 38
diff changeset
189 dv->done = 0;
27
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 if (s.dropped_frames) {
370
845f9de2c883 av_log() patch by (Michel Bardiaux <mbardiaux at peaktime dot be>)
michael
parents: 296
diff changeset
192 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
193 s.dropped_frames);
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 dv1394_reset(dv);
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
196 dv1394_start(dv);
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 #ifdef DV1394_DEBUG
1002
56db80b1131e Use AV_LOG_DEBUG loglevel instead of AV_LOG_ERROR where appropriate.
diego
parents: 1001
diff changeset
201 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
202 dv->done);
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
203 #endif
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
204
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 482
diff changeset
205 size = dv_produce_packet(dv->dv_demux, pkt,
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 482
diff changeset
206 dv->ring + (dv->index * DV1394_PAL_FRAME_SIZE),
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
207 DV1394_PAL_FRAME_SIZE);
262
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 185
diff changeset
208 dv->index = (dv->index + 1) % DV1394_RING_FRAMES;
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 185
diff changeset
209 dv->done++; dv->avail--;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 482
diff changeset
210
262
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 185
diff changeset
211 return size;
27
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
212 }
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 static int dv1394_close(AVFormatContext * context)
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
215 {
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
216 struct dv1394_data *dv = context->priv_data;
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 /* Shutdown DV1394 receiver */
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
219 if (ioctl(dv->fd, DV1394_SHUTDOWN, 0) < 0)
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
220 perror("Failed to shutdown DV1394");
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 /* Unmap ring buffer */
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
223 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
224 perror("Failed to munmap DV1394 ring buffer");
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
225
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
226 close(dv->fd);
262
f174d9c00bce * DV handling was streamlined for both muxing/demuxing and
romansh
parents: 185
diff changeset
227 av_free(dv->dv_demux);
27
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
228
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
229 return 0;
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
230 }
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
231
1169
d18cc9a1fd02 allow individual selection of muxers and demuxers
mru
parents: 1167
diff changeset
232 AVInputFormat dv1394_demuxer = {
27
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
233 .name = "dv1394",
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
234 .long_name = "dv1394 A/V grab",
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
235 .priv_data_size = sizeof(struct dv1394_data),
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
236 .read_header = dv1394_read_header,
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
237 .read_packet = dv1394_read_packet,
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
238 .read_close = dv1394_close,
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
239 .flags = AVFMT_NOFILE
fcdea3df94fe dv patch by Max Krasnyansky (maxk at qualcomm dot com)
bellard
parents:
diff changeset
240 };