Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
小白菜888
Ffmpeg
提交
c6f95144
F
Ffmpeg
项目概览
小白菜888
/
Ffmpeg
通知
3
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
F
Ffmpeg
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
c6f95144
编写于
3月 07, 2011
作者:
S
Stefano Sabatini
提交者:
Anton Khirnov
3月 28, 2011
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
framebuffer device demuxer
Signed-off-by:
N
Anton Khirnov
<
anton@khirnov.net
>
上级
364cbc34
变更
7
隐藏空白更改
内联
并排
Showing
7 changed file
with
281 addition
and
1 deletion
+281
-1
Changelog
Changelog
+1
-0
configure
configure
+2
-0
doc/indevs.texi
doc/indevs.texi
+25
-0
libavdevice/Makefile
libavdevice/Makefile
+1
-0
libavdevice/alldevices.c
libavdevice/alldevices.c
+1
-0
libavdevice/avdevice.h
libavdevice/avdevice.h
+1
-1
libavdevice/fbdev.c
libavdevice/fbdev.c
+250
-0
未找到文件。
Changelog
浏览文件 @
c6f95144
...
...
@@ -80,6 +80,7 @@ version <next>:
- Bitmap Brothers JV playback system
- Apple HTTP Live Streaming protocol handler
- sndio support for playback and record
- Linux framebuffer input device added
version 0.6:
...
...
configure
浏览文件 @
c6f95144
...
...
@@ -1430,6 +1430,7 @@ alsa_indev_deps="alsa_asoundlib_h snd_pcm_htimestamp"
alsa_outdev_deps
=
"alsa_asoundlib_h"
bktr_indev_deps_any
=
"dev_bktr_ioctl_bt848_h machine_ioctl_bt848_h dev_video_bktr_ioctl_bt848_h dev_ic_bt8xx_h"
dv1394_indev_deps
=
"dv1394 dv_demuxer"
fbdev_indev_deps
=
"linux_fb_h"
jack_indev_deps
=
"jack_jack_h"
libdc1394_indev_deps
=
"libdc1394"
oss_indev_deps_any
=
"soundcard_h sys_soundcard_h"
...
...
@@ -2897,6 +2898,7 @@ 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_header sys/videoio.h
...
...
doc/indevs.texi
浏览文件 @
c6f95144
...
...
@@ -59,6 +59,31 @@ BSD video input device.
Linux DV 1394 input device.
@section fbdev
Linux framebuffer input device.
The Linux framebuffer is a graphic hardware-independent abstraction
layer to show graphics on a computer monitor, typically on the
console. It is accessed through a file device node, usually
@file{/dev/fb0}.
For more detailed information read the file
Documentation/fb/framebuffer.txt included in the Linux source tree.
To record from the framebuffer device @file{/dev/fb0} with
@file{ffmpeg}:
@example
ffmpeg -f fbdev -r 10 -i /dev/fb0 out.avi
@end example
You can take a single screenshot image with the command:
@example
ffmpeg -f fbdev -vframes 1 -r 1 -i /dev/fb0 screenshot.jpeg
@end example
See also @url{http://linux-fbdev.sourceforge.net/}, and fbset(1).
@section jack
JACK input device.
...
...
libavdevice/Makefile
浏览文件 @
c6f95144
...
...
@@ -14,6 +14,7 @@ OBJS-$(CONFIG_ALSA_OUTDEV) += alsa-audio-common.o \
alsa-audio-enc.o
OBJS-$(CONFIG_BKTR_INDEV)
+=
bktr.o
OBJS-$(CONFIG_DV1394_INDEV)
+=
dv1394.o
OBJS-$(CONFIG_FBDEV_INDEV)
+=
fbdev.o
OBJS-$(CONFIG_JACK_INDEV)
+=
jack_audio.o
OBJS-$(CONFIG_OSS_INDEV)
+=
oss_audio.o
OBJS-$(CONFIG_OSS_OUTDEV)
+=
oss_audio.o
...
...
libavdevice/alldevices.c
浏览文件 @
c6f95144
...
...
@@ -42,6 +42,7 @@ void avdevice_register_all(void)
REGISTER_INOUTDEV
(
ALSA
,
alsa
);
REGISTER_INDEV
(
BKTR
,
bktr
);
REGISTER_INDEV
(
DV1394
,
dv1394
);
REGISTER_INDEV
(
FBDEV
,
fbdev
);
REGISTER_INDEV
(
JACK
,
jack
);
REGISTER_INOUTDEV
(
OSS
,
oss
);
REGISTER_INOUTDEV
(
SNDIO
,
sndio
);
...
...
libavdevice/avdevice.h
浏览文件 @
c6f95144
...
...
@@ -22,7 +22,7 @@
#include "libavutil/avutil.h"
#define LIBAVDEVICE_VERSION_MAJOR 52
#define LIBAVDEVICE_VERSION_MINOR
3
#define LIBAVDEVICE_VERSION_MINOR
4
#define LIBAVDEVICE_VERSION_MICRO 0
#define LIBAVDEVICE_VERSION_INT AV_VERSION_INT(LIBAVDEVICE_VERSION_MAJOR, \
...
...
libavdevice/fbdev.c
0 → 100644
浏览文件 @
c6f95144
/*
* Copyright (c) 2011 Stefano Sabatini
* Copyright (c) 2009 Giliard B. de Freitas <giliarde@gmail.com>
* Copyright (C) 2002 Gunnar Monell <gmo@linux.nu>
*
* 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
*/
/**
* @file
* Linux framebuffer input device,
* inspired by code from fbgrab.c by Gunnar Monell.
* See also http://linux-fbdev.sourceforge.net/.
*/
/* #define DEBUG */
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/time.h>
#include <sys/mman.h>
#include <time.h>
#include <linux/fb.h>
#include "libavutil/mem.h"
#include "libavutil/pixdesc.h"
#include "libavformat/avformat.h"
struct
rgb_pixfmt_map_entry
{
int
bits_per_pixel
;
int
red_offset
,
green_offset
,
blue_offset
,
alpha_offset
;
enum
PixelFormat
pixfmt
;
};
static
struct
rgb_pixfmt_map_entry
rgb_pixfmt_map
[]
=
{
// bpp, red_offset, green_offset, blue_offset, alpha_offset, pixfmt
{
32
,
0
,
8
,
16
,
24
,
PIX_FMT_RGBA
},
{
32
,
16
,
8
,
0
,
24
,
PIX_FMT_BGRA
},
{
32
,
8
,
16
,
24
,
0
,
PIX_FMT_ARGB
},
{
32
,
3
,
2
,
8
,
0
,
PIX_FMT_ABGR
},
{
24
,
0
,
8
,
16
,
0
,
PIX_FMT_RGB24
},
{
24
,
16
,
8
,
0
,
0
,
PIX_FMT_BGR24
},
};
static
enum
PixelFormat
get_pixfmt_from_fb_varinfo
(
struct
fb_var_screeninfo
*
varinfo
)
{
int
i
;
for
(
i
=
0
;
i
<
FF_ARRAY_ELEMS
(
rgb_pixfmt_map
);
i
++
)
{
struct
rgb_pixfmt_map_entry
*
entry
=
&
rgb_pixfmt_map
[
i
];
if
(
entry
->
bits_per_pixel
==
varinfo
->
bits_per_pixel
&&
entry
->
red_offset
==
varinfo
->
red
.
offset
&&
entry
->
green_offset
==
varinfo
->
green
.
offset
&&
entry
->
blue_offset
==
varinfo
->
blue
.
offset
)
return
entry
->
pixfmt
;
}
return
PIX_FMT_NONE
;
}
typedef
struct
{
int
frame_size
;
///< size in bytes of a grabbed frame
AVRational
time_base
;
///< time base
int64_t
time_frame
;
///< time for the next frame to output (in 1/1000000 units)
int
fd
;
///< framebuffer device file descriptor
int
width
,
heigth
;
///< assumed frame resolution
int
frame_linesize
;
///< linesize of the output frame, it is assumed to be constant
int
bytes_per_pixel
;
struct
fb_var_screeninfo
varinfo
;
///< variable info;
struct
fb_fix_screeninfo
fixinfo
;
///< fixed info;
uint8_t
*
data
;
///< framebuffer data
}
FBDevContext
;
av_cold
static
int
fbdev_read_header
(
AVFormatContext
*
avctx
,
AVFormatParameters
*
ap
)
{
FBDevContext
*
fbdev
=
avctx
->
priv_data
;
AVStream
*
st
=
NULL
;
enum
PixelFormat
pix_fmt
;
int
ret
,
flags
=
O_RDONLY
;
if
(
!
(
st
=
av_new_stream
(
avctx
,
0
)))
return
AVERROR
(
ENOMEM
);
av_set_pts_info
(
st
,
64
,
1
,
1000000
);
/* 64 bits pts in microseconds */
if
(
ap
->
time_base
.
den
<=
0
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"Invalid time base %d/%d
\n
"
,
ap
->
time_base
.
num
,
ap
->
time_base
.
den
);
return
AVERROR
(
EINVAL
);
}
/* NONBLOCK is ignored by the fbdev driver, only set for consistency */
if
(
avctx
->
flags
&
AVFMT_FLAG_NONBLOCK
)
flags
|=
O_NONBLOCK
;
if
((
fbdev
->
fd
=
open
(
avctx
->
filename
,
flags
))
==
-
1
)
{
ret
=
AVERROR
(
errno
);
av_log
(
avctx
,
AV_LOG_ERROR
,
"Could not open framebuffer device '%s': %s
\n
"
,
avctx
->
filename
,
strerror
(
ret
));
return
ret
;
}
if
(
ioctl
(
fbdev
->
fd
,
FBIOGET_VSCREENINFO
,
&
fbdev
->
varinfo
)
<
0
)
{
ret
=
AVERROR
(
errno
);
av_log
(
avctx
,
AV_LOG_ERROR
,
"FBIOGET_VSCREENINFO: %s
\n
"
,
strerror
(
errno
));
goto
fail
;
}
if
(
ioctl
(
fbdev
->
fd
,
FBIOGET_FSCREENINFO
,
&
fbdev
->
fixinfo
)
<
0
)
{
ret
=
AVERROR
(
errno
);
av_log
(
avctx
,
AV_LOG_ERROR
,
"FBIOGET_FSCREENINFO: %s
\n
"
,
strerror
(
errno
));
goto
fail
;
}
pix_fmt
=
get_pixfmt_from_fb_varinfo
(
&
fbdev
->
varinfo
);
if
(
pix_fmt
==
PIX_FMT_NONE
)
{
ret
=
AVERROR
(
EINVAL
);
av_log
(
avctx
,
AV_LOG_ERROR
,
"Framebuffer pixel format not supported.
\n
"
);
goto
fail
;
}
fbdev
->
width
=
fbdev
->
varinfo
.
xres
;
fbdev
->
heigth
=
fbdev
->
varinfo
.
yres
;
fbdev
->
bytes_per_pixel
=
(
fbdev
->
varinfo
.
bits_per_pixel
+
7
)
>>
3
;
fbdev
->
frame_linesize
=
fbdev
->
width
*
fbdev
->
bytes_per_pixel
;
fbdev
->
frame_size
=
fbdev
->
frame_linesize
*
fbdev
->
heigth
;
fbdev
->
time_base
=
ap
->
time_base
;
fbdev
->
time_frame
=
AV_NOPTS_VALUE
;
fbdev
->
data
=
mmap
(
NULL
,
fbdev
->
fixinfo
.
smem_len
,
PROT_READ
,
MAP_SHARED
,
fbdev
->
fd
,
0
);
if
(
fbdev
->
data
==
MAP_FAILED
)
{
ret
=
AVERROR
(
errno
);
av_log
(
avctx
,
AV_LOG_ERROR
,
"Error in mmap(): %s
\n
"
,
strerror
(
errno
));
goto
fail
;
}
st
->
codec
->
codec_type
=
AVMEDIA_TYPE_VIDEO
;
st
->
codec
->
codec_id
=
CODEC_ID_RAWVIDEO
;
st
->
codec
->
width
=
fbdev
->
width
;
st
->
codec
->
height
=
fbdev
->
heigth
;
st
->
codec
->
pix_fmt
=
pix_fmt
;
st
->
codec
->
time_base
=
ap
->
time_base
;
st
->
codec
->
bit_rate
=
fbdev
->
width
*
fbdev
->
heigth
*
fbdev
->
bytes_per_pixel
/
av_q2d
(
ap
->
time_base
)
*
8
;
av_log
(
avctx
,
AV_LOG_INFO
,
"w:%d h:%d bpp:%d pixfmt:%s tb:%d/%d bit_rate:%d
\n
"
,
fbdev
->
width
,
fbdev
->
heigth
,
fbdev
->
varinfo
.
bits_per_pixel
,
av_pix_fmt_descriptors
[
pix_fmt
].
name
,
ap
->
time_base
.
num
,
ap
->
time_base
.
den
,
st
->
codec
->
bit_rate
);
return
0
;
fail:
close
(
fbdev
->
fd
);
return
ret
;
}
static
int
fbdev_read_packet
(
AVFormatContext
*
avctx
,
AVPacket
*
pkt
)
{
FBDevContext
*
fbdev
=
avctx
->
priv_data
;
int64_t
curtime
,
delay
;
struct
timespec
ts
;
int
i
,
ret
;
uint8_t
*
pin
,
*
pout
;
if
(
fbdev
->
time_frame
==
AV_NOPTS_VALUE
)
fbdev
->
time_frame
=
av_gettime
();
/* wait based on the frame rate */
curtime
=
av_gettime
();
delay
=
fbdev
->
time_frame
-
curtime
;
av_dlog
(
avctx
,
"time_frame:%"
PRId64
" curtime:%"
PRId64
" delay:%"
PRId64
"
\n
"
,
fbdev
->
time_frame
,
curtime
,
delay
);
if
(
delay
>
0
)
{
if
(
avctx
->
flags
&
AVFMT_FLAG_NONBLOCK
)
return
AVERROR
(
EAGAIN
);
ts
.
tv_sec
=
delay
/
1000000
;
ts
.
tv_nsec
=
(
delay
%
1000000
)
*
1000
;
while
(
nanosleep
(
&
ts
,
&
ts
)
<
0
&&
errno
==
EINTR
);
}
/* compute the time of the next frame */
fbdev
->
time_frame
+=
INT64_C
(
1000000
)
*
av_q2d
(
fbdev
->
time_base
);
if
((
ret
=
av_new_packet
(
pkt
,
fbdev
->
frame_size
))
<
0
)
return
ret
;
/* refresh fbdev->varinfo, visible data position may change at each call */
if
(
ioctl
(
fbdev
->
fd
,
FBIOGET_VSCREENINFO
,
&
fbdev
->
varinfo
)
<
0
)
av_log
(
avctx
,
AV_LOG_WARNING
,
"Error refreshing variable info: %s
\n
"
,
strerror
(
errno
));
pkt
->
pts
=
curtime
;
/* compute visible data offset */
pin
=
fbdev
->
data
+
fbdev
->
bytes_per_pixel
*
fbdev
->
varinfo
.
xoffset
+
fbdev
->
varinfo
.
yoffset
*
fbdev
->
fixinfo
.
line_length
;
pout
=
pkt
->
data
;
// TODO it'd be nice if the lines were aligned
for
(
i
=
0
;
i
<
fbdev
->
heigth
;
i
++
)
{
memcpy
(
pout
,
pin
,
fbdev
->
frame_linesize
);
pin
+=
fbdev
->
fixinfo
.
line_length
;
pout
+=
fbdev
->
frame_linesize
;
}
return
fbdev
->
frame_size
;
}
av_cold
static
int
fbdev_read_close
(
AVFormatContext
*
avctx
)
{
FBDevContext
*
fbdev
=
avctx
->
priv_data
;
munmap
(
fbdev
->
data
,
fbdev
->
frame_size
);
close
(
fbdev
->
fd
);
return
0
;
}
AVInputFormat
ff_fbdev_demuxer
=
{
.
name
=
"fbdev"
,
.
long_name
=
NULL_IF_CONFIG_SMALL
(
"Linux framebuffer"
),
.
priv_data_size
=
sizeof
(
FBDevContext
),
.
read_header
=
fbdev_read_header
,
.
read_packet
=
fbdev_read_packet
,
.
read_close
=
fbdev_read_close
,
.
flags
=
AVFMT_NOFILE
,
};
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录