FFmpeg
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
Examples
File List
Globals
All
Data Structures
Namespaces
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 Wed Jul 10 2013 23:48:08 for FFmpeg by
1.8.2