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
21b092de
Commit
21b092de
authored
Mar 16, 2013
by
Nicolas George
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
lavfi: add sine audio source.
parent
8d928a9d
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
284 additions
and
2 deletions
+284
-2
Changelog
Changelog
+1
-0
filters.texi
doc/filters.texi
+51
-0
Makefile
libavfilter/Makefile
+1
-0
allfilters.c
libavfilter/allfilters.c
+1
-0
asrc_sine.c
libavfilter/asrc_sine.c
+228
-0
version.h
libavfilter/version.h
+2
-2
No files found.
Changelog
View file @
21b092de
...
...
@@ -10,6 +10,7 @@ version <next>:
- perms and aperms filters
- audio filtering support in ffplay
- 10% faster aac encoding on x86 and MIPS
- sine audio filter source
version 1.2:
...
...
doc/filters.texi
View file @
21b092de
...
...
@@ -1653,6 +1653,57 @@ ffplay -f lavfi flite=text='No more be grieved for which that thou hast done.'
For more information about libflite, check:
@url{http://www.speech.cs.cmu.edu/flite/}
@section sine
Generate an audio signal made of a sine wave with amplitude 1/8.
The audio signal is bit-exact.
It accepts a list of options in the form of @var{key}=@var{value} pairs
separated by ":". If the option name is omitted, the first option is the
frequency and the second option is the beep factor.
The supported options are:
@table @option
@item frequency, f
Set the carrier frequency. Default is 440 Hz.
@item beep_factor, b
Enable a periodic beep every second with frequency @var{beep_factor} times
the carrier frequency. Default is 0, meaning the beep is disabled.
@item sample_rate, s
Specify the sample rate, default is 44100.
@item duration, d
Specify the duration of the generated audio stream.
@item samples_per_frame
Set the number of samples per output frame, default is 1024.
@end table
@subsection Examples
@itemize
@item
Generate a simple 440 Hz sine wave:
@example
sine
@end example
@item
Generate a 220 Hz sine wave with a 880 Hz beep each second, for 5 seconds:
@example
sine=220:4:d=5
sine=f=220:b=4:d=5
sine=frequency=220:beep_factor=4:duration=5
@end example
@end itemize
@c man end AUDIO SOURCES
@chapter Audio Sinks
...
...
libavfilter/Makefile
View file @
21b092de
...
...
@@ -90,6 +90,7 @@ OBJS-$(CONFIG_VOLUMEDETECT_FILTER) += af_volumedetect.o
OBJS-$(CONFIG_AEVALSRC_FILTER)
+=
asrc_aevalsrc.o
OBJS-$(CONFIG_ANULLSRC_FILTER)
+=
asrc_anullsrc.o
OBJS-$(CONFIG_FLITE_FILTER)
+=
asrc_flite.o
OBJS-$(CONFIG_SINE_FILTER)
+=
asrc_sine.o
OBJS-$(CONFIG_ANULLSINK_FILTER)
+=
asink_anullsink.o
...
...
libavfilter/allfilters.c
View file @
21b092de
...
...
@@ -86,6 +86,7 @@ void avfilter_register_all(void)
REGISTER_FILTER
(
AEVALSRC
,
aevalsrc
,
asrc
);
REGISTER_FILTER
(
ANULLSRC
,
anullsrc
,
asrc
);
REGISTER_FILTER
(
FLITE
,
flite
,
asrc
);
REGISTER_FILTER
(
SINE
,
sine
,
asrc
);
REGISTER_FILTER
(
ANULLSINK
,
anullsink
,
asink
);
...
...
libavfilter/asrc_sine.c
0 → 100644
View file @
21b092de
/*
* Copyright (c) 2013 Nicolas George
*
* This file is part of FFmpeg.
*
* FFmpeg 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.
*
* FFmpeg 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 FFmpeg; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "libavutil/avassert.h"
#include "libavutil/channel_layout.h"
#include "libavutil/opt.h"
#include "audio.h"
#include "avfilter.h"
#include "internal.h"
typedef
struct
{
const
AVClass
*
class
;
double
frequency
;
double
beep_factor
;
int
samples_per_frame
;
int
sample_rate
;
int64_t
duration
;
int16_t
*
sin
;
int64_t
pts
;
uint32_t
phi
;
///< current phase of the sine (2pi = 1<<32)
uint32_t
dphi
;
///< phase increment between two samples
unsigned
beep_period
;
unsigned
beep_index
;
unsigned
beep_length
;
uint32_t
phi_beep
;
///< current phase of the beep
uint32_t
dphi_beep
;
///< phase increment of the beep
}
SineContext
;
#define CONTEXT SineContext
#define FLAGS AV_OPT_FLAG_AUDIO_PARAM|AV_OPT_FLAG_FILTERING_PARAM
#define OPT_GENERIC(name, field, def, min, max, descr, type, deffield, ...) \
{ name, descr, offsetof(CONTEXT, field), AV_OPT_TYPE_ ## type, \
{ .deffield = def }, min, max, FLAGS, __VA_ARGS__ }
#define OPT_INT(name, field, def, min, max, descr, ...) \
OPT_GENERIC(name, field, def, min, max, descr, INT, i64, __VA_ARGS__)
#define OPT_DBL(name, field, def, min, max, descr, ...) \
OPT_GENERIC(name, field, def, min, max, descr, DOUBLE, dbl, __VA_ARGS__)
#define OPT_DUR(name, field, def, min, max, descr, ...) \
OPT_GENERIC(name, field, def, min, max, descr, DURATION, str, __VA_ARGS__)
static
const
AVOption
sine_options
[]
=
{
OPT_DBL
(
"frequency"
,
frequency
,
440
,
0
,
INFINITY
,
"set the sine frequency"
),
OPT_DBL
(
"f"
,
frequency
,
440
,
0
,
INFINITY
,
"set the sine frequency"
),
OPT_DBL
(
"beep_factor"
,
beep_factor
,
0
,
0
,
INFINITY
,
"set the beep fequency factor"
),
OPT_DBL
(
"b"
,
beep_factor
,
0
,
0
,
INFINITY
,
"set the beep fequency factor"
),
OPT_INT
(
"sample_rate"
,
sample_rate
,
44100
,
1
,
INT_MAX
,
"set the sample rate"
),
OPT_INT
(
"r"
,
sample_rate
,
44100
,
1
,
INT_MAX
,
"set the sample rate"
),
OPT_DUR
(
"duration"
,
duration
,
0
,
0
,
INT64_MAX
,
"set the audio duration"
),
OPT_DUR
(
"d"
,
duration
,
0
,
0
,
INT64_MAX
,
"set the audio duration"
),
OPT_INT
(
"samples_per_frame"
,
samples_per_frame
,
1024
,
0
,
INT_MAX
,
"set the number of samples per frame"
),
{
NULL
},
};
AVFILTER_DEFINE_CLASS
(
sine
);
#define LOG_PERIOD 15
#define AMPLITUDE 4095
#define AMPLITUDE_SHIFT 3
static
void
make_sin_table
(
int16_t
*
sin
)
{
unsigned
half_pi
=
1
<<
(
LOG_PERIOD
-
2
);
unsigned
ampls
=
AMPLITUDE
<<
AMPLITUDE_SHIFT
;
uint64_t
unit2
=
(
uint64_t
)(
ampls
*
ampls
)
<<
32
;
unsigned
step
,
i
,
c
,
s
,
k
,
new_k
,
n2
;
/* Principle: if u = exp(i*a1) and v = exp(i*a2), then
exp(i*(a1+a2)/2) = (u+v) / length(u+v) */
sin
[
0
]
=
0
;
sin
[
half_pi
]
=
ampls
;
for
(
step
=
half_pi
;
step
>
1
;
step
/=
2
)
{
/* k = (1 << 16) * amplitude / length(u+v)
In exact values, k is constant at a given step */
k
=
0x10000
;
for
(
i
=
0
;
i
<
half_pi
/
2
;
i
+=
step
)
{
s
=
sin
[
i
]
+
sin
[
i
+
step
];
c
=
sin
[
half_pi
-
i
]
+
sin
[
half_pi
-
i
-
step
];
n2
=
s
*
s
+
c
*
c
;
/* Newton's method to solve n² * k² = unit² */
while
(
1
)
{
new_k
=
(
k
+
unit2
/
((
uint64_t
)
k
*
n2
)
+
1
)
>>
1
;
if
(
k
==
new_k
)
break
;
k
=
new_k
;
}
sin
[
i
+
step
/
2
]
=
(
k
*
s
+
0x7FFF
)
>>
16
;
sin
[
half_pi
-
i
-
step
/
2
]
=
(
k
*
c
+
0x8000
)
>>
16
;
}
}
/* Unshift amplitude */
for
(
i
=
0
;
i
<=
half_pi
;
i
++
)
sin
[
i
]
=
(
sin
[
i
]
+
(
1
<<
(
AMPLITUDE_SHIFT
-
1
)))
>>
AMPLITUDE_SHIFT
;
/* Use symmetries to fill the other three quarters */
for
(
i
=
0
;
i
<
half_pi
;
i
++
)
sin
[
half_pi
*
2
-
i
]
=
sin
[
i
];
for
(
i
=
0
;
i
<
2
*
half_pi
;
i
++
)
sin
[
i
+
2
*
half_pi
]
=
-
sin
[
i
];
}
static
av_cold
int
init
(
AVFilterContext
*
ctx
,
const
char
*
args
)
{
SineContext
*
sine
=
ctx
->
priv
;
static
const
char
*
shorthand
[]
=
{
"frequency"
,
"beep_factor"
,
NULL
};
int
ret
;
sine
->
class
=
&
sine_class
;
av_opt_set_defaults
(
sine
);
if
((
ret
=
av_opt_set_from_string
(
sine
,
args
,
shorthand
,
"="
,
":"
))
<
0
)
return
ret
;
if
(
!
(
sine
->
sin
=
av_malloc
(
sizeof
(
*
sine
->
sin
)
<<
LOG_PERIOD
)))
return
AVERROR
(
ENOMEM
);
sine
->
dphi
=
ldexp
(
sine
->
frequency
,
32
)
/
sine
->
sample_rate
+
0
.
5
;
make_sin_table
(
sine
->
sin
);
if
(
sine
->
beep_factor
)
{
sine
->
beep_period
=
sine
->
sample_rate
;
sine
->
beep_length
=
sine
->
beep_period
/
25
;
sine
->
dphi_beep
=
ldexp
(
sine
->
beep_factor
*
sine
->
frequency
,
32
)
/
sine
->
sample_rate
+
0
.
5
;
}
return
0
;
}
static
av_cold
void
uninit
(
AVFilterContext
*
ctx
)
{
SineContext
*
sine
=
ctx
->
priv
;
av_freep
(
&
sine
->
sin
);
}
static
av_cold
int
query_formats
(
AVFilterContext
*
ctx
)
{
SineContext
*
sine
=
ctx
->
priv
;
static
const
int64_t
chlayouts
[]
=
{
AV_CH_LAYOUT_MONO
,
-
1
};
int
sample_rates
[]
=
{
sine
->
sample_rate
,
-
1
};
static
const
enum
AVSampleFormat
sample_fmts
[]
=
{
AV_SAMPLE_FMT_S16
,
AV_SAMPLE_FMT_NONE
};
ff_set_common_formats
(
ctx
,
ff_make_format_list
(
sample_fmts
));
ff_set_common_channel_layouts
(
ctx
,
avfilter_make_format64_list
(
chlayouts
));
ff_set_common_samplerates
(
ctx
,
ff_make_format_list
(
sample_rates
));
return
0
;
}
static
av_cold
int
config_props
(
AVFilterLink
*
outlink
)
{
SineContext
*
sine
=
outlink
->
src
->
priv
;
sine
->
duration
=
av_rescale
(
sine
->
duration
,
sine
->
sample_rate
,
AV_TIME_BASE
);
return
0
;
}
static
int
request_frame
(
AVFilterLink
*
outlink
)
{
SineContext
*
sine
=
outlink
->
src
->
priv
;
AVFrame
*
frame
;
int
i
,
nb_samples
=
sine
->
samples_per_frame
;
int16_t
*
samples
;
if
(
sine
->
duration
)
{
nb_samples
=
FFMIN
(
nb_samples
,
sine
->
duration
-
sine
->
pts
);
av_assert1
(
nb_samples
>=
0
);
if
(
!
nb_samples
)
return
AVERROR_EOF
;
}
if
(
!
(
frame
=
ff_get_audio_buffer
(
outlink
,
nb_samples
)))
return
AVERROR
(
ENOMEM
);
samples
=
(
int16_t
*
)
frame
->
data
[
0
];
for
(
i
=
0
;
i
<
nb_samples
;
i
++
)
{
samples
[
i
]
=
sine
->
sin
[
sine
->
phi
>>
(
32
-
LOG_PERIOD
)];
sine
->
phi
+=
sine
->
dphi
;
if
(
sine
->
beep_index
<
sine
->
beep_length
)
{
samples
[
i
]
+=
sine
->
sin
[
sine
->
phi_beep
>>
(
32
-
LOG_PERIOD
)]
<<
1
;
sine
->
phi_beep
+=
sine
->
dphi_beep
;
}
if
(
++
sine
->
beep_index
==
sine
->
beep_period
)
sine
->
beep_index
=
0
;
}
frame
->
pts
=
sine
->
pts
;
sine
->
pts
+=
nb_samples
;
return
ff_filter_frame
(
outlink
,
frame
);
}
static
const
AVFilterPad
sine_outputs
[]
=
{
{
.
name
=
"default"
,
.
type
=
AVMEDIA_TYPE_AUDIO
,
.
request_frame
=
request_frame
,
.
config_props
=
config_props
,
},
{
NULL
}
};
AVFilter
avfilter_asrc_sine
=
{
.
name
=
"sine"
,
.
description
=
NULL_IF_CONFIG_SMALL
(
"Generate sine wave audio signal."
),
.
query_formats
=
query_formats
,
.
init
=
init
,
.
uninit
=
uninit
,
.
priv_size
=
sizeof
(
SineContext
),
.
inputs
=
NULL
,
.
outputs
=
sine_outputs
,
.
priv_class
=
&
sine_class
,
};
libavfilter/version.h
View file @
21b092de
...
...
@@ -29,8 +29,8 @@
#include "libavutil/avutil.h"
#define LIBAVFILTER_VERSION_MAJOR 3
#define LIBAVFILTER_VERSION_MINOR 4
7
#define LIBAVFILTER_VERSION_MICRO 10
4
#define LIBAVFILTER_VERSION_MINOR 4
8
#define LIBAVFILTER_VERSION_MICRO 10
0
#define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \
LIBAVFILTER_VERSION_MINOR, \
...
...
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