FFmpeg
Main Page
Related Pages
Modules
Data Structures
Files
Examples
File List
Globals
•
All
Data Structures
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
libavdevice
dv1394.c
Go to the documentation of this file.
1
/*
2
* Linux DV1394 interface
3
* Copyright (c) 2003 Max Krasnyansky <maxk@qualcomm.com>
4
*
5
* This file is part of FFmpeg.
6
*
7
* FFmpeg is free software; you can redistribute it and/or
8
* modify it under the terms of the GNU Lesser General Public
9
* License as published by the Free Software Foundation; either
10
* version 2.1 of the License, or (at your option) any later version.
11
*
12
* FFmpeg is distributed in the hope that it will be useful,
13
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15
* Lesser General Public License for more details.
16
*
17
* You should have received a copy of the GNU Lesser General Public
18
* License along with FFmpeg; if not, write to the Free Software
19
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20
*/
21
22
#include "config.h"
23
#include <unistd.h>
24
#include <fcntl.h>
25
#include <errno.h>
26
#include <poll.h>
27
#include <sys/ioctl.h>
28
#include <sys/mman.h>
29
30
#include "
libavutil/log.h
"
31
#include "
libavutil/opt.h
"
32
#include "
avdevice.h
"
33
#include "
libavformat/dv.h
"
34
#include "
dv1394.h
"
35
36
struct
dv1394_data
{
37
AVClass
*
class
;
38
int
fd
;
39
int
channel
;
40
int
format
;
41
42
uint8_t
*
ring
;
/* Ring buffer */
43
int
index
;
/* Current frame index */
44
int
avail
;
/* Number of frames available for reading */
45
int
done
;
/* Number of completed frames */
46
47
DVDemuxContext
*
dv_demux
;
/* Generic DV muxing/demuxing context */
48
};
49
50
/*
51
* The trick here is to kludge around well known problem with kernel Ooopsing
52
* when you try to capture PAL on a device node configure for NTSC. That's
53
* why we have to configure the device node for PAL, and then read only NTSC
54
* amount of data.
55
*/
56
static
int
dv1394_reset
(
struct
dv1394_data
*dv)
57
{
58
struct
dv1394_init
init;
59
60
init.
channel
= dv->
channel
;
61
init.
api_version
=
DV1394_API_VERSION
;
62
init.
n_frames
=
DV1394_RING_FRAMES
;
63
init.
format
=
DV1394_PAL
;
64
65
if
(ioctl(dv->
fd
,
DV1394_INIT
, &init) < 0)
66
return
-1;
67
68
dv->
avail
= dv->
done
= 0;
69
return
0;
70
}
71
72
static
int
dv1394_start
(
struct
dv1394_data
*dv)
73
{
74
/* Tell DV1394 driver to enable receiver */
75
if
(ioctl(dv->
fd
,
DV1394_START_RECEIVE
, 0) < 0) {
76
av_log
(
NULL
,
AV_LOG_ERROR
,
"Failed to start receiver: %s\n"
, strerror(errno));
77
return
-1;
78
}
79
return
0;
80
}
81
82
static
int
dv1394_read_header
(
AVFormatContext
* context)
83
{
84
struct
dv1394_data
*dv = context->
priv_data
;
85
86
dv->
dv_demux
=
avpriv_dv_init_demux
(context);
87
if
(!dv->
dv_demux
)
88
goto
failed;
89
90
/* Open and initialize DV1394 device */
91
dv->
fd
= open(context->
filename
, O_RDONLY);
92
if
(dv->
fd
< 0) {
93
av_log
(context,
AV_LOG_ERROR
,
"Failed to open DV interface: %s\n"
, strerror(errno));
94
goto
failed;
95
}
96
97
if
(
dv1394_reset
(dv) < 0) {
98
av_log
(context,
AV_LOG_ERROR
,
"Failed to initialize DV interface: %s\n"
, strerror(errno));
99
goto
failed;
100
}
101
102
dv->
ring
= mmap(
NULL
,
DV1394_PAL_FRAME_SIZE
*
DV1394_RING_FRAMES
,
103
PROT_READ, MAP_PRIVATE, dv->
fd
, 0);
104
if
(dv->
ring
== MAP_FAILED) {
105
av_log
(context,
AV_LOG_ERROR
,
"Failed to mmap DV ring buffer: %s\n"
, strerror(errno));
106
goto
failed;
107
}
108
109
if
(
dv1394_start
(dv) < 0)
110
goto
failed;
111
112
return
0;
113
114
failed:
115
close
(dv->
fd
);
116
return
AVERROR
(EIO);
117
}
118
119
static
int
dv1394_read_packet
(
AVFormatContext
*context,
AVPacket
*
pkt
)
120
{
121
struct
dv1394_data
*dv = context->
priv_data
;
122
int
size
;
123
124
size =
avpriv_dv_get_packet
(dv->
dv_demux
, pkt);
125
if
(size > 0)
126
return
size
;
127
128
if
(!dv->
avail
) {
129
struct
dv1394_status
s;
130
struct
pollfd p;
131
132
if
(dv->
done
) {
133
/* Request more frames */
134
if
(ioctl(dv->
fd
,
DV1394_RECEIVE_FRAMES
, dv->
done
) < 0) {
135
/* This usually means that ring buffer overflowed.
136
* We have to reset :(.
137
*/
138
139
av_log
(context,
AV_LOG_ERROR
,
"DV1394: Ring buffer overflow. Reseting ..\n"
);
140
141
dv1394_reset
(dv);
142
dv1394_start
(dv);
143
}
144
dv->
done
= 0;
145
}
146
147
/* Wait until more frames are available */
148
restart_poll:
149
p.fd = dv->
fd
;
150
p.events = POLLIN | POLLERR | POLLHUP;
151
if
(poll(&p, 1, -1) < 0) {
152
if
(errno == EAGAIN || errno == EINTR)
153
goto
restart_poll;
154
av_log
(context,
AV_LOG_ERROR
,
"Poll failed: %s\n"
, strerror(errno));
155
return
AVERROR
(EIO);
156
}
157
158
if
(ioctl(dv->
fd
,
DV1394_GET_STATUS
, &s) < 0) {
159
av_log
(context,
AV_LOG_ERROR
,
"Failed to get status: %s\n"
, strerror(errno));
160
return
AVERROR
(EIO);
161
}
162
av_dlog
(context,
"DV1394: status\n"
163
"\tactive_frame\t%d\n"
164
"\tfirst_clear_frame\t%d\n"
165
"\tn_clear_frames\t%d\n"
166
"\tdropped_frames\t%d\n"
,
167
s.
active_frame
, s.
first_clear_frame
,
168
s.
n_clear_frames
, s.
dropped_frames
);
169
170
dv->
avail
= s.
n_clear_frames
;
171
dv->
index
= s.
first_clear_frame
;
172
dv->
done
= 0;
173
174
if
(s.
dropped_frames
) {
175
av_log
(context,
AV_LOG_ERROR
,
"DV1394: Frame drop detected (%d). Reseting ..\n"
,
176
s.
dropped_frames
);
177
178
dv1394_reset
(dv);
179
dv1394_start
(dv);
180
}
181
}
182
183
av_dlog
(context,
"index %d, avail %d, done %d\n"
, dv->
index
, dv->
avail
,
184
dv->
done
);
185
186
size =
avpriv_dv_produce_packet
(dv->
dv_demux
, pkt,
187
dv->
ring
+ (dv->
index
*
DV1394_PAL_FRAME_SIZE
),
188
DV1394_PAL_FRAME_SIZE
, -1);
189
dv->
index
= (dv->
index
+ 1) %
DV1394_RING_FRAMES
;
190
dv->
done
++; dv->
avail
--;
191
192
return
size
;
193
}
194
195
static
int
dv1394_close
(
AVFormatContext
* context)
196
{
197
struct
dv1394_data
*dv = context->
priv_data
;
198
199
/* Shutdown DV1394 receiver */
200
if
(ioctl(dv->
fd
,
DV1394_SHUTDOWN
, 0) < 0)
201
av_log
(context,
AV_LOG_ERROR
,
"Failed to shutdown DV1394: %s\n"
, strerror(errno));
202
203
/* Unmap ring buffer */
204
if
(munmap(dv->
ring
,
DV1394_NTSC_FRAME_SIZE
*
DV1394_RING_FRAMES
) < 0)
205
av_log
(context,
AV_LOG_ERROR
,
"Failed to munmap DV1394 ring buffer: %s\n"
, strerror(errno));
206
207
close
(dv->
fd
);
208
av_free
(dv->
dv_demux
);
209
210
return
0;
211
}
212
213
static
const
AVOption
options
[] = {
214
{
"standard"
,
""
, offsetof(
struct
dv1394_data
,
format
),
AV_OPT_TYPE_INT
, {.i64 =
DV1394_NTSC
},
DV1394_NTSC
,
DV1394_PAL
,
AV_OPT_FLAG_DECODING_PARAM
,
"standard"
},
215
{
"PAL"
,
""
, 0,
AV_OPT_TYPE_CONST
, {.i64 =
DV1394_PAL
}, 0, 0,
AV_OPT_FLAG_DECODING_PARAM
,
"standard"
},
216
{
"NTSC"
,
""
, 0,
AV_OPT_TYPE_CONST
, {.i64 =
DV1394_NTSC
}, 0, 0,
AV_OPT_FLAG_DECODING_PARAM
,
"standard"
},
217
{
"channel"
,
""
, offsetof(
struct
dv1394_data
,
channel
),
AV_OPT_TYPE_INT
, {.i64 =
DV1394_DEFAULT_CHANNEL
}, 0, INT_MAX,
AV_OPT_FLAG_DECODING_PARAM
},
218
{
NULL
},
219
};
220
221
static
const
AVClass
dv1394_class
= {
222
.
class_name
=
"DV1394 indev"
,
223
.item_name =
av_default_item_name
,
224
.option =
options
,
225
.version =
LIBAVUTIL_VERSION_INT
,
226
};
227
228
AVInputFormat
ff_dv1394_demuxer
= {
229
.
name
=
"dv1394"
,
230
.long_name =
NULL_IF_CONFIG_SMALL
(
"DV1394 A/V grab"
),
231
.priv_data_size =
sizeof
(
struct
dv1394_data
),
232
.read_header =
dv1394_read_header
,
233
.read_packet =
dv1394_read_packet
,
234
.read_close =
dv1394_close
,
235
.flags =
AVFMT_NOFILE
,
236
.priv_class = &
dv1394_class
,
237
};
Generated on Sat May 25 2013 03:58:43 for FFmpeg by
1.8.2