[FFmpeg-devel] [PATCH] libavfilter/af_atempo: offset output frames' pts by first_frame_pts / tempo

Paweł Wegner pawel.wegner95 at gmail.com
Thu Jan 24 16:48:42 EET 2019


On Thu, Jan 24, 2019 at 3:43 PM Pavel Koshevoy <pkoshevoy at gmail.com> wrote:

> On Thu, Jan 24, 2019 at 5:49 AM Paweł Wegner <pawel.wegner95 at gmail.com>
> wrote:
> >
> > Signed-off-by: Paweł Wegner <pawel.wegner95 at gmail.com>
> > ---
> >  libavfilter/af_atempo.c | 9 +++++++++
> >  1 file changed, 9 insertions(+)
> >
> > diff --git a/libavfilter/af_atempo.c b/libavfilter/af_atempo.c
> > index bfdad7d76b..1245eae8c1 100644
> > --- a/libavfilter/af_atempo.c
> > +++ b/libavfilter/af_atempo.c
> > @@ -147,6 +147,8 @@ typedef struct ATempoContext {
> >      uint8_t *dst_end;
> >      uint64_t nsamples_in;
> >      uint64_t nsamples_out;
> > +
> > +    int64_t first_frame_pts;
> >  } ATempoContext;
> >
> >  #define YAE_ATEMPO_MIN 0.5
> > @@ -994,6 +996,7 @@ static av_cold int init(AVFilterContext *ctx)
> >      ATempoContext *atempo = ctx->priv;
> >      atempo->format = AV_SAMPLE_FMT_NONE;
> >      atempo->state  = YAE_LOAD_FRAGMENT;
> > +    atempo->first_frame_pts = AV_NOPTS_VALUE;
> >      return 0;
> >  }
> >
> > @@ -1069,6 +1072,7 @@ static int push_samples(ATempoContext *atempo,
> >
> >      // adjust the PTS:
> >      atempo->dst_buffer->pts =
> > +        (atempo->first_frame_pts == AV_NOPTS_VALUE ? 0 :
> atempo->first_frame_pts / atempo->tempo) +
> >          av_rescale_q(atempo->nsamples_out,
> >                       (AVRational){ 1, outlink->sample_rate },
> >                       outlink->time_base);
> > @@ -1108,6 +1112,11 @@ static int filter_frame(AVFilterLink *inlink,
> AVFrame *src_buffer)
> >
> >              atempo->dst = atempo->dst_buffer->data[0];
> >              atempo->dst_end = atempo->dst + n_out * atempo->stride;
> > +
> > +            if (atempo->first_frame_pts == AV_NOPTS_VALUE)
> > +                atempo->first_frame_pts =
> av_rescale_q(atempo->dst_buffer->pts,
> > +
>  inlink->time_base,
> > +
>  outlink->time_base);
> >          }
> >
> >          yae_apply(atempo, &src, src_end, &atempo->dst, atempo->dst_end);
> > --
> > 2.17.1
> >
>
>
> Probably okay. The reason I didn't do this to begin with is because
> this is an audio stream filter... and how the timeline of the stream
> was transformed up to the 1st frame is unknown.  You are making the
> assumption that it should have been transformed using the same tempo
> parameter as current tempo, but (video) tempo can be varied at runtime
> prior to 1st audio frame, so pts_0' = pts_0 / tempo could be wrong.
>
> Anyway, I don't have a use case where this change would break
> something, so if this fixes something for you then it's fine.

This fixes seeking when I have video playback sped up in ffplay like this:
ffplay -vf "setpts=0.5 * PTS" -af "atempo=2" input

>
>     Pavel.
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>


More information about the ffmpeg-devel mailing list