[FFmpeg-devel] [PATCH 2/2] lavfi/setpts: introduce rand() function in expression
Stefano Sabatini
stefasab at gmail.com
Thu Dec 28 17:00:57 EET 2023
On date Thursday 2023-12-28 12:02:59 +0100, Andreas Rheinhardt wrote:
> Stefano Sabatini:
> > This is useful to simulate random jitter.
> > ---
> > Changelog | 1 +
> > doc/filters.texi | 10 +++++++++-
> > libavfilter/setpts.c | 39 +++++++++++++++++++++++++++++++++------
> > 3 files changed, 43 insertions(+), 7 deletions(-)
> >
> > diff --git a/Changelog b/Changelog
> > index 424bfc11af..ed01c53264 100644
> > --- a/Changelog
> > +++ b/Changelog
> > @@ -15,6 +15,7 @@ version <next>:
> > - tiltandshift filter
> > - qrencode filter and qrencodesrc source
> > - quirc filter
> > +- lavfi/setpts: introduce rand() function in expression
> >
> > version 6.1:
> > - libaribcaption decoder
> > diff --git a/doc/filters.texi b/doc/filters.texi
> > index d1f95b9781..1d9a5d6c7d 100644
> > --- a/doc/filters.texi
> > +++ b/doc/filters.texi
> > @@ -30946,7 +30946,7 @@ The expression which is evaluated for each frame to construct its timestamp.
> > @end table
> >
> > The expression is evaluated through the eval API and can contain the following
> > -constants:
> > +constants and functions:
> >
> > @table @option
> > @item FRAME_RATE, FR
> > @@ -31010,6 +31010,8 @@ The timebase of the input timestamps.
> > @item T_CHANGE
> > Time of the first frame after command was applied or time of the first frame if no commands.
> >
> > + at item rand(min, max)
> > +a random number included between min and max
> > @end table
> >
> > @subsection Examples
> > @@ -31021,6 +31023,12 @@ Start counting PTS from zero
> > setpts=PTS-STARTPTS
> > @end example
> >
> > + at item
> > +Apply a random jitter effect of +/-100 TB units:
> > + at example
> > +setpts=PTS+100rand(-100\,100)
> > + at end example
> > +
> > @item
> > Apply fast motion effect:
> > @example
> > diff --git a/libavfilter/setpts.c b/libavfilter/setpts.c
> > index 88a8d6af86..0f24a900b3 100644
> > --- a/libavfilter/setpts.c
> > +++ b/libavfilter/setpts.c
> > @@ -32,6 +32,8 @@
> > #include "libavutil/internal.h"
> > #include "libavutil/mathematics.h"
> > #include "libavutil/opt.h"
> > +#include "libavutil/lfg.h"
> > +#include "libavutil/random_seed.h"
> > #include "libavutil/time.h"
> > #include "audio.h"
> > #include "avfilter.h"
> > @@ -101,18 +103,39 @@ typedef struct SetPTSContext {
> > AVExpr *expr;
> > double var_values[VAR_VARS_NB];
> > enum AVMediaType type;
> > + AVLFG lfg;
> > } SetPTSContext;
> >
> > #define V(name_) \
> > setpts->var_values[VAR_##name_]
> >
> > +static double drand(void *ctx, double min, double max)
> > +{
> > + SetPTSContext *setpts = ((AVFilterContext *)ctx)->priv;
> > +
> > + return min + (max-min) / UINT_MAX * av_lfg_get(&setpts->lfg);
> > +}
> > +
[...]
>
> Why is this added here and not in lavu/eval so that it is available with
> all expressions?
There is no specific reason. Sometimes you need to have a control over
the seed, in this case you need to provide the PRNG context.
For the general case, probably we can place a global LFG in the eval
module and fetch its generated values.
More information about the ffmpeg-devel
mailing list