Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
F
ffmpeg.wasm-core
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Linshizhi
ffmpeg.wasm-core
Commits
941e9f22
Commit
941e9f22
authored
Jan 12, 2012
by
Anton Khirnov
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
lavd: remove deprecated v4l grab device.
parent
d1ad6bdb
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
0 additions
and
376 deletions
+0
-376
configure
configure
+0
-2
Makefile
libavdevice/Makefile
+0
-1
alldevices.c
libavdevice/alldevices.c
+0
-3
avdevice.h
libavdevice/avdevice.h
+0
-4
v4l.c
libavdevice/v4l.c
+0
-366
No files found.
configure
View file @
941e9f22
...
...
@@ -1486,7 +1486,6 @@ oss_outdev_deps_any="soundcard_h sys_soundcard_h"
pulse_indev_deps
=
"libpulse"
sndio_indev_deps
=
"sndio_h"
sndio_outdev_deps
=
"sndio_h"
v4l_indev_deps
=
"linux_videodev_h"
v4l2_indev_deps_any
=
"linux_videodev2_h sys_videoio_h"
vfwcap_indev_deps
=
"capCreateCaptureWindow vfwcap_defines"
vfwcap_indev_extralibs
=
"-lavicap32"
...
...
@@ -2988,7 +2987,6 @@ fi
texi2html
-version
>
/dev/null 2>&1
&&
enable
texi2html
||
disable texi2html
check_header linux/fb.h
check_header linux/videodev.h
check_header linux/videodev2.h
check_struct linux/videodev2.h
"struct v4l2_frmivalenum"
discrete
...
...
libavdevice/Makefile
View file @
941e9f22
...
...
@@ -20,7 +20,6 @@ OBJS-$(CONFIG_PULSE_INDEV) += pulse.o
OBJS-$(CONFIG_SNDIO_INDEV)
+=
sndio_common.o
sndio_dec.o
OBJS-$(CONFIG_SNDIO_OUTDEV)
+=
sndio_common.o
sndio_enc.o
OBJS-$(CONFIG_V4L2_INDEV)
+=
v4l2.o
OBJS-$(CONFIG_V4L_INDEV)
+=
v4l.o
OBJS-$(CONFIG_VFWCAP_INDEV)
+=
vfwcap.o
OBJS-$(CONFIG_X11_GRAB_DEVICE_INDEV)
+=
x11grab.o
...
...
libavdevice/alldevices.c
View file @
941e9f22
...
...
@@ -48,9 +48,6 @@ void avdevice_register_all(void)
REGISTER_INDEV
(
PULSE
,
pulse
);
REGISTER_INOUTDEV
(
SNDIO
,
sndio
);
REGISTER_INDEV
(
V4L2
,
v4l2
);
#if FF_API_V4L
REGISTER_INDEV
(
V4L
,
v4l
);
#endif
REGISTER_INDEV
(
VFWCAP
,
vfwcap
);
REGISTER_INDEV
(
X11_GRAB_DEVICE
,
x11_grab_device
);
...
...
libavdevice/avdevice.h
View file @
941e9f22
...
...
@@ -55,10 +55,6 @@
LIBAVDEVICE_VERSION_MICRO)
#define LIBAVDEVICE_BUILD LIBAVDEVICE_VERSION_INT
#ifndef FF_API_V4L
#define FF_API_V4L (LIBAVDEVICE_VERSION_MAJOR < 54)
#endif
/**
* Return the LIBAVDEVICE_VERSION_INT constant.
*/
...
...
libavdevice/v4l.c
deleted
100644 → 0
View file @
d1ad6bdb
/*
* Linux video grab interface
* Copyright (c) 2000,2001 Fabrice Bellard
*
* This file is part of Libav.
*
* Libav is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* Libav is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with Libav; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "avdevice.h"
#if FF_API_V4L
#undef __STRICT_ANSI__ //workaround due to broken kernel headers
#include "config.h"
#include "libavutil/rational.h"
#include "libavutil/imgutils.h"
#include "libavutil/log.h"
#include "libavutil/opt.h"
#include "libavformat/avformat.h"
#include "libavformat/internal.h"
#include "libavcodec/dsputil.h"
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <sys/time.h>
#define _LINUX_TIME_H 1
#include <linux/videodev.h>
#include <time.h>
typedef
struct
{
AVClass
*
class
;
int
fd
;
int
frame_format
;
/* see VIDEO_PALETTE_xxx */
int
use_mmap
;
AVRational
time_base
;
int64_t
time_frame
;
int
frame_size
;
struct
video_capability
video_cap
;
struct
video_audio
audio_saved
;
struct
video_window
video_win
;
uint8_t
*
video_buf
;
struct
video_mbuf
gb_buffers
;
struct
video_mmap
gb_buf
;
int
gb_frame
;
int
standard
;
}
VideoData
;
static
const
struct
{
int
palette
;
int
depth
;
enum
PixelFormat
pix_fmt
;
}
video_formats
[]
=
{
{.
palette
=
VIDEO_PALETTE_YUV420P
,
.
depth
=
12
,
.
pix_fmt
=
PIX_FMT_YUV420P
},
{.
palette
=
VIDEO_PALETTE_YUV422
,
.
depth
=
16
,
.
pix_fmt
=
PIX_FMT_YUYV422
},
{.
palette
=
VIDEO_PALETTE_UYVY
,
.
depth
=
16
,
.
pix_fmt
=
PIX_FMT_UYVY422
},
{.
palette
=
VIDEO_PALETTE_YUYV
,
.
depth
=
16
,
.
pix_fmt
=
PIX_FMT_YUYV422
},
/* NOTE: v4l uses BGR24, not RGB24 */
{.
palette
=
VIDEO_PALETTE_RGB24
,
.
depth
=
24
,
.
pix_fmt
=
PIX_FMT_BGR24
},
{.
palette
=
VIDEO_PALETTE_RGB565
,
.
depth
=
16
,
.
pix_fmt
=
PIX_FMT_BGR565
},
{.
palette
=
VIDEO_PALETTE_GREY
,
.
depth
=
8
,
.
pix_fmt
=
PIX_FMT_GRAY8
},
};
static
int
grab_read_header
(
AVFormatContext
*
s1
,
AVFormatParameters
*
ap
)
{
VideoData
*
s
=
s1
->
priv_data
;
AVStream
*
st
;
int
video_fd
;
int
desired_palette
,
desired_depth
;
struct
video_tuner
tuner
;
struct
video_audio
audio
;
struct
video_picture
pict
;
int
j
;
int
vformat_num
=
FF_ARRAY_ELEMS
(
video_formats
);
av_log
(
s1
,
AV_LOG_WARNING
,
"V4L input device is deprecated and will be removed in the next release."
);
if
(
ap
->
time_base
.
den
<=
0
)
{
av_log
(
s1
,
AV_LOG_ERROR
,
"Wrong time base (%d)
\n
"
,
ap
->
time_base
.
den
);
return
-
1
;
}
s
->
time_base
=
ap
->
time_base
;
s
->
video_win
.
width
=
ap
->
width
;
s
->
video_win
.
height
=
ap
->
height
;
st
=
avformat_new_stream
(
s1
,
NULL
);
if
(
!
st
)
return
AVERROR
(
ENOMEM
);
avpriv_set_pts_info
(
st
,
64
,
1
,
1000000
);
/* 64 bits pts in us */
video_fd
=
open
(
s1
->
filename
,
O_RDWR
);
if
(
video_fd
<
0
)
{
av_log
(
s1
,
AV_LOG_ERROR
,
"%s: %s
\n
"
,
s1
->
filename
,
strerror
(
errno
));
goto
fail
;
}
if
(
ioctl
(
video_fd
,
VIDIOCGCAP
,
&
s
->
video_cap
)
<
0
)
{
av_log
(
s1
,
AV_LOG_ERROR
,
"VIDIOCGCAP: %s
\n
"
,
strerror
(
errno
));
goto
fail
;
}
if
(
!
(
s
->
video_cap
.
type
&
VID_TYPE_CAPTURE
))
{
av_log
(
s1
,
AV_LOG_ERROR
,
"Fatal: grab device does not handle capture
\n
"
);
goto
fail
;
}
/* no values set, autodetect them */
if
(
s
->
video_win
.
width
<=
0
||
s
->
video_win
.
height
<=
0
)
{
if
(
ioctl
(
video_fd
,
VIDIOCGWIN
,
&
s
->
video_win
,
sizeof
(
s
->
video_win
))
<
0
)
{
av_log
(
s1
,
AV_LOG_ERROR
,
"VIDIOCGWIN: %s
\n
"
,
strerror
(
errno
));
goto
fail
;
}
}
if
(
av_image_check_size
(
s
->
video_win
.
width
,
s
->
video_win
.
height
,
0
,
s1
)
<
0
)
return
-
1
;
desired_palette
=
-
1
;
desired_depth
=
-
1
;
for
(
j
=
0
;
j
<
vformat_num
;
j
++
)
{
if
(
ap
->
pix_fmt
==
video_formats
[
j
].
pix_fmt
)
{
desired_palette
=
video_formats
[
j
].
palette
;
desired_depth
=
video_formats
[
j
].
depth
;
break
;
}
}
/* set tv standard */
if
(
!
ioctl
(
video_fd
,
VIDIOCGTUNER
,
&
tuner
))
{
tuner
.
mode
=
s
->
standard
;
ioctl
(
video_fd
,
VIDIOCSTUNER
,
&
tuner
);
}
/* unmute audio */
audio
.
audio
=
0
;
ioctl
(
video_fd
,
VIDIOCGAUDIO
,
&
audio
);
memcpy
(
&
s
->
audio_saved
,
&
audio
,
sizeof
(
audio
));
audio
.
flags
&=
~
VIDEO_AUDIO_MUTE
;
ioctl
(
video_fd
,
VIDIOCSAUDIO
,
&
audio
);
ioctl
(
video_fd
,
VIDIOCGPICT
,
&
pict
);
av_dlog
(
s1
,
"v4l: colour=%d hue=%d brightness=%d constrast=%d whiteness=%d
\n
"
,
pict
.
colour
,
pict
.
hue
,
pict
.
brightness
,
pict
.
contrast
,
pict
.
whiteness
);
/* try to choose a suitable video format */
pict
.
palette
=
desired_palette
;
pict
.
depth
=
desired_depth
;
if
(
desired_palette
==
-
1
||
ioctl
(
video_fd
,
VIDIOCSPICT
,
&
pict
)
<
0
)
{
for
(
j
=
0
;
j
<
vformat_num
;
j
++
)
{
pict
.
palette
=
video_formats
[
j
].
palette
;
pict
.
depth
=
video_formats
[
j
].
depth
;
if
(
-
1
!=
ioctl
(
video_fd
,
VIDIOCSPICT
,
&
pict
))
break
;
}
if
(
j
>=
vformat_num
)
goto
fail1
;
}
if
(
ioctl
(
video_fd
,
VIDIOCGMBUF
,
&
s
->
gb_buffers
)
<
0
)
{
/* try to use read based access */
int
val
;
s
->
video_win
.
x
=
0
;
s
->
video_win
.
y
=
0
;
s
->
video_win
.
chromakey
=
-
1
;
s
->
video_win
.
flags
=
0
;
if
(
ioctl
(
video_fd
,
VIDIOCSWIN
,
s
->
video_win
)
<
0
)
{
av_log
(
s1
,
AV_LOG_ERROR
,
"VIDIOCSWIN: %s
\n
"
,
strerror
(
errno
));
goto
fail
;
}
s
->
frame_format
=
pict
.
palette
;
val
=
1
;
if
(
ioctl
(
video_fd
,
VIDIOCCAPTURE
,
&
val
)
<
0
)
{
av_log
(
s1
,
AV_LOG_ERROR
,
"VIDIOCCAPTURE: %s
\n
"
,
strerror
(
errno
));
goto
fail
;
}
s
->
time_frame
=
av_gettime
()
*
s
->
time_base
.
den
/
s
->
time_base
.
num
;
s
->
use_mmap
=
0
;
}
else
{
s
->
video_buf
=
mmap
(
0
,
s
->
gb_buffers
.
size
,
PROT_READ
|
PROT_WRITE
,
MAP_SHARED
,
video_fd
,
0
);
if
((
unsigned
char
*
)
-
1
==
s
->
video_buf
)
{
s
->
video_buf
=
mmap
(
0
,
s
->
gb_buffers
.
size
,
PROT_READ
|
PROT_WRITE
,
MAP_PRIVATE
,
video_fd
,
0
);
if
((
unsigned
char
*
)
-
1
==
s
->
video_buf
)
{
av_log
(
s1
,
AV_LOG_ERROR
,
"mmap: %s
\n
"
,
strerror
(
errno
));
goto
fail
;
}
}
s
->
gb_frame
=
0
;
s
->
time_frame
=
av_gettime
()
*
s
->
time_base
.
den
/
s
->
time_base
.
num
;
/* start to grab the first frame */
s
->
gb_buf
.
frame
=
s
->
gb_frame
%
s
->
gb_buffers
.
frames
;
s
->
gb_buf
.
height
=
s
->
video_win
.
height
;
s
->
gb_buf
.
width
=
s
->
video_win
.
width
;
s
->
gb_buf
.
format
=
pict
.
palette
;
if
(
ioctl
(
video_fd
,
VIDIOCMCAPTURE
,
&
s
->
gb_buf
)
<
0
)
{
if
(
errno
!=
EAGAIN
)
{
fail1:
av_log
(
s1
,
AV_LOG_ERROR
,
"VIDIOCMCAPTURE: %s
\n
"
,
strerror
(
errno
));
}
else
{
av_log
(
s1
,
AV_LOG_ERROR
,
"Fatal: grab device does not receive any video signal
\n
"
);
}
goto
fail
;
}
for
(
j
=
1
;
j
<
s
->
gb_buffers
.
frames
;
j
++
)
{
s
->
gb_buf
.
frame
=
j
;
ioctl
(
video_fd
,
VIDIOCMCAPTURE
,
&
s
->
gb_buf
);
}
s
->
frame_format
=
s
->
gb_buf
.
format
;
s
->
use_mmap
=
1
;
}
for
(
j
=
0
;
j
<
vformat_num
;
j
++
)
{
if
(
s
->
frame_format
==
video_formats
[
j
].
palette
)
{
s
->
frame_size
=
s
->
video_win
.
width
*
s
->
video_win
.
height
*
video_formats
[
j
].
depth
/
8
;
st
->
codec
->
pix_fmt
=
video_formats
[
j
].
pix_fmt
;
break
;
}
}
if
(
j
>=
vformat_num
)
goto
fail
;
s
->
fd
=
video_fd
;
st
->
codec
->
codec_type
=
AVMEDIA_TYPE_VIDEO
;
st
->
codec
->
codec_id
=
CODEC_ID_RAWVIDEO
;
st
->
codec
->
width
=
s
->
video_win
.
width
;
st
->
codec
->
height
=
s
->
video_win
.
height
;
st
->
codec
->
time_base
=
s
->
time_base
;
st
->
codec
->
bit_rate
=
s
->
frame_size
*
1
/
av_q2d
(
st
->
codec
->
time_base
)
*
8
;
return
0
;
fail:
if
(
video_fd
>=
0
)
close
(
video_fd
);
return
AVERROR
(
EIO
);
}
static
int
v4l_mm_read_picture
(
VideoData
*
s
,
uint8_t
*
buf
)
{
uint8_t
*
ptr
;
while
(
ioctl
(
s
->
fd
,
VIDIOCSYNC
,
&
s
->
gb_frame
)
<
0
&&
(
errno
==
EAGAIN
||
errno
==
EINTR
));
ptr
=
s
->
video_buf
+
s
->
gb_buffers
.
offsets
[
s
->
gb_frame
];
memcpy
(
buf
,
ptr
,
s
->
frame_size
);
/* Setup to capture the next frame */
s
->
gb_buf
.
frame
=
s
->
gb_frame
;
if
(
ioctl
(
s
->
fd
,
VIDIOCMCAPTURE
,
&
s
->
gb_buf
)
<
0
)
{
if
(
errno
==
EAGAIN
)
av_log
(
NULL
,
AV_LOG_ERROR
,
"Cannot Sync
\n
"
);
else
av_log
(
NULL
,
AV_LOG_ERROR
,
"VIDIOCMCAPTURE: %s
\n
"
,
strerror
(
errno
));
return
AVERROR
(
EIO
);
}
/* This is now the grabbing frame */
s
->
gb_frame
=
(
s
->
gb_frame
+
1
)
%
s
->
gb_buffers
.
frames
;
return
s
->
frame_size
;
}
static
int
grab_read_packet
(
AVFormatContext
*
s1
,
AVPacket
*
pkt
)
{
VideoData
*
s
=
s1
->
priv_data
;
int64_t
curtime
,
delay
;
struct
timespec
ts
;
/* Calculate the time of the next frame */
s
->
time_frame
+=
INT64_C
(
1000000
);
/* wait based on the frame rate */
for
(;;)
{
curtime
=
av_gettime
();
delay
=
s
->
time_frame
*
s
->
time_base
.
num
/
s
->
time_base
.
den
-
curtime
;
if
(
delay
<=
0
)
{
if
(
delay
<
INT64_C
(
-
1000000
)
*
s
->
time_base
.
num
/
s
->
time_base
.
den
)
{
/* printf("grabbing is %d frames late (dropping)\n", (int) -(delay / 16666)); */
s
->
time_frame
+=
INT64_C
(
1000000
);
}
break
;
}
ts
.
tv_sec
=
delay
/
1000000
;
ts
.
tv_nsec
=
(
delay
%
1000000
)
*
1000
;
nanosleep
(
&
ts
,
NULL
);
}
if
(
av_new_packet
(
pkt
,
s
->
frame_size
)
<
0
)
return
AVERROR
(
EIO
);
pkt
->
pts
=
curtime
;
/* read one frame */
if
(
s
->
use_mmap
)
{
return
v4l_mm_read_picture
(
s
,
pkt
->
data
);
}
else
{
if
(
read
(
s
->
fd
,
pkt
->
data
,
pkt
->
size
)
!=
pkt
->
size
)
return
AVERROR
(
EIO
);
return
s
->
frame_size
;
}
}
static
int
grab_read_close
(
AVFormatContext
*
s1
)
{
VideoData
*
s
=
s1
->
priv_data
;
if
(
s
->
use_mmap
)
munmap
(
s
->
video_buf
,
s
->
gb_buffers
.
size
);
/* mute audio. we must force it because the BTTV driver does not
return its state correctly */
s
->
audio_saved
.
flags
|=
VIDEO_AUDIO_MUTE
;
ioctl
(
s
->
fd
,
VIDIOCSAUDIO
,
&
s
->
audio_saved
);
close
(
s
->
fd
);
return
0
;
}
static
const
AVOption
options
[]
=
{
{
"standard"
,
""
,
offsetof
(
VideoData
,
standard
),
AV_OPT_TYPE_INT
,
{.
dbl
=
VIDEO_MODE_NTSC
},
VIDEO_MODE_PAL
,
VIDEO_MODE_NTSC
,
AV_OPT_FLAG_DECODING_PARAM
,
"standard"
},
{
"PAL"
,
""
,
0
,
AV_OPT_TYPE_CONST
,
{.
dbl
=
VIDEO_MODE_PAL
},
0
,
0
,
AV_OPT_FLAG_DECODING_PARAM
,
"standard"
},
{
"SECAM"
,
""
,
0
,
AV_OPT_TYPE_CONST
,
{.
dbl
=
VIDEO_MODE_SECAM
},
0
,
0
,
AV_OPT_FLAG_DECODING_PARAM
,
"standard"
},
{
"NTSC"
,
""
,
0
,
AV_OPT_TYPE_CONST
,
{.
dbl
=
VIDEO_MODE_NTSC
},
0
,
0
,
AV_OPT_FLAG_DECODING_PARAM
,
"standard"
},
{
NULL
},
};
static
const
AVClass
v4l_class
=
{
.
class_name
=
"V4L indev"
,
.
item_name
=
av_default_item_name
,
.
option
=
options
,
.
version
=
LIBAVUTIL_VERSION_INT
,
};
AVInputFormat
ff_v4l_demuxer
=
{
.
name
=
"video4linux"
,
.
long_name
=
NULL_IF_CONFIG_SMALL
(
"Video4Linux device grab"
),
.
priv_data_size
=
sizeof
(
VideoData
),
.
read_header
=
grab_read_header
,
.
read_packet
=
grab_read_packet
,
.
read_close
=
grab_read_close
,
.
flags
=
AVFMT_NOFILE
,
.
priv_class
=
&
v4l_class
,
};
#endif
/* FF_API_V4L */
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment