[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