diff mbox

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

Message ID 20191019150318.21568-1-onemda@gmail.com
State Accepted
Commit 7df808ea8443808d31465dab81c94e89172070d2
Headers show

Commit Message

Paul B Mahol Oct. 19, 2019, 3:03 p.m. UTC
Now correctly updates EOF timestamp.

Signed-off-by: Paul B Mahol <onemda@gmail.com>
---
 libavfilter/settb.c | 51 ++++++++++++++++++++++++++++++++++++++-------
 1 file changed, 44 insertions(+), 7 deletions(-)

Comments

Paul B Mahol Oct. 21, 2019, 10:34 a.m. UTC | #1
will apply

On 10/19/19, Paul B Mahol <onemda@gmail.com> wrote:
> Now correctly updates EOF timestamp.
>
> Signed-off-by: Paul B Mahol <onemda@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
>
>
Nicolas George Oct. 21, 2019, 10:38 a.m. UTC | #2
Paul B Mahol (12019-10-21):
> will apply

Big patch: wait a week.
Paul B Mahol Oct. 21, 2019, 10:45 a.m. UTC | #3
On 10/21/19, Nicolas George <george@nsup.org> wrote:
> Paul B Mahol (12019-10-21):
>> will apply
>
> Big patch: wait a week.
>

LOL

> --
>   Nicolas George
>
Paul B Mahol Oct. 21, 2019, 1:44 p.m. UTC | #4
Nobody is listed as maintainer of this file, so will apply it ASAP!

On 10/19/19, Paul B Mahol <onemda@gmail.com> wrote:
> Now correctly updates EOF timestamp.
>
> Signed-off-by: Paul B Mahol <onemda@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
>
>
Nicolas George Oct. 21, 2019, 4:25 p.m. UTC | #5
Paul B Mahol (12019-10-21):
> Nobody is listed as maintainer of this file, so will apply it ASAP!

One week.
Paul B Mahol Oct. 21, 2019, 4:28 p.m. UTC | #6
On 10/21/19, Nicolas George <george@nsup.org> wrote:
> Paul B Mahol (12019-10-21):
>> Nobody is listed as maintainer of this file, so will apply it ASAP!
>
> One week.

One weekend is enough.

> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
Nicolas George Oct. 23, 2019, 10:34 a.m. UTC | #7
Paul B Mahol (12019-10-19):
> Now correctly updates EOF timestamp.
> 
> Signed-off-by: Paul B Mahol <onemda@gmail.com>
> ---
>  libavfilter/settb.c | 51 ++++++++++++++++++++++++++++++++++++++-------
>  1 file changed, 44 insertions(+), 7 deletions(-)

LGTM. It was actually much less complex to review than I thought at a
first glance. Thanks for waiting.
diff mbox

Patch

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 */