[FFmpeg-devel] [PATCH] avfilter/settb: switch to activate

Paul B Mahol onemda at gmail.com
Mon Oct 21 13:34:41 EEST 2019


will apply

On 10/19/19, Paul B Mahol <onemda at gmail.com> wrote:
> Now correctly updates EOF timestamp.
>
> Signed-off-by: Paul B Mahol <onemda at gmail.com>
> ---
>  libavfilter/settb.c | 51 ++++++++++++++++++++++++++++++++++++++-------
>  1 file changed, 44 insertions(+), 7 deletions(-)
>
> diff --git a/libavfilter/settb.c b/libavfilter/settb.c
> index 83616c1361..dba52cff31 100644
> --- a/libavfilter/settb.c
> +++ b/libavfilter/settb.c
> @@ -34,6 +34,7 @@
>  #include "libavutil/rational.h"
>  #include "audio.h"
>  #include "avfilter.h"
> +#include "filters.h"
>  #include "internal.h"
>  #include "video.h"
>
> @@ -104,22 +105,58 @@ static int config_output_props(AVFilterLink *outlink)
>      return 0;
>  }
>
> -static int filter_frame(AVFilterLink *inlink, AVFrame *frame)
> +static int64_t rescale_pts(AVFilterLink *inlink, AVFilterLink *outlink,
> int64_t orig_pts)
>  {
>      AVFilterContext *ctx = inlink->dst;
> -    AVFilterLink *outlink = ctx->outputs[0];
> +    int64_t new_pts = orig_pts;
>
>      if (av_cmp_q(inlink->time_base, outlink->time_base)) {
> -        int64_t orig_pts = frame->pts;
> -        frame->pts = av_rescale_q(frame->pts, inlink->time_base,
> outlink->time_base);
> +        new_pts = av_rescale_q(orig_pts, inlink->time_base,
> outlink->time_base);
>          av_log(ctx, AV_LOG_DEBUG, "tb:%d/%d pts:%"PRId64" -> tb:%d/%d
> pts:%"PRId64"\n",
>                 inlink ->time_base.num, inlink ->time_base.den, orig_pts,
> -               outlink->time_base.num, outlink->time_base.den,
> frame->pts);
> +               outlink->time_base.num, outlink->time_base.den, new_pts);
>      }
>
> +    return new_pts;
> +}
> +
> +static int filter_frame(AVFilterLink *inlink, AVFrame *frame)
> +{
> +    AVFilterContext *ctx = inlink->dst;
> +    AVFilterLink *outlink = ctx->outputs[0];
> +
> +    frame->pts = rescale_pts(inlink, outlink, frame->pts);
> +
>      return ff_filter_frame(outlink, frame);
>  }
>
> +static int activate(AVFilterContext *ctx)
> +{
> +    AVFilterLink *inlink = ctx->inputs[0];
> +    AVFilterLink *outlink = ctx->outputs[0];
> +    AVFrame *in;
> +    int status;
> +    int64_t pts;
> +    int ret;
> +
> +    FF_FILTER_FORWARD_STATUS_BACK(outlink, inlink);
> +
> +    ret = ff_inlink_consume_frame(inlink, &in);
> +    if (ret < 0)
> +        return ret;
> +    if (ret > 0)
> +        return filter_frame(inlink, in);
> +
> +    if (ff_inlink_acknowledge_status(inlink, &status, &pts)) {
> +        ff_outlink_set_status(outlink, status, rescale_pts(inlink, outlink,
> pts));
> +        return 0;
> +    }
> +
> +    FF_FILTER_FORWARD_WANTED(outlink, inlink);
> +
> +    return FFERROR_NOT_READY;
> +}
> +
>  #if CONFIG_SETTB_FILTER
>
>  DEFINE_OPTIONS(settb, VIDEO);
> @@ -129,7 +166,6 @@ static const AVFilterPad avfilter_vf_settb_inputs[] = {
>      {
>          .name         = "default",
>          .type         = AVMEDIA_TYPE_VIDEO,
> -        .filter_frame = filter_frame,
>      },
>      { NULL }
>  };
> @@ -150,6 +186,7 @@ AVFilter ff_vf_settb = {
>      .priv_class  = &settb_class,
>      .inputs      = avfilter_vf_settb_inputs,
>      .outputs     = avfilter_vf_settb_outputs,
> +    .activate    = activate,
>  };
>  #endif /* CONFIG_SETTB_FILTER */
>
> @@ -162,7 +199,6 @@ static const AVFilterPad avfilter_af_asettb_inputs[] =
> {
>      {
>          .name         = "default",
>          .type         = AVMEDIA_TYPE_AUDIO,
> -        .filter_frame = filter_frame,
>      },
>      { NULL }
>  };
> @@ -183,5 +219,6 @@ AVFilter ff_af_asettb = {
>      .inputs      = avfilter_af_asettb_inputs,
>      .outputs     = avfilter_af_asettb_outputs,
>      .priv_class  = &asettb_class,
> +    .activate    = activate,
>  };
>  #endif /* CONFIG_ASETTB_FILTER */
> --
> 2.17.1
>
>


More information about the ffmpeg-devel mailing list