[FFmpeg-devel] [PATCH 2/4] lavfi/buffersrc: add add av_buffersrc_close().

wm4 nfxjfg at googlemail.com
Thu Jul 24 15:45:46 CEST 2014


On Thu, 24 Jul 2014 15:39:43 +0200
Nicolas George <george at nsup.org> wrote:

> Also deprecate adding a NULL frame to mark EOF.

No, you can't do this. It breaks compatibility with Libav; also what's
even the purpose of this (API) change?

> TODO APIchanges entry, version bump.
> 
> Signed-off-by: Nicolas George <george at nsup.org>
> ---
>  libavfilter/buffersrc.c | 40 ++++++++++++++++++++++++++++++----------
>  libavfilter/buffersrc.h | 15 +++++++++++++++
>  2 files changed, 45 insertions(+), 10 deletions(-)
> 
> diff --git a/libavfilter/buffersrc.c b/libavfilter/buffersrc.c
> index 27d3db0..6d71587 100644
> --- a/libavfilter/buffersrc.c
> +++ b/libavfilter/buffersrc.c
> @@ -63,6 +63,7 @@ typedef struct BufferSourceContext {
>      char    *channel_layout_str;
>  
>      int eof;
> +    int64_t eof_pts;
>  } BufferSourceContext;
>  
>  #define CHECK_VIDEO_PARAM_CHANGE(s, c, width, height, format)\
> @@ -77,6 +78,27 @@ typedef struct BufferSourceContext {
>          return AVERROR(EINVAL);\
>      }
>  
> +static int push_if_flag(AVFilterContext *ctx, int flags)
> +{
> +    return (flags & AV_BUFFERSRC_FLAG_PUSH) ?
> +        ctx->output_pads[0].request_frame(ctx->outputs[0]) : 0;
> +}
> +
> +int av_buffersrc_close(AVFilterContext *ctx, int64_t pts, int flags)
> +{
> +    BufferSourceContext *s = ctx->priv;
> +
> +    if (pts == AV_NOPTS_VALUE) {
> +        av_log(ctx, AV_LOG_WARNING, "No EOF timestamp\n");
> +        /* FIXME use duration for audio */
> +        pts = av_rescale_q(ctx->outputs[0]->current_pts,
> +                           AV_TIME_BASE_Q, ctx->outputs[0]->time_base) + 1;
> +    }
> +    s->eof_pts = pts;
> +    s->eof = 1;
> +    return push_if_flag(ctx, flags);
> +}
> +
>  int attribute_align_arg av_buffersrc_write_frame(AVFilterContext *ctx, const AVFrame *frame)
>  {
>      return av_buffersrc_add_frame_flags(ctx, (AVFrame *)frame,
> @@ -125,8 +147,7 @@ static int av_buffersrc_add_frame_internal(AVFilterContext *ctx,
>      s->nb_failed_requests = 0;
>  
>      if (!frame) {
> -        s->eof = 1;
> -        return 0;
> +        return av_buffersrc_close(ctx, AV_NOPTS_VALUE, flags);
>      } else if (s->eof)
>          return AVERROR(EINVAL);
>  
> @@ -177,11 +198,7 @@ static int av_buffersrc_add_frame_internal(AVFilterContext *ctx,
>          return ret;
>      }
>  
> -    if ((flags & AV_BUFFERSRC_FLAG_PUSH))
> -        if ((ret = ctx->output_pads[0].request_frame(ctx->outputs[0])) < 0)
> -            return ret;
> -
> -    return 0;
> +    return push_if_flag(ctx, flags);
>  }
>  
>  #if FF_API_AVFILTERBUFFER
> @@ -211,8 +228,7 @@ int av_buffersrc_add_ref(AVFilterContext *ctx, AVFilterBufferRef *buf,
>      int ret = 0, planes, i;
>  
>      if (!buf) {
> -        s->eof = 1;
> -        return 0;
> +        return av_buffersrc_close(ctx, AV_NOPTS_VALUE, flags);
>      } else if (s->eof)
>          return AVERROR(EINVAL);
>  
> @@ -487,10 +503,14 @@ static int request_frame(AVFilterLink *link)
>  {
>      BufferSourceContext *c = link->src->priv;
>      AVFrame *frame;
> +    int ret;
>  
>      if (!av_fifo_size(c->fifo)) {
> -        if (c->eof)
> +        if (c->eof) {
> +            if ((ret = ff_filter_link_close(link, c->eof_pts)) < 0)
> +                return ret;
>              return AVERROR_EOF;
> +        }
>          c->nb_failed_requests++;
>          return AVERROR(EAGAIN);
>      }
> diff --git a/libavfilter/buffersrc.h b/libavfilter/buffersrc.h
> index ea34c04..28ca545 100644
> --- a/libavfilter/buffersrc.h
> +++ b/libavfilter/buffersrc.h
> @@ -145,6 +145,8 @@ int av_buffersrc_add_frame(AVFilterContext *ctx, AVFrame *frame);
>   *
>   * @param buffer_src  pointer to a buffer source context
>   * @param frame       a frame, or NULL to mark EOF
> + *                    (Using NULL to mark EOF is deprecated, use
> + *                    av_buffersrc_close() instead.)
>   * @param flags       a combination of AV_BUFFERSRC_FLAG_*
>   * @return            >= 0 in case of success, a negative AVERROR code
>   *                    in case of failure
> @@ -154,6 +156,19 @@ int av_buffersrc_add_frame_flags(AVFilterContext *buffer_src,
>  
>  
>  /**
> + * Close a buffer source.
> + *
> + * This cause EOF to be propagated along the filter graph.
> + *
> + * @param buffer_src  pointer to a buffer source context
> + * @param pts         the timestamp of the end of stream
> + * @param flags       a combination of AV_BUFFERSRC_FLAG_*
> + * @return            >= 0 in case of success, a negative AVERROR code
> + *                    in case of failure
> + */
> +int av_buffersrc_close(AVFilterContext *buffer_src, int64_t pts, int flags);
> +
> +/**
>   * @}
>   */
>  



More information about the ffmpeg-devel mailing list