FFmpeg
Loading...
Searching...
No Matches
settb.c
Go to the documentation of this file.
1/*
2 * Copyright (c) 2010 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
23 * Set timebase for the output link.
24 */
25
26#include "config_components.h"
27
28#include <inttypes.h>
29#include <stdio.h>
30
31#include "libavutil/avstring.h"
32#include "libavutil/eval.h"
33#include "libavutil/internal.h"
35#include "libavutil/opt.h"
36#include "libavutil/rational.h"
37#include "audio.h"
38#include "avfilter.h"
39#include "filters.h"
40#include "video.h"
41
42static const char *const var_names[] = {
43 "AVTB", /* default timebase 1/AV_TIME_BASE */
44 "intb", /* input timebase */
45 "sr", /* sample rate */
46 NULL
47};
48
55
56typedef struct SetTBContext {
57 const AVClass *class;
58 char *tb_expr;
61
62#define OFFSET(x) offsetof(SetTBContext, x)
63#define DEFINE_OPTIONS(filt_name, filt_type) \
64static const AVOption filt_name##_options[] = { \
65 { "expr", "set expression determining the output timebase", OFFSET(tb_expr), AV_OPT_TYPE_STRING, {.str="intb"}, \
66 .flags=AV_OPT_FLAG_##filt_type##_PARAM|AV_OPT_FLAG_FILTERING_PARAM }, \
67 { "tb", "set expression determining the output timebase", OFFSET(tb_expr), AV_OPT_TYPE_STRING, {.str="intb"}, \
68 .flags=AV_OPT_FLAG_##filt_type##_PARAM|AV_OPT_FLAG_FILTERING_PARAM }, \
69 { NULL } \
70}
71
73{
74 AVFilterContext *ctx = outlink->src;
75 SetTBContext *settb = ctx->priv;
76 AVFilterLink *inlink = ctx->inputs[0];
77 AVRational time_base;
78 int ret;
79 double res;
80
82 settb->var_values[VAR_INTB] = av_q2d(inlink->time_base);
83 settb->var_values[VAR_SR] = inlink->sample_rate;
84
85 outlink->w = inlink->w;
86 outlink->h = inlink->h;
87
88 if ((ret = av_expr_parse_and_eval(&res, settb->tb_expr, var_names, settb->var_values,
89 NULL, NULL, NULL, NULL, NULL, 0, NULL)) < 0) {
90 av_log(ctx, AV_LOG_ERROR, "Invalid expression '%s' for timebase.\n", settb->tb_expr);
91 return ret;
92 }
93 time_base = av_d2q(res, INT_MAX);
94 if (time_base.num <= 0 || time_base.den <= 0) {
96 "Invalid non-positive values for the timebase num:%d or den:%d.\n",
97 time_base.num, time_base.den);
98 return AVERROR(EINVAL);
99 }
100
101 outlink->time_base = time_base;
102 av_log(outlink->src, AV_LOG_VERBOSE, "tb:%d/%d -> tb:%d/%d\n",
103 inlink ->time_base.num, inlink ->time_base.den,
104 outlink->time_base.num, outlink->time_base.den);
105
106 return 0;
107}
108
109static int64_t rescale_pts(AVFilterLink *inlink, AVFilterLink *outlink, int64_t orig_pts)
110{
111 AVFilterContext *ctx = inlink->dst;
112 int64_t new_pts = orig_pts;
113
114 if (av_cmp_q(inlink->time_base, outlink->time_base)) {
115 new_pts = av_rescale_q(orig_pts, inlink->time_base, outlink->time_base);
116 av_log(ctx, AV_LOG_DEBUG, "tb:%d/%d pts:%"PRId64" -> tb:%d/%d pts:%"PRId64"\n",
117 inlink ->time_base.num, inlink ->time_base.den, orig_pts,
118 outlink->time_base.num, outlink->time_base.den, new_pts);
119 }
120
121 return new_pts;
122}
123
125{
126 AVFilterContext *ctx = inlink->dst;
127 AVFilterLink *outlink = ctx->outputs[0];
128
129 frame->pts = rescale_pts(inlink, outlink, frame->pts);
130 frame->duration = av_rescale_q(frame->duration, inlink->time_base, outlink->time_base);
131
132 return ff_filter_frame(outlink, frame);
133}
134
136{
137 AVFilterLink *inlink = ctx->inputs[0];
138 AVFilterLink *outlink = ctx->outputs[0];
139 AVFrame *in;
140 int status;
141 int64_t pts;
142 int ret;
143
144 FF_FILTER_FORWARD_STATUS_BACK(outlink, inlink);
145
146 ret = ff_inlink_consume_frame(inlink, &in);
147 if (ret < 0)
148 return ret;
149 if (ret > 0)
150 return filter_frame(inlink, in);
151
152 if (ff_inlink_acknowledge_status(inlink, &status, &pts)) {
153 ff_outlink_set_status(outlink, status, rescale_pts(inlink, outlink, pts));
154 return 0;
155 }
156
157 FF_FILTER_FORWARD_WANTED(outlink, inlink);
158
159 return FFERROR_NOT_READY;
160}
161
162#if CONFIG_SETTB_FILTER
163
164DEFINE_OPTIONS(settb, VIDEO);
166
167static const AVFilterPad avfilter_vf_settb_outputs[] = {
168 {
169 .name = "default",
170 .type = AVMEDIA_TYPE_VIDEO,
171 .config_props = config_output_props,
172 },
173};
174
175const FFFilter ff_vf_settb = {
176 .p.name = "settb",
177 .p.description = NULL_IF_CONFIG_SMALL("Set timebase for the video output link."),
178 .p.priv_class = &settb_class,
180 .priv_size = sizeof(SetTBContext),
182 FILTER_OUTPUTS(avfilter_vf_settb_outputs),
183 .activate = activate,
184};
185#endif /* CONFIG_SETTB_FILTER */
186
187#if CONFIG_ASETTB_FILTER
188
189DEFINE_OPTIONS(asettb, AUDIO);
191
192static const AVFilterPad avfilter_af_asettb_outputs[] = {
193 {
194 .name = "default",
195 .type = AVMEDIA_TYPE_AUDIO,
196 .config_props = config_output_props,
197 },
198};
199
200const FFFilter ff_af_asettb = {
201 .p.name = "asettb",
202 .p.description = NULL_IF_CONFIG_SMALL("Set timebase for the audio output link."),
203 .p.priv_class = &asettb_class,
205 .priv_size = sizeof(SetTBContext),
207 FILTER_OUTPUTS(avfilter_af_asettb_outputs),
208 .activate = activate,
209};
210#endif /* CONFIG_ASETTB_FILTER */
const FFFilter ff_af_asettb
const FFFilter ff_vf_settb
static AVFormatContext * ctx
const AVFilterPad ff_audio_default_filterpad[1]
An AVFilterPad array whose only entry has name "default" and is of type AVMEDIA_TYPE_AUDIO.
Definition audio.c:34
int ff_inlink_acknowledge_status(AVFilterLink *link, int *rstatus, int64_t *rpts)
Test and acknowledge the change of status on the link.
Definition avfilter.c:1467
int ff_filter_frame(AVFilterLink *link, AVFrame *frame)
Send a frame of data to the next filter.
Definition avfilter.c:1068
int ff_inlink_consume_frame(AVFilterLink *link, AVFrame **rframe)
Take a frame from the link's FIFO and update the link's stats.
Definition avfilter.c:1520
Main libavfilter public API header.
#define NULL
Definition coverity.c:32
long long int64_t
Definition coverity.c:34
static AVFrame * frame
int av_expr_parse_and_eval(double *d, const char *s, const char *const *const_names, const double *const_values, const char *const *func1_names, double(*const *funcs1)(void *, double), const char *const *func2_names, double(*const *funcs2)(void *, double, double), void *opaque, int log_offset, void *log_ctx)
Parse and evaluate an expression.
Definition eval.c:839
simple arithmetic expression evaluator
#define AVFILTER_FLAG_METADATA_ONLY
The filter is a "metadata" filter - it does not modify the frame data in any way.
Definition avfilter.h:182
#define AVERROR(e)
Definition error.h:45
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition log.h:231
#define AV_LOG_VERBOSE
Detailed information.
Definition log.h:226
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition log.h:210
AVRational av_d2q(double d, int max)
Convert a double precision floating point number to a rational.
Definition rational.c:110
static double av_q2d(AVRational a)
Convert an AVRational to a double.
Definition rational.h:104
static int av_cmp_q(AVRational a, AVRational b)
Compare two rationals.
Definition rational.h:89
int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)
Rescale a 64-bit integer by 2 rational numbers.
@ AVMEDIA_TYPE_AUDIO
Definition avutil.h:201
@ AVMEDIA_TYPE_VIDEO
Definition avutil.h:200
#define AV_TIME_BASE_Q
Internal time base represented as fractional value.
Definition avutil.h:263
static int activate(AVBitStreamFilterContext *ctx)
#define FILTER_INPUTS(array)
Definition filters.h:264
#define FILTER_OUTPUTS(array)
Definition filters.h:265
#define FF_FILTER_FORWARD_WANTED(outlink, inlink)
Forward the frame_wanted_out flag from an output link to an input link.
Definition filters.h:694
static void ff_outlink_set_status(AVFilterLink *link, int status, int64_t pts)
Set the status field of a link from the source filter.
Definition filters.h:629
#define FFERROR_NOT_READY
Filters implementation helper functions and internal structures.
Definition filters.h:34
#define FF_FILTER_FORWARD_STATUS_BACK(outlink, inlink)
Forward the status on an output link to an input link.
Definition filters.h:639
#define AVFILTER_DEFINE_CLASS(fname)
Definition filters.h:478
common internal API header
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
Definition internal.h:88
var_name
Definition noise.c:46
@ VAR_VARS_NB
Definition noise.c:59
static const char *const var_names[]
Definition noise.c:30
AVOptions.
Utilities for rational number calculation.
@ VAR_INTB
Definition settb.c:51
@ VAR_AVTB
Definition settb.c:50
@ VAR_VARS_NB
Definition settb.c:53
static int64_t rescale_pts(AVFilterLink *inlink, AVFilterLink *outlink, int64_t orig_pts)
Definition settb.c:109
#define DEFINE_OPTIONS(filt_name, filt_type)
Definition settb.c:63
static int filter_frame(AVFilterLink *inlink, AVFrame *frame)
Definition settb.c:124
static int config_output_props(AVFilterLink *outlink)
Definition settb.c:72
static int activate(AVFilterContext *ctx)
Definition settb.c:135
@ VAR_SR
Definition setts.c:77
Describe the class of an AVClass context structure.
Definition log.h:76
An instance of a filter.
Definition avfilter.h:273
A filter pad used for either input or output.
Definition filters.h:40
This structure describes decoded (raw) audio or video data.
Definition frame.h:472
Rational number (pair of numerator and denominator).
Definition rational.h:58
int num
Numerator.
Definition rational.h:59
int den
Denominator.
Definition rational.h:60
char * tb_expr
Definition settb.c:58
double var_values[VAR_VARS_NB]
Definition settb.c:59
#define av_log(a,...)
static int64_t pts
const AVFilterPad ff_video_default_filterpad[1]
An AVFilterPad array whose only entry has name "default" and is of type AVMEDIA_TYPE_VIDEO.
Definition video.c:37