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
f6580b50
Commit
f6580b50
authored
Aug 08, 2012
by
Stefano Sabatini
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
lavfi: add asetpts audio filter
Based on an idea by Andrey Utkin <andrey.krieger.utkin@gmail.com>.
parent
11a1033c
Show whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
92 additions
and
12 deletions
+92
-12
Changelog
Changelog
+1
-0
filters.texi
doc/filters.texi
+17
-2
Makefile
libavfilter/Makefile
+1
-0
allfilters.c
libavfilter/allfilters.c
+1
-0
version.h
libavfilter/version.h
+1
-1
vf_setpts.c
libavfilter/vf_setpts.c
+71
-9
No files found.
Changelog
View file @
f6580b50
...
@@ -43,6 +43,7 @@ version next:
...
@@ -43,6 +43,7 @@ version next:
- MP2 encoding via TwoLAME
- MP2 encoding via TwoLAME
- bmp parser
- bmp parser
- smptebars source
- smptebars source
- asetpts filter
version 0.11:
version 0.11:
...
...
doc/filters.texi
View file @
f6580b50
...
@@ -3032,9 +3032,11 @@ Mark the frame as top-field-first.
...
@@ -3032,9 +3032,11 @@ Mark the frame as top-field-first.
Mark the frame as progressive.
Mark the frame as progressive.
@end table
@end table
@section setpts
@section
asetpts,
setpts
Change the PTS (presentation timestamp) of the input video frames.
Change the PTS (presentation timestamp) of the input frames.
@code{asetpts} works on audio frames, @code{setpts} on video frames.
Accept in input an expression evaluated through the eval API, which
Accept in input an expression evaluated through the eval API, which
can contain the following constants:
can contain the following constants:
...
@@ -3046,6 +3048,16 @@ the presentation timestamp in input
...
@@ -3046,6 +3048,16 @@ the presentation timestamp in input
@item N
@item N
the count of the input frame, starting from 0.
the count of the input frame, starting from 0.
@item NB_CONSUMED_SAMPLES
the number of consumed samples, not including the current frame (only
audio)
@item NB_SAMPLES
the number of samples in the current frame (only audio)
@item SAMPLE_RATE
audio sample rate
@item STARTPTS
@item STARTPTS
the PTS of the first video frame
the PTS of the first video frame
...
@@ -3084,6 +3096,9 @@ setpts=N/(25*TB)
...
@@ -3084,6 +3096,9 @@ setpts=N/(25*TB)
# fixed rate 25 fps with some jitter
# fixed rate 25 fps with some jitter
setpts='1/(25*TB) * (N + 0.05 * sin(N*2*PI/25))'
setpts='1/(25*TB) * (N + 0.05 * sin(N*2*PI/25))'
# apply an offset of 10 seconds to the input PTS
setpts=PTS+10/TB
@end example
@end example
@section settb, asettb
@section settb, asettb
...
...
libavfilter/Makefile
View file @
f6580b50
...
@@ -52,6 +52,7 @@ OBJS-$(CONFIG_AMIX_FILTER) += af_amix.o
...
@@ -52,6 +52,7 @@ OBJS-$(CONFIG_AMIX_FILTER) += af_amix.o
OBJS-$(CONFIG_ANULL_FILTER)
+=
af_anull.o
OBJS-$(CONFIG_ANULL_FILTER)
+=
af_anull.o
OBJS-$(CONFIG_ARESAMPLE_FILTER)
+=
af_aresample.o
OBJS-$(CONFIG_ARESAMPLE_FILTER)
+=
af_aresample.o
OBJS-$(CONFIG_ASETNSAMPLES_FILTER)
+=
af_asetnsamples.o
OBJS-$(CONFIG_ASETNSAMPLES_FILTER)
+=
af_asetnsamples.o
OBJS-$(CONFIG_ASETPTS_FILTER)
+=
vf_setpts.o
OBJS-$(CONFIG_ASETTB_FILTER)
+=
f_settb.o
OBJS-$(CONFIG_ASETTB_FILTER)
+=
f_settb.o
OBJS-$(CONFIG_ASHOWINFO_FILTER)
+=
af_ashowinfo.o
OBJS-$(CONFIG_ASHOWINFO_FILTER)
+=
af_ashowinfo.o
OBJS-$(CONFIG_ASPLIT_FILTER)
+=
split.o
OBJS-$(CONFIG_ASPLIT_FILTER)
+=
split.o
...
...
libavfilter/allfilters.c
View file @
f6580b50
...
@@ -42,6 +42,7 @@ void avfilter_register_all(void)
...
@@ -42,6 +42,7 @@ void avfilter_register_all(void)
REGISTER_FILTER
(
ANULL
,
anull
,
af
);
REGISTER_FILTER
(
ANULL
,
anull
,
af
);
REGISTER_FILTER
(
ARESAMPLE
,
aresample
,
af
);
REGISTER_FILTER
(
ARESAMPLE
,
aresample
,
af
);
REGISTER_FILTER
(
ASETNSAMPLES
,
asetnsamples
,
af
);
REGISTER_FILTER
(
ASETNSAMPLES
,
asetnsamples
,
af
);
REGISTER_FILTER
(
ASETPTS
,
asetpts
,
af
);
REGISTER_FILTER
(
ASETTB
,
asettb
,
af
);
REGISTER_FILTER
(
ASETTB
,
asettb
,
af
);
REGISTER_FILTER
(
ASHOWINFO
,
ashowinfo
,
af
);
REGISTER_FILTER
(
ASHOWINFO
,
ashowinfo
,
af
);
REGISTER_FILTER
(
ASPLIT
,
asplit
,
af
);
REGISTER_FILTER
(
ASPLIT
,
asplit
,
af
);
...
...
libavfilter/version.h
View file @
f6580b50
...
@@ -29,7 +29,7 @@
...
@@ -29,7 +29,7 @@
#include "libavutil/avutil.h"
#include "libavutil/avutil.h"
#define LIBAVFILTER_VERSION_MAJOR 3
#define LIBAVFILTER_VERSION_MAJOR 3
#define LIBAVFILTER_VERSION_MINOR
6
#define LIBAVFILTER_VERSION_MINOR
7
#define LIBAVFILTER_VERSION_MICRO 100
#define LIBAVFILTER_VERSION_MICRO 100
#define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \
#define LIBAVFILTER_VERSION_INT AV_VERSION_INT(LIBAVFILTER_VERSION_MAJOR, \
...
...
libavfilter/vf_setpts.c
View file @
f6580b50
...
@@ -30,15 +30,19 @@
...
@@ -30,15 +30,19 @@
#include "libavutil/mathematics.h"
#include "libavutil/mathematics.h"
#include "avfilter.h"
#include "avfilter.h"
#include "internal.h"
#include "internal.h"
#include "audio.h"
#include "video.h"
#include "video.h"
static
const
char
*
const
var_names
[]
=
{
static
const
char
*
const
var_names
[]
=
{
"INTERLACED"
,
///< tell if the current frame is interlaced
"INTERLACED"
,
///< tell if the current frame is interlaced
"N"
,
///< frame number (starting at zero)
"N"
,
///< frame number (starting at zero)
"NB_CONSUMED_SAMPLES"
,
///< number of samples consumed by the filter (only audio)
"NB_SAMPLES"
,
///< number of samples in the current frame (only audio)
"POS"
,
///< original position in the file of the frame
"POS"
,
///< original position in the file of the frame
"PREV_INPTS"
,
///< previous input PTS
"PREV_INPTS"
,
///< previous input PTS
"PREV_OUTPTS"
,
///< previous output PTS
"PREV_OUTPTS"
,
///< previous output PTS
"PTS"
,
///< original pts in the file of the frame
"PTS"
,
///< original pts in the file of the frame
"SAMPLE_RATE"
,
///< sample rate (only audio)
"STARTPTS"
,
///< PTS at start of movie
"STARTPTS"
,
///< PTS at start of movie
"TB"
,
///< timebase
"TB"
,
///< timebase
NULL
NULL
...
@@ -47,10 +51,13 @@ static const char *const var_names[] = {
...
@@ -47,10 +51,13 @@ static const char *const var_names[] = {
enum
var_name
{
enum
var_name
{
VAR_INTERLACED
,
VAR_INTERLACED
,
VAR_N
,
VAR_N
,
VAR_NB_CONSUMED_SAMPLES
,
VAR_NB_SAMPLES
,
VAR_POS
,
VAR_POS
,
VAR_PREV_INPTS
,
VAR_PREV_INPTS
,
VAR_PREV_OUTPTS
,
VAR_PREV_OUTPTS
,
VAR_PTS
,
VAR_PTS
,
VAR_SAMPLE_RATE
,
VAR_STARTPTS
,
VAR_STARTPTS
,
VAR_TB
,
VAR_TB
,
VAR_VARS_NB
VAR_VARS_NB
...
@@ -59,6 +66,7 @@ enum var_name {
...
@@ -59,6 +66,7 @@ enum var_name {
typedef
struct
{
typedef
struct
{
AVExpr
*
expr
;
AVExpr
*
expr
;
double
var_values
[
VAR_VARS_NB
];
double
var_values
[
VAR_VARS_NB
];
enum
AVMediaType
type
;
}
SetPTSContext
;
}
SetPTSContext
;
static
av_cold
int
init
(
AVFilterContext
*
ctx
,
const
char
*
args
)
static
av_cold
int
init
(
AVFilterContext
*
ctx
,
const
char
*
args
)
...
@@ -81,18 +89,24 @@ static av_cold int init(AVFilterContext *ctx, const char *args)
...
@@ -81,18 +89,24 @@ static av_cold int init(AVFilterContext *ctx, const char *args)
static
int
config_input
(
AVFilterLink
*
inlink
)
static
int
config_input
(
AVFilterLink
*
inlink
)
{
{
SetPTSContext
*
setpts
=
inlink
->
dst
->
priv
;
AVFilterContext
*
ctx
=
inlink
->
dst
;
SetPTSContext
*
setpts
=
ctx
->
priv
;
setpts
->
type
=
inlink
->
type
;
setpts
->
var_values
[
VAR_TB
]
=
av_q2d
(
inlink
->
time_base
);
setpts
->
var_values
[
VAR_TB
]
=
av_q2d
(
inlink
->
time_base
);
av_log
(
inlink
->
src
,
AV_LOG_VERBOSE
,
"TB:%f
\n
"
,
setpts
->
var_values
[
VAR_TB
]);
if
(
setpts
->
type
==
AVMEDIA_TYPE_AUDIO
)
setpts
->
var_values
[
VAR_SAMPLE_RATE
]
=
inlink
->
sample_rate
;
av_log
(
inlink
->
src
,
AV_LOG_VERBOSE
,
"TB:%f SAMPLE_RATE:%f
\n
"
,
setpts
->
var_values
[
VAR_TB
],
setpts
->
var_values
[
VAR_SAMPLE_RATE
]);
return
0
;
return
0
;
}
}
#define D2TS(d) (isnan(d) ? AV_NOPTS_VALUE : (int64_t)(d))
#define D2TS(d) (isnan(d) ? AV_NOPTS_VALUE : (int64_t)(d))
#define TS2D(ts) ((ts) == AV_NOPTS_VALUE ? NAN : (double)(ts))
#define TS2D(ts) ((ts) == AV_NOPTS_VALUE ? NAN : (double)(ts))
static
int
start
_frame
(
AVFilterLink
*
inlink
,
AVFilterBufferRef
*
inpicref
)
static
int
filter
_frame
(
AVFilterLink
*
inlink
,
AVFilterBufferRef
*
inpicref
)
{
{
SetPTSContext
*
setpts
=
inlink
->
dst
->
priv
;
SetPTSContext
*
setpts
=
inlink
->
dst
->
priv
;
double
d
;
double
d
;
...
@@ -103,28 +117,45 @@ static int start_frame(AVFilterLink *inlink, AVFilterBufferRef *inpicref)
...
@@ -103,28 +117,45 @@ static int start_frame(AVFilterLink *inlink, AVFilterBufferRef *inpicref)
if
(
isnan
(
setpts
->
var_values
[
VAR_STARTPTS
]))
if
(
isnan
(
setpts
->
var_values
[
VAR_STARTPTS
]))
setpts
->
var_values
[
VAR_STARTPTS
]
=
TS2D
(
inpicref
->
pts
);
setpts
->
var_values
[
VAR_STARTPTS
]
=
TS2D
(
inpicref
->
pts
);
setpts
->
var_values
[
VAR_INTERLACED
]
=
inpicref
->
video
->
interlaced
;
setpts
->
var_values
[
VAR_PTS
]
=
TS2D
(
inpicref
->
pts
);
setpts
->
var_values
[
VAR_PTS
]
=
TS2D
(
inpicref
->
pts
);
setpts
->
var_values
[
VAR_POS
]
=
inpicref
->
pos
==
-
1
?
NAN
:
inpicref
->
pos
;
setpts
->
var_values
[
VAR_POS
]
=
inpicref
->
pos
==
-
1
?
NAN
:
inpicref
->
pos
;
switch
(
inlink
->
type
)
{
case
AVMEDIA_TYPE_VIDEO
:
setpts
->
var_values
[
VAR_INTERLACED
]
=
inpicref
->
video
->
interlaced
;
break
;
case
AVMEDIA_TYPE_AUDIO
:
setpts
->
var_values
[
VAR_NB_SAMPLES
]
=
inpicref
->
audio
->
nb_samples
;
break
;
}
d
=
av_expr_eval
(
setpts
->
expr
,
setpts
->
var_values
,
NULL
);
d
=
av_expr_eval
(
setpts
->
expr
,
setpts
->
var_values
,
NULL
);
outpicref
->
pts
=
D2TS
(
d
);
outpicref
->
pts
=
D2TS
(
d
);
#ifdef DEBUG
#ifdef DEBUG
av_log
(
inlink
->
dst
,
AV_LOG_DEBUG
,
av_log
(
inlink
->
dst
,
AV_LOG_DEBUG
,
"n:%"
PRId64
" interlaced:%d pos:%"
PRId64
" pts:%"
PRId64
" t:%f -> pts:%"
PRId64
" t:%f
\n
"
,
"n:%"
PRId64
" interlaced:%d nb_samples:%d nb_consumed_samples:%d "
"pos:%"
PRId64
" pts:%"
PRId64
" t:%f -> pts:%"
PRId64
" t:%f
\n
"
,
(
int64_t
)
setpts
->
var_values
[
VAR_N
],
(
int64_t
)
setpts
->
var_values
[
VAR_N
],
(
int
)
setpts
->
var_values
[
VAR_INTERLACED
],
(
int
)
setpts
->
var_values
[
VAR_INTERLACED
],
(
int
)
setpts
->
var_values
[
VAR_NB_SAMPLES
],
(
int
)
setpts
->
var_values
[
VAR_NB_CONSUMED_SAMPLES
],
inpicref
->
pos
,
inpicref
->
pos
,
inpicref
->
pts
,
inpicref
->
pts
*
av_q2d
(
inlink
->
time_base
),
inpicref
->
pts
,
inpicref
->
pts
*
av_q2d
(
inlink
->
time_base
),
outpicref
->
pts
,
outpicref
->
pts
*
av_q2d
(
inlink
->
time_base
));
outpicref
->
pts
,
outpicref
->
pts
*
av_q2d
(
inlink
->
time_base
));
#endif
#endif
setpts
->
var_values
[
VAR_N
]
+=
1
.
0
;
setpts
->
var_values
[
VAR_N
]
+=
1
.
0
;
setpts
->
var_values
[
VAR_PREV_INPTS
]
=
TS2D
(
inpicref
->
pts
);
setpts
->
var_values
[
VAR_PREV_INPTS
]
=
TS2D
(
inpicref
->
pts
);
setpts
->
var_values
[
VAR_PREV_OUTPTS
]
=
TS2D
(
outpicref
->
pts
);
setpts
->
var_values
[
VAR_PREV_OUTPTS
]
=
TS2D
(
outpicref
->
pts
);
return
ff_start_frame
(
inlink
->
dst
->
outputs
[
0
],
outpicref
);
if
(
setpts
->
type
==
AVMEDIA_TYPE_AUDIO
)
{
setpts
->
var_values
[
VAR_NB_CONSUMED_SAMPLES
]
+=
inpicref
->
audio
->
nb_samples
;
return
ff_filter_samples
(
inlink
->
dst
->
outputs
[
0
],
outpicref
);
}
else
return
ff_start_frame
(
inlink
->
dst
->
outputs
[
0
],
outpicref
);
}
}
static
av_cold
void
uninit
(
AVFilterContext
*
ctx
)
static
av_cold
void
uninit
(
AVFilterContext
*
ctx
)
...
@@ -134,6 +165,36 @@ static av_cold void uninit(AVFilterContext *ctx)
...
@@ -134,6 +165,36 @@ static av_cold void uninit(AVFilterContext *ctx)
setpts
->
expr
=
NULL
;
setpts
->
expr
=
NULL
;
}
}
#if CONFIG_ASETPTS_FILTER
AVFilter
avfilter_af_asetpts
=
{
.
name
=
"asetpts"
,
.
description
=
NULL_IF_CONFIG_SMALL
(
"Set PTS for the output audio frame."
),
.
init
=
init
,
.
uninit
=
uninit
,
.
priv_size
=
sizeof
(
SetPTSContext
),
.
inputs
=
(
const
AVFilterPad
[])
{
{
.
name
=
"default"
,
.
type
=
AVMEDIA_TYPE_AUDIO
,
.
get_audio_buffer
=
ff_null_get_audio_buffer
,
.
config_props
=
config_input
,
.
filter_samples
=
filter_frame
,
},
{
.
name
=
NULL
}
},
.
outputs
=
(
const
AVFilterPad
[])
{
{
.
name
=
"default"
,
.
type
=
AVMEDIA_TYPE_AUDIO
,
},
{
.
name
=
NULL
}
},
};
#endif
/* CONFIG_ASETPTS_FILTER */
#if CONFIG_SETPTS_FILTER
AVFilter
avfilter_vf_setpts
=
{
AVFilter
avfilter_vf_setpts
=
{
.
name
=
"setpts"
,
.
name
=
"setpts"
,
.
description
=
NULL_IF_CONFIG_SMALL
(
"Set PTS for the output video frame."
),
.
description
=
NULL_IF_CONFIG_SMALL
(
"Set PTS for the output video frame."
),
...
@@ -146,9 +207,10 @@ AVFilter avfilter_vf_setpts = {
...
@@ -146,9 +207,10 @@ AVFilter avfilter_vf_setpts = {
.
type
=
AVMEDIA_TYPE_VIDEO
,
.
type
=
AVMEDIA_TYPE_VIDEO
,
.
get_video_buffer
=
ff_null_get_video_buffer
,
.
get_video_buffer
=
ff_null_get_video_buffer
,
.
config_props
=
config_input
,
.
config_props
=
config_input
,
.
start_frame
=
start
_frame
,
},
.
start_frame
=
filter
_frame
,
},
{
.
name
=
NULL
}},
{
.
name
=
NULL
}},
.
outputs
=
(
const
AVFilterPad
[])
{{
.
name
=
"default"
,
.
outputs
=
(
const
AVFilterPad
[])
{{
.
name
=
"default"
,
.
type
=
AVMEDIA_TYPE_VIDEO
,
},
.
type
=
AVMEDIA_TYPE_VIDEO
,
},
{
.
name
=
NULL
}},
{
.
name
=
NULL
}},
};
};
#endif
/* CONFIG_SETPTS_FILTER */
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