[FFmpeg-devel] [PATCH 5/7] lavfi/split: handle closed outputs.

Stefano Sabatini stefasab at gmail.com
Tue Aug 21 20:26:08 CEST 2012


On date Monday 2012-08-20 23:28:13 +0200, Nicolas George encoded:
> Return AVERROR_EOF if all outputs are closed.
> 
> Signed-off-by: Nicolas George <nicolas.george at normalesup.org>
> ---
>  libavfilter/split.c |   16 ++++++++++++----
>  1 file changed, 12 insertions(+), 4 deletions(-)
> 
> diff --git a/libavfilter/split.c b/libavfilter/split.c
> index 083e31b..b0d36f3 100644
> --- a/libavfilter/split.c
> +++ b/libavfilter/split.c
> @@ -71,10 +71,14 @@ static void split_uninit(AVFilterContext *ctx)
>  static int start_frame(AVFilterLink *inlink, AVFilterBufferRef *picref)
>  {
>      AVFilterContext *ctx = inlink->dst;
> -    int i, ret = 0;
> +    int i, ret = AVERROR_EOF;
>  
>      for (i = 0; i < ctx->nb_outputs; i++) {
> -        AVFilterBufferRef *buf_out = avfilter_ref_buffer(picref, ~AV_PERM_WRITE);
> +        AVFilterBufferRef *buf_out;
> +
> +        if (ctx->outputs[i]->closed)
> +            continue;
> +        buf_out = avfilter_ref_buffer(picref, ~AV_PERM_WRITE);
>          if (!buf_out)
>              return AVERROR(ENOMEM);
>  
> @@ -88,9 +92,11 @@ static int start_frame(AVFilterLink *inlink, AVFilterBufferRef *picref)
>  static int draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir)
>  {
>      AVFilterContext *ctx = inlink->dst;
> -    int i, ret = 0;
> +    int i, ret = AVERROR_EOF;
>  
>      for (i = 0; i < ctx->nb_outputs; i++) {
> +        if (ctx->outputs[i]->closed)
> +            continue;
>          ret = ff_draw_slice(ctx->outputs[i], y, h, slice_dir);
>          if (ret < 0)
>              break;
> @@ -101,9 +107,11 @@ static int draw_slice(AVFilterLink *inlink, int y, int h, int slice_dir)
>  static int end_frame(AVFilterLink *inlink)
>  {
>      AVFilterContext *ctx = inlink->dst;
> -    int i, ret = 0;
> +    int i, ret = AVERROR_EOF;
>  
>      for (i = 0; i < ctx->nb_outputs; i++) {
> +        if (ctx->outputs[i]->closed)
> +            continue;
>          ret = ff_end_frame(ctx->outputs[i]);
>          if (ret < 0)
>              break;

LGTM.
-- 
FFmpeg = Faithless and Faithless Magnificient Purposeless Evil Guide


More information about the ffmpeg-devel mailing list