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
4893c204
Commit
4893c204
authored
Aug 18, 2011
by
Stefano Sabatini
Committed by
Stefano Sabatini
Sep 16, 2011
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
lavdev/lavfi: add audio support
parent
3ee0bedc
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
83 additions
and
23 deletions
+83
-23
Changelog
Changelog
+1
-0
indevs.texi
doc/indevs.texi
+15
-0
avdevice.h
libavdevice/avdevice.h
+1
-1
lavfi.c
libavdevice/lavfi.c
+66
-22
No files found.
Changelog
View file @
4893c204
...
@@ -56,6 +56,7 @@ easier to use. The changes are:
...
@@ -56,6 +56,7 @@ easier to use. The changes are:
- Prores decoder
- Prores decoder
- BIN/XBIN/ADF/IDF text file decoder
- BIN/XBIN/ADF/IDF text file decoder
- aconvert audio filter added
- aconvert audio filter added
- audio support to lavfi input device added
version 0.8:
version 0.8:
...
...
doc/indevs.texi
View file @
4893c204
...
@@ -266,6 +266,21 @@ Create three different video test filtered sources and play them:
...
@@ -266,6 +266,21 @@ Create three different video test filtered sources and play them:
@example
@example
ffplay -f lavfi -graph "testsrc [out0]; testsrc,hflip [out1]; testsrc,negate [out2]" test3
ffplay -f lavfi -graph "testsrc [out0]; testsrc,hflip [out1]; testsrc,negate [out2]" test3
@end example
@end example
@item
Read an audio stream from a file using the amovie source and play it
back with @file{ffplay}:
@example
ffplay -f lavfi "amovie=test.wav"
@end example
@item
Read an audio stream and a video stream and play it back with
@file{ffplay}:
@example
ffplay -f lavfi "movie=test.avi[out0];amovie=test.wav[out1]"
@end example
@end itemize
@end itemize
@section libdc1394
@section libdc1394
...
...
libavdevice/avdevice.h
View file @
4893c204
...
@@ -24,7 +24,7 @@
...
@@ -24,7 +24,7 @@
#define LIBAVDEVICE_VERSION_MAJOR 53
#define LIBAVDEVICE_VERSION_MAJOR 53
#define LIBAVDEVICE_VERSION_MINOR 3
#define LIBAVDEVICE_VERSION_MINOR 3
#define LIBAVDEVICE_VERSION_MICRO
2
#define LIBAVDEVICE_VERSION_MICRO
3
#define LIBAVDEVICE_VERSION_INT AV_VERSION_INT(LIBAVDEVICE_VERSION_MAJOR, \
#define LIBAVDEVICE_VERSION_INT AV_VERSION_INT(LIBAVDEVICE_VERSION_MAJOR, \
LIBAVDEVICE_VERSION_MINOR, \
LIBAVDEVICE_VERSION_MINOR, \
...
...
libavdevice/lavfi.c
View file @
4893c204
...
@@ -80,19 +80,17 @@ av_cold static int lavfi_read_header(AVFormatContext *avctx,
...
@@ -80,19 +80,17 @@ av_cold static int lavfi_read_header(AVFormatContext *avctx,
{
{
LavfiContext
*
lavfi
=
avctx
->
priv_data
;
LavfiContext
*
lavfi
=
avctx
->
priv_data
;
AVFilterInOut
*
input_links
=
NULL
,
*
output_links
=
NULL
,
*
inout
;
AVFilterInOut
*
input_links
=
NULL
,
*
output_links
=
NULL
,
*
inout
;
AVFilter
*
buffersink
;
AVFilter
*
buffersink
,
*
abuffersink
;
int
*
pix_fmts
=
create_all_formats
(
PIX_FMT_NB
);
int
*
pix_fmts
=
create_all_formats
(
PIX_FMT_NB
);
enum
AVMediaType
type
;
int
ret
=
0
,
i
,
n
;
int
ret
=
0
,
i
,
n
;
#define FAIL(ERR) { ret = ERR; goto end; }
#define FAIL(ERR) { ret = ERR; goto end; }
avfilter_register_all
();
avfilter_register_all
();
if
(
!
(
buffersink
=
avfilter_get_by_name
(
"buffersink"
)))
{
buffersink
=
avfilter_get_by_name
(
"buffersink"
);
av_log
(
avctx
,
AV_LOG_ERROR
,
abuffersink
=
avfilter_get_by_name
(
"abuffersink"
);
"Missing required buffersink filter, aborting.
\n
"
);
FAIL
(
AVERROR_FILTER_NOT_FOUND
);
}
if
(
!
lavfi
->
graph_str
)
if
(
!
lavfi
->
graph_str
)
lavfi
->
graph_str
=
av_strdup
(
avctx
->
filename
);
lavfi
->
graph_str
=
av_strdup
(
avctx
->
filename
);
...
@@ -143,9 +141,10 @@ av_cold static int lavfi_read_header(AVFormatContext *avctx,
...
@@ -143,9 +141,10 @@ av_cold static int lavfi_read_header(AVFormatContext *avctx,
}
}
/* is a video output? */
/* is a video output? */
if
(
inout
->
filter_ctx
->
output_pads
[
inout
->
pad_idx
].
type
!=
AVMEDIA_TYPE_VIDEO
)
{
type
=
inout
->
filter_ctx
->
output_pads
[
inout
->
pad_idx
].
type
;
if
(
type
!=
AVMEDIA_TYPE_VIDEO
&&
type
!=
AVMEDIA_TYPE_AUDIO
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
av_log
(
avctx
,
AV_LOG_ERROR
,
"Output '%s' is not a video o
utput, not yet supported
"
,
inout
->
name
);
"Output '%s' is not a video o
r audio output, not yet supported
\n
"
,
inout
->
name
);
FAIL
(
AVERROR
(
EINVAL
));
FAIL
(
AVERROR
(
EINVAL
));
}
}
...
@@ -173,7 +172,19 @@ av_cold static int lavfi_read_header(AVFormatContext *avctx,
...
@@ -173,7 +172,19 @@ av_cold static int lavfi_read_header(AVFormatContext *avctx,
for
(
i
=
0
,
inout
=
output_links
;
inout
;
i
++
,
inout
=
inout
->
next
)
{
for
(
i
=
0
,
inout
=
output_links
;
inout
;
i
++
,
inout
=
inout
->
next
)
{
AVFilterContext
*
sink
;
AVFilterContext
*
sink
;
type
=
inout
->
filter_ctx
->
output_pads
[
inout
->
pad_idx
].
type
;
if
(
type
==
AVMEDIA_TYPE_VIDEO
&&
!
buffersink
||
type
==
AVMEDIA_TYPE_AUDIO
&&
!
abuffersink
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"Missing required buffersink filter, aborting.
\n
"
);
FAIL
(
AVERROR_FILTER_NOT_FOUND
);
}
if
(
type
==
AVMEDIA_TYPE_VIDEO
)
{
AVBufferSinkParams
*
buffersink_params
=
av_buffersink_params_alloc
();
AVBufferSinkParams
*
buffersink_params
=
av_buffersink_params_alloc
();
buffersink_params
->
pixel_fmts
=
pix_fmts
;
#if FF_API_OLD_VSINK_API
#if FF_API_OLD_VSINK_API
ret
=
avfilter_graph_create_filter
(
&
sink
,
buffersink
,
ret
=
avfilter_graph_create_filter
(
&
sink
,
buffersink
,
inout
->
name
,
NULL
,
inout
->
name
,
NULL
,
...
@@ -185,8 +196,25 @@ av_cold static int lavfi_read_header(AVFormatContext *avctx,
...
@@ -185,8 +196,25 @@ av_cold static int lavfi_read_header(AVFormatContext *avctx,
buffersink_params
,
lavfi
->
graph
);
buffersink_params
,
lavfi
->
graph
);
#endif
#endif
av_freep
(
&
buffersink_params
);
av_freep
(
&
buffersink_params
);
if
(
ret
<
0
)
if
(
ret
<
0
)
goto
end
;
goto
end
;
}
else
if
(
type
==
AVMEDIA_TYPE_AUDIO
)
{
enum
AVSampleFormat
sample_fmts
[]
=
{
AV_SAMPLE_FMT_S16
,
-
1
};
const
int
packing_fmts
[]
=
{
AVFILTER_PACKED
,
-
1
};
const
int64_t
*
chlayouts
=
avfilter_all_channel_layouts
;
AVABufferSinkParams
*
abuffersink_params
=
av_abuffersink_params_alloc
();
abuffersink_params
->
sample_fmts
=
sample_fmts
;
abuffersink_params
->
packing_fmts
=
packing_fmts
;
abuffersink_params
->
channel_layouts
=
chlayouts
;
ret
=
avfilter_graph_create_filter
(
&
sink
,
abuffersink
,
inout
->
name
,
NULL
,
abuffersink_params
,
lavfi
->
graph
);
av_free
(
abuffersink_params
);
if
(
ret
<
0
)
goto
end
;
}
lavfi
->
sinks
[
i
]
=
sink
;
lavfi
->
sinks
[
i
]
=
sink
;
if
((
ret
=
avfilter_link
(
inout
->
filter_ctx
,
inout
->
pad_idx
,
sink
,
0
))
<
0
)
if
((
ret
=
avfilter_link
(
inout
->
filter_ctx
,
inout
->
pad_idx
,
sink
,
0
))
<
0
)
...
@@ -211,6 +239,13 @@ av_cold static int lavfi_read_header(AVFormatContext *avctx,
...
@@ -211,6 +239,13 @@ av_cold static int lavfi_read_header(AVFormatContext *avctx,
st
->
codec
->
height
=
link
->
h
;
st
->
codec
->
height
=
link
->
h
;
st
->
sample_aspect_ratio
=
st
->
sample_aspect_ratio
=
st
->
codec
->
sample_aspect_ratio
=
link
->
sample_aspect_ratio
;
st
->
codec
->
sample_aspect_ratio
=
link
->
sample_aspect_ratio
;
}
else
if
(
link
->
type
==
AVMEDIA_TYPE_AUDIO
)
{
st
->
codec
->
codec_id
=
CODEC_ID_PCM_S16LE
;
st
->
codec
->
channels
=
av_get_channel_layout_nb_channels
(
link
->
channel_layout
);
st
->
codec
->
sample_fmt
=
link
->
format
;
st
->
codec
->
sample_rate
=
link
->
sample_rate
;
st
->
codec
->
time_base
=
link
->
time_base
;
st
->
codec
->
channel_layout
=
link
->
channel_layout
;
}
}
}
}
...
@@ -226,8 +261,8 @@ static int lavfi_read_packet(AVFormatContext *avctx, AVPacket *pkt)
...
@@ -226,8 +261,8 @@ static int lavfi_read_packet(AVFormatContext *avctx, AVPacket *pkt)
{
{
LavfiContext
*
lavfi
=
avctx
->
priv_data
;
LavfiContext
*
lavfi
=
avctx
->
priv_data
;
double
min_pts
=
DBL_MAX
;
double
min_pts
=
DBL_MAX
;
int
min_pts_sink_idx
=
0
;
int
stream_idx
,
min_pts_sink_idx
=
0
;
AVFilterBufferRef
*
pic
ref
;
AVFilterBufferRef
*
ref
;
AVPicture
pict
;
AVPicture
pict
;
int
ret
,
i
,
size
;
int
ret
,
i
,
size
;
...
@@ -237,10 +272,10 @@ static int lavfi_read_packet(AVFormatContext *avctx, AVPacket *pkt)
...
@@ -237,10 +272,10 @@ static int lavfi_read_packet(AVFormatContext *avctx, AVPacket *pkt)
AVRational
tb
=
lavfi
->
sinks
[
i
]
->
inputs
[
0
]
->
time_base
;
AVRational
tb
=
lavfi
->
sinks
[
i
]
->
inputs
[
0
]
->
time_base
;
double
d
;
double
d
;
int
ret
=
av_buffersink_get_buffer_ref
(
lavfi
->
sinks
[
i
],
int
ret
=
av_buffersink_get_buffer_ref
(
lavfi
->
sinks
[
i
],
&
pic
ref
,
AV_BUFFERSINK_FLAG_PEEK
);
&
ref
,
AV_BUFFERSINK_FLAG_PEEK
);
if
(
ret
<
0
)
if
(
ret
<
0
)
return
ret
;
return
ret
;
d
=
av_rescale_q
(
pic
ref
->
pts
,
tb
,
AV_TIME_BASE_Q
);
d
=
av_rescale_q
(
ref
->
pts
,
tb
,
AV_TIME_BASE_Q
);
av_dlog
(
avctx
,
"sink_idx:%d time:%f
\n
"
,
i
,
d
);
av_dlog
(
avctx
,
"sink_idx:%d time:%f
\n
"
,
i
,
d
);
if
(
d
<
min_pts
)
{
if
(
d
<
min_pts
)
{
...
@@ -250,22 +285,31 @@ static int lavfi_read_packet(AVFormatContext *avctx, AVPacket *pkt)
...
@@ -250,22 +285,31 @@ static int lavfi_read_packet(AVFormatContext *avctx, AVPacket *pkt)
}
}
av_dlog
(
avctx
,
"min_pts_sink_idx:%i
\n
"
,
min_pts_sink_idx
);
av_dlog
(
avctx
,
"min_pts_sink_idx:%i
\n
"
,
min_pts_sink_idx
);
av_buffersink_get_buffer_ref
(
lavfi
->
sinks
[
min_pts_sink_idx
],
&
picref
,
0
);
av_buffersink_get_buffer_ref
(
lavfi
->
sinks
[
min_pts_sink_idx
],
&
ref
,
0
);
stream_idx
=
lavfi
->
sink_stream_map
[
min_pts_sink_idx
];
size
=
avpicture_get_size
(
picref
->
format
,
picref
->
video
->
w
,
picref
->
video
->
h
);
if
(
ref
->
video
)
{
size
=
avpicture_get_size
(
ref
->
format
,
ref
->
video
->
w
,
ref
->
video
->
h
);
if
((
ret
=
av_new_packet
(
pkt
,
size
))
<
0
)
if
((
ret
=
av_new_packet
(
pkt
,
size
))
<
0
)
return
ret
;
return
ret
;
memcpy
(
pict
.
data
,
picref
->
data
,
4
*
sizeof
(
picref
->
data
[
0
]));
memcpy
(
pict
.
data
,
ref
->
data
,
4
*
sizeof
(
ref
->
data
[
0
]));
memcpy
(
pict
.
linesize
,
picref
->
linesize
,
4
*
sizeof
(
picref
->
linesize
[
0
]));
memcpy
(
pict
.
linesize
,
ref
->
linesize
,
4
*
sizeof
(
ref
->
linesize
[
0
]));
avpicture_layout
(
&
pict
,
ref
->
format
,
ref
->
video
->
w
,
ref
->
video
->
h
,
pkt
->
data
,
size
);
}
else
if
(
ref
->
audio
)
{
size
=
ref
->
linesize
[
0
];
if
((
ret
=
av_new_packet
(
pkt
,
size
))
<
0
)
return
ret
;
memcpy
(
pkt
->
data
,
ref
->
data
[
0
],
size
);
}
avpicture_layout
(
&
pict
,
picref
->
format
,
picref
->
video
->
w
,
pkt
->
stream_index
=
stream_idx
;
picref
->
video
->
h
,
pkt
->
data
,
size
);
pkt
->
pts
=
ref
->
pts
;
pkt
->
stream_index
=
lavfi
->
sink_stream_map
[
min_pts_sink_idx
];
pkt
->
pos
=
ref
->
pos
;
pkt
->
pts
=
picref
->
pts
;
pkt
->
pos
=
picref
->
pos
;
pkt
->
size
=
size
;
pkt
->
size
=
size
;
avfilter_unref_buffer
(
pic
ref
);
avfilter_unref_buffer
(
ref
);
return
size
;
return
size
;
}
}
...
...
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