2 * This file is part of Libav.
4 * Libav is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * Libav is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with Libav; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
26 #include "libavutil/avstring.h"
27 #include "libavutil/eval.h"
28 #include "libavutil/internal.h"
29 #include "libavutil/mathematics.h"
30 #include "libavutil/parseutils.h"
35 static const char *const var_names
[] = {
39 "AVTB", /* default timebase 1/AV_TIME_BASE */
54 double var_values
[VAR_VARS_NB
];
57 static int init(AVFilterContext
*ctx
, const char *args
)
59 NullContext
*priv
= ctx
->priv
;
63 av_strlcpy(priv
->tb_expr
, "AVTB", sizeof(priv
->tb_expr
));
66 sscanf(args
, "%d:%d:%255[^:]", &priv
->w
, &priv
->h
, priv
->tb_expr
);
68 if (priv
->w
<= 0 || priv
->h
<= 0) {
69 av_log(ctx
, AV_LOG_ERROR
, "Non-positive size values are not acceptable.\n");
70 return AVERROR(EINVAL
);
76 static int config_props(AVFilterLink
*outlink
)
78 AVFilterContext
*ctx
= outlink
->src
;
79 NullContext
*priv
= ctx
->priv
;
84 priv
->var_values
[VAR_E
] = M_E
;
85 priv
->var_values
[VAR_PHI
] = M_PHI
;
86 priv
->var_values
[VAR_PI
] = M_PI
;
87 priv
->var_values
[VAR_AVTB
] = av_q2d(AV_TIME_BASE_Q
);
89 if ((ret
= av_expr_parse_and_eval(&res
, priv
->tb_expr
, var_names
, priv
->var_values
,
90 NULL
, NULL
, NULL
, NULL
, NULL
, 0, NULL
)) < 0) {
91 av_log(ctx
, AV_LOG_ERROR
, "Invalid expression '%s' for timebase.\n", priv
->tb_expr
);
94 tb
= av_d2q(res
, INT_MAX
);
95 if (tb
.num
<= 0 || tb
.den
<= 0) {
96 av_log(ctx
, AV_LOG_ERROR
,
97 "Invalid non-positive value for the timebase %d/%d.\n",
99 return AVERROR(EINVAL
);
102 outlink
->w
= priv
->w
;
103 outlink
->h
= priv
->h
;
104 outlink
->time_base
= tb
;
106 av_log(outlink
->src
, AV_LOG_VERBOSE
, "w:%d h:%d tb:%d/%d\n", priv
->w
, priv
->h
,
112 static int request_frame(AVFilterLink
*link
)
117 static const AVFilterPad avfilter_vsrc_nullsrc_outputs
[] = {
120 .type
= AVMEDIA_TYPE_VIDEO
,
121 .config_props
= config_props
,
122 .request_frame
= request_frame
,
127 AVFilter avfilter_vsrc_nullsrc
= {
129 .description
= NULL_IF_CONFIG_SMALL("Null video source, never return images."),
132 .priv_size
= sizeof(NullContext
),
136 .outputs
= avfilter_vsrc_nullsrc_outputs
,