Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
F
ffmpeg
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
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
submodule
ffmpeg
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
Hide 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,16 +30,20 @@
...
@@ -30,16 +30,20 @@
#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
"STARTPTS"
,
///< PTS at start of movie
"SAMPLE_RATE"
,
///< sample rate (only audio)
"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