On 5/17/17 7:47 PM, Vittorio Giovara wrote:
> Signed-off-by: Vittorio Giovara <vittorio.giov...@gmail.com>
> ---
>  libavfilter/af_aformat.c      | 28 +++++++++----
>  libavfilter/af_channelmap.c   |  2 +-
>  libavfilter/af_channelsplit.c |  6 ++-
>  libavfilter/af_join.c         |  2 +-
>  libavfilter/avfiltergraph.c   | 97 
> ++++++++++++++++++++++++++++++-------------
>  libavfilter/buffersrc.c       |  2 +-
>  libavfilter/formats.c         | 45 ++++++++++++++++++--
>  libavfilter/formats.h         |  4 +-
>  8 files changed, 138 insertions(+), 48 deletions(-)
> 

It looks fine assuming you put uninit on copy as mentioned before, some
more below:


>  static av_cold int init(AVFilterContext *ctx)
>  {
>      AFormatContext *s = ctx->priv;
> @@ -109,8 +102,25 @@ static av_cold int init(AVFilterContext *ctx)
>                    ff_add_format, av_get_sample_fmt, AV_SAMPLE_FMT_NONE, 
> "sample format");
>      PARSE_FORMATS(s->sample_rates_str, int, s->sample_rates, ff_add_format,
>                    get_sample_rate, 0, "sample rate");
> -    PARSE_FORMATS(s->channel_layouts_str, uint64_t, s->channel_layouts,
> -                  ff_add_channel_layout, get_channel_layout, 0, "channel 
> layout");
> +    {

make it a function

> +        char *next, *cur = s->channel_layouts_str, sep = '|';
> +        int ret;
> +        while (cur) {
> +            AVChannelLayout fmt = {0};
> +            next = strchr(cur, sep);
> +            if (next)
> +                *next++ = 0;
> +
> +            ret = av_channel_layout_from_string(&fmt, cur);
> +            if (ret < 0) {
> +                av_log(ctx, AV_LOG_ERROR, "Error parsing channel layout: 
> %s.\n", cur);\
> +                return ret;
> +            }
> +            ff_add_channel_layout(&s->channel_layouts, &fmt);
> +
> +            cur = next;
> +        }
> +    }
>  
>      return 0;



>      ff_formats_unref(&link->in_formats);
> @@ -459,8 +465,40 @@ static int reduce_formats_on_filter(AVFilterContext 
> *filter)
>                     nb_formats, ff_add_format);
>      REDUCE_FORMATS(int,      AVFilterFormats,        samplerates,     
> formats,
>                     nb_formats, ff_add_format);
> -    REDUCE_FORMATS(uint64_t, AVFilterChannelLayouts, channel_layouts,
> -                   channel_layouts, nb_channel_layouts, 
> ff_add_channel_layout);
> +

make the following code a function as well

> +    for (i = 0; i < filter->nb_inputs; i++) {
> +        AVFilterLink *link = filter->inputs[i];
> +        AVChannelLayout *fmt;
> +
> +        if (!link->out_channel_layouts || 
> link->out_channel_layouts->nb_channel_layouts != 1)
> +            continue;
> +        fmt = &link->out_channel_layouts->channel_layouts[0];
> +
> +        for (j = 0; j < filter->nb_outputs; j++) {
> +            AVFilterLink *out_link = filter->outputs[j];
> +            AVFilterChannelLayouts *fmts;
> +
> +            if (link->type != out_link->type ||
> +                out_link->in_channel_layouts->nb_channel_layouts == 1)
> +                continue;
> +            fmts = out_link->in_channel_layouts;
> +
> +            if (!out_link->in_channel_layouts->nb_channel_layouts) {
> +                ff_add_channel_layout(&out_link->in_channel_layouts, fmt);
> +                break;
> +            }
> +
> +            for (k = 0; k < 
> out_link->in_channel_layouts->nb_channel_layouts; k++)
> +                if (!av_channel_layout_compare(&fmts->channel_layouts[k], 
> fmt)) {
> +                    ret = av_channel_layout_copy(&fmts->channel_layouts[0], 
> fmt);
> +                    if (ret < 0)
> +                        return ret;
> +                    fmts->nb_channel_layouts = 1;
> +                    ret = 1;
> +                    break;
> +                }
> +        }
> +    }
>  


> diff --git a/libavfilter/formats.c b/libavfilter/formats.c
> index 7b5a93c325..251df0d721 100644
> --- a/libavfilter/formats.c
> +++ b/libavfilter/formats.c
> @@ -131,8 +131,31 @@ AVFilterChannelLayouts 
> *ff_merge_channel_layouts(AVFilterChannelLayouts *a,
>      if (a == b) return a;
>  
>      if (a->nb_channel_layouts && b->nb_channel_layouts) {
> -        MERGE_FORMATS(ret, a, b, channel_layouts, nb_channel_layout> -       
>                AVFilterChannelLayouts, fail);

same thing here

> +        int i, j, k = 0, count = FFMIN(a->nb_channel_layouts, 
> b->nb_channel_layouts);
> +
> +        if (!(ret = av_mallocz(sizeof(*ret))))
> +            goto fail;
> +
> +        if (count) {
> +            if (!(ret->channel_layouts = 
> av_malloc(sizeof(*ret->channel_layouts) * count)))
> +                goto fail;
> +            for (i = 0; i < a->nb_channel_layouts; i++)
> +                for (j = 0; j < b->nb_channel_layouts; j++)
> +                    if (!av_channel_layout_compare(&a->channel_layouts[i],
> +                                                   &b->channel_layouts[j]))
> +                        if 
> (av_channel_layout_copy(&ret->channel_layouts[k++],
> +                                                   &a->channel_layouts[i]) < 
> 0)
> +                            goto fail;
> +
> +            ret->nb_channel_layouts = k;
> +        }
> +        /* check that there was at least one common format */
> +        if (!ret->nb_channel_layouts)
> +            goto fail;
> +
> +        MERGE_REF(ret, a, channel_layouts, AVFilterChannelLayouts, fail);
> +        MERGE_REF(ret, b, channel_layouts, AVFilterChannelLayouts, fail);
_______________________________________________
libav-devel mailing list
libav-devel@libav.org
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to