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
64ce15b9
Commit
64ce15b9
authored
Apr 11, 2013
by
Clément Bœsch
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
lavfi/aevalsrc: switch to an AVOptions-based system.
parent
94d13df3
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
32 additions
and
32 deletions
+32
-32
filters.texi
doc/filters.texi
+8
-13
asrc_aevalsrc.c
libavfilter/asrc_aevalsrc.c
+6
-16
avfilter.c
libavfilter/avfilter.c
+17
-2
Makefile
tests/Makefile
+1
-1
No files found.
doc/filters.texi
View file @
64ce15b9
...
...
@@ -1496,18 +1496,13 @@ This source accepts in input one or more expressions (one for each
channel), which are evaluated and used to generate a corresponding
audio signal.
It accepts the syntax: @var{exprs}[::@var{options}].
@var{exprs} is a list of expressions separated by ":", one for each
separate channel. In case the @var{channel_layout} is not
specified, the selected channel layout depends on the number of
provided expressions.
@var{options} is an optional sequence of @var{key}=@var{value} pairs,
separated by ":".
The description of the accepted options follows.
This source accepts the following options:
@table @option
@item exprs
Set the '|'-separated expressions list for each separate channel. In case the
@option{channel_layout} option is not specified, the selected channel layout
depends on the number of provided expressions.
@item channel_layout, c
Set the channel layout. The number of channels in the specified layout
...
...
@@ -1558,14 +1553,14 @@ aevalsrc=0
Generate a sin signal with frequency of 440 Hz, set sample rate to
8000 Hz:
@example
aevalsrc="sin(440*2*PI*t):
:
s=8000"
aevalsrc="sin(440*2*PI*t):s=8000"
@end example
@item
Generate a two channels signal, specify the channel layout (Front
Center + Back Center) explicitly:
@example
aevalsrc="sin(420*2*PI*t)
:cos(430*2*PI*t):
:c=FC|BC"
aevalsrc="sin(420*2*PI*t)
|cos(430*2*PI*t)
:c=FC|BC"
@end example
@item
...
...
@@ -1583,7 +1578,7 @@ aevalsrc="sin(10*2*PI*t)*sin(880*2*PI*t)"
@item
Generate 2.5 Hz binaural beats on a 360 Hz carrier:
@example
aevalsrc="0.1*sin(2*PI*(360-2.5/2)*t)
:
0.1*sin(2*PI*(360+2.5/2)*t)"
aevalsrc="0.1*sin(2*PI*(360-2.5/2)*t)
|
0.1*sin(2*PI*(360+2.5/2)*t)"
@end example
@end itemize
...
...
libavfilter/asrc_aevalsrc.c
View file @
64ce15b9
...
...
@@ -56,7 +56,7 @@ typedef struct {
int
nb_channels
;
int64_t
pts
;
AVExpr
*
expr
[
8
];
char
*
expr
_str
[
8
]
;
char
*
expr
s
;
int
nb_samples
;
///< number of samples per requested frame
char
*
duration_str
;
///< total duration of the generated audio
double
duration
;
...
...
@@ -68,6 +68,7 @@ typedef struct {
#define FLAGS AV_OPT_FLAG_AUDIO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
static
const
AVOption
aevalsrc_options
[]
=
{
{
"exprs"
,
"set the '|'-separated list of channels expressions"
,
OFFSET
(
exprs
),
AV_OPT_TYPE_STRING
,
{.
str
=
NULL
},
.
flags
=
FLAGS
},
{
"nb_samples"
,
"set the number of samples per requested frame"
,
OFFSET
(
nb_samples
),
AV_OPT_TYPE_INT
,
{.
i64
=
1024
},
0
,
INT_MAX
,
FLAGS
},
{
"n"
,
"set the number of samples per requested frame"
,
OFFSET
(
nb_samples
),
AV_OPT_TYPE_INT
,
{.
i64
=
1024
},
0
,
INT_MAX
,
FLAGS
},
{
"sample_rate"
,
"set the sample rate"
,
OFFSET
(
sample_rate_str
),
AV_OPT_TYPE_STRING
,
{.
str
=
"44100"
},
CHAR_MIN
,
CHAR_MAX
,
FLAGS
},
...
...
@@ -84,15 +85,12 @@ AVFILTER_DEFINE_CLASS(aevalsrc);
static
int
init
(
AVFilterContext
*
ctx
,
const
char
*
args
)
{
EvalContext
*
eval
=
ctx
->
priv
;
char
*
args1
=
av_strdup
(
arg
s
);
char
*
expr
,
*
buf
,
*
bufptr
;
char
*
args1
=
av_strdup
(
eval
->
expr
s
);
char
*
expr
,
*
buf
;
int
ret
,
i
;
eval
->
class
=
&
aevalsrc_class
;
av_opt_set_defaults
(
eval
);
if
(
!
args1
)
{
av_log
(
ctx
,
AV_LOG_ERROR
,
"
Argumen
t is empty
\n
"
);
av_log
(
ctx
,
AV_LOG_ERROR
,
"
Channels expressions lis
t is empty
\n
"
);
ret
=
args
?
AVERROR
(
ENOMEM
)
:
AVERROR
(
EINVAL
);
goto
end
;
}
...
...
@@ -100,23 +98,15 @@ static int init(AVFilterContext *ctx, const char *args)
/* parse expressions */
buf
=
args1
;
i
=
0
;
while
(
expr
=
av_strtok
(
buf
,
":"
,
&
bufptr
))
{
while
(
i
<
FF_ARRAY_ELEMS
(
eval
->
expr
)
&&
(
expr
=
av_strtok
(
buf
,
"|"
,
&
buf
)
))
{
ret
=
av_expr_parse
(
&
eval
->
expr
[
i
],
expr
,
var_names
,
NULL
,
NULL
,
NULL
,
NULL
,
0
,
ctx
);
if
(
ret
<
0
)
goto
end
;
i
++
;
if
(
bufptr
&&
*
bufptr
==
':'
)
{
/* found last expression */
bufptr
++
;
break
;
}
buf
=
NULL
;
}
eval
->
nb_channels
=
i
;
if
(
bufptr
&&
(
ret
=
av_set_options_string
(
eval
,
bufptr
,
"="
,
":"
))
<
0
)
goto
end
;
if
(
eval
->
chlayout_str
)
{
int
n
;
ret
=
ff_parse_channel_layout
(
&
eval
->
chlayout
,
eval
->
chlayout_str
,
ctx
);
...
...
libavfilter/avfilter.c
View file @
64ce15b9
...
...
@@ -674,7 +674,6 @@ static int process_options(AVFilterContext *ctx, AVDictionary **options,
static
const
char
*
const
filters_left_to_update
[]
=
{
"abuffer"
,
"aconvert"
,
"aevalsrc"
,
"amerge"
,
"aresample"
,
"atempo"
,
...
...
@@ -757,7 +756,8 @@ int avfilter_init_filter(AVFilterContext *filter, const char *args, void *opaque
!
strcmp
(
filter
->
filter
->
name
,
"frei0r"
)
||
!
strcmp
(
filter
->
filter
->
name
,
"frei0r_src"
)
||
!
strcmp
(
filter
->
filter
->
name
,
"ocv"
)
||
!
strcmp
(
filter
->
filter
->
name
,
"pp"
))
{
!
strcmp
(
filter
->
filter
->
name
,
"pp"
)
||
!
strcmp
(
filter
->
filter
->
name
,
"aevalsrc"
))
{
/* a hack for compatibility with the old syntax
* replace colons with |s */
char
*
copy
=
av_strdup
(
args
);
...
...
@@ -789,9 +789,24 @@ int avfilter_init_filter(AVFilterContext *filter, const char *args, void *opaque
"'|' to separate the list items.
\n
"
);
}
if
(
!
strcmp
(
filter
->
filter
->
name
,
"aevalsrc"
))
{
while
((
p
=
strchr
(
p
,
':'
))
&&
p
[
1
]
!=
':'
)
{
const
char
*
epos
=
strchr
(
p
+
1
,
'='
);
const
char
*
spos
=
strchr
(
p
+
1
,
':'
);
const
int
next_token_is_opt
=
epos
&&
(
!
spos
||
epos
<
spos
);
if
(
next_token_is_opt
)
{
p
++
;
break
;
}
*
p
++
=
'|'
;
}
if
(
p
&&
*
p
==
':'
)
memmove
(
p
,
p
+
1
,
strlen
(
p
));
}
else
while
((
p
=
strchr
(
p
,
':'
)))
*
p
++
=
'|'
;
av_log
(
filter
,
AV_LOG_DEBUG
,
"compat: called with args=[%s]
\n
"
,
copy
);
ret
=
process_options
(
filter
,
&
options
,
copy
);
av_freep
(
&
copy
);
...
...
tests/Makefile
View file @
64ce15b9
...
...
@@ -32,7 +32,7 @@ tests/data/vsynth2.yuv: tests/rotozoom$(HOSTEXESUF) | tests/data
tests/data/ffprobe-test.nut
:
ffmpeg$(EXESUF) | tests/data
$(M)$(TARGET_EXEC)
./
$<
\
-f
lavfi
-i
"aevalsrc=sin(400*PI*2*t):
:
d=0.125[out0]; testsrc=d=0.125[out1]; testsrc=s=100x100:d=0.125[out2]"
\
-f
lavfi
-i
"aevalsrc=sin(400*PI*2*t):d=0.125[out0]; testsrc=d=0.125[out1]; testsrc=s=100x100:d=0.125[out2]"
\
-f
ffmetadata
-i
$(SRC_PATH)
/tests/test.ffmeta
\
-flags
+bitexact
-map
0:0
-map
0:1
-map
0:2
-map_metadata
1
\
-map_metadata
:s:0 1:s:0
-map_metadata
:s:1 1:s:1
\
...
...
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