FFmpeg
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
Examples
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
libavfilter
vf_framestep.c
Go to the documentation of this file.
1
/*
2
* Copyright (c) 2012 Stefano Sabatini
3
*
4
* This file is part of FFmpeg.
5
*
6
* FFmpeg is free software; you can redistribute it and/or
7
* modify it under the terms of the GNU Lesser General Public
8
* License as published by the Free Software Foundation; either
9
* version 2.1 of the License, or (at your option) any later version.
10
*
11
* FFmpeg is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14
* Lesser General Public License for more details.
15
*
16
* You should have received a copy of the GNU Lesser General Public
17
* License along with FFmpeg; if not, write to the Free Software
18
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19
*/
20
21
/**
22
* @file framestep filter, inspired on libmpcodecs/vf_framestep.c by
23
* Daniele Fornighieri <guru AT digitalfantasy it>.
24
*/
25
26
#include "
libavutil/opt.h
"
27
#include "
avfilter.h
"
28
#include "
internal.h
"
29
#include "
video.h
"
30
31
typedef
struct
NullContext {
32
const
AVClass
*
class
;
33
int
frame_step
;
34
}
FrameStepContext
;
35
36
#define OFFSET(x) offsetof(FrameStepContext, x)
37
#define FLAGS AV_OPT_FLAG_FILTERING_PARAM|AV_OPT_FLAG_VIDEO_PARAM
38
39
static
const
AVOption
framestep_options
[] = {
40
{
"step"
,
"set frame step"
,
OFFSET
(frame_step),
AV_OPT_TYPE_INT
, {.i64=1}, 1, INT_MAX,
FLAGS
},
41
{ NULL },
42
};
43
44
AVFILTER_DEFINE_CLASS
(framestep);
45
46
static
int
config_output_props
(
AVFilterLink
*outlink)
47
{
48
AVFilterContext
*ctx = outlink->
src
;
49
FrameStepContext
*framestep = ctx->
priv
;
50
AVFilterLink
*inlink = ctx->
inputs
[0];
51
52
outlink->
flags
|=
FF_LINK_FLAG_REQUEST_LOOP
;
53
outlink->
frame_rate
=
54
av_div_q
(inlink->
frame_rate
, (
AVRational
){framestep->
frame_step
, 1});
55
56
av_log
(ctx,
AV_LOG_VERBOSE
,
"step:%d frame_rate:%d/%d(%f) -> frame_rate:%d/%d(%f)\n"
,
57
framestep->frame_step,
58
inlink->frame_rate.num, inlink->frame_rate.den,
av_q2d
(inlink->frame_rate),
59
outlink->frame_rate.num, outlink->frame_rate.den,
av_q2d
(outlink->frame_rate));
60
return
0;
61
}
62
63
static
int
filter_frame
(
AVFilterLink
*inlink,
AVFrame
*ref)
64
{
65
FrameStepContext
*framestep = inlink->
dst
->
priv
;
66
67
if
(!(inlink->
frame_count
% framestep->
frame_step
)) {
68
return
ff_filter_frame
(inlink->
dst
->
outputs
[0], ref);
69
}
else
{
70
av_frame_free
(&ref);
71
return
0;
72
}
73
}
74
75
static
const
AVFilterPad
framestep_inputs
[] = {
76
{
77
.
name
=
"default"
,
78
.type =
AVMEDIA_TYPE_VIDEO
,
79
.filter_frame =
filter_frame
,
80
},
81
{ NULL }
82
};
83
84
static
const
AVFilterPad
framestep_outputs
[] = {
85
{
86
.
name
=
"default"
,
87
.type =
AVMEDIA_TYPE_VIDEO
,
88
.config_props =
config_output_props
,
89
},
90
{ NULL }
91
};
92
93
AVFilter
ff_vf_framestep
= {
94
.
name
=
"framestep"
,
95
.description =
NULL_IF_CONFIG_SMALL
(
"Select one frame every N frames."
),
96
.priv_size =
sizeof
(
FrameStepContext
),
97
.priv_class = &framestep_class,
98
.
inputs
= framestep_inputs,
99
.
outputs
= framestep_outputs,
100
.
flags
=
AVFILTER_FLAG_SUPPORT_TIMELINE_GENERIC
,
101
};
Generated on Sun Jul 20 2014 23:06:01 for FFmpeg by
1.8.2