static int parse_channel_expressions(AVFilterContext *ctx,

                                     int expected_nb_channels)

{

    EvalContext *eval = ctx->priv;

    char *args1 = av_strdup(eval->exprs);

    char *expr, *last_expr, *buf;

    double (* const *func1)(void *, double) = NULL;

    const char * const *func1_names = NULL;

    int i, ret = 0;



    if (!args1)

        return AVERROR(ENOMEM);



    if (!eval->exprs) {

        av_log(ctx, AV_LOG_ERROR, "Channels expressions list is empty\n");

        return AVERROR(EINVAL);

    }



    if (!strcmp(ctx->filter->name, "aeval")) {

        func1 = aeval_func1;

        func1_names = aeval_func1_names;

    }



#define ADD_EXPRESSION(expr_) do {                                      \

        if (!av_dynarray2_add((void **)&eval->expr, &eval->nb_channels, \

                              sizeof(*eval->expr), NULL)) {             \

            ret = AVERROR(ENOMEM);                                      \

            goto end;                                                   \

        }                                                               \

        eval->expr[eval->nb_channels-1] = NULL;                         \

        ret = av_expr_parse(&eval->expr[eval->nb_channels - 1], expr_,  \

                            var_names, func1_names, func1,              \

                            NULL, NULL, 0, ctx);                        \

        if (ret < 0)                                                    \

            goto end;                                                   \

    } while (0)



    /* reset expressions */

    for (i = 0; i < eval->nb_channels; i++) {

        av_expr_free(eval->expr[i]);

        eval->expr[i] = NULL;

    }

    av_freep(&eval->expr);

    eval->nb_channels = 0;



    buf = args1;

    while (expr = av_strtok(buf, "|", &buf)) {

        ADD_EXPRESSION(expr);

        last_expr = expr;

    }



    if (expected_nb_channels > eval->nb_channels)

        for (i = eval->nb_channels; i < expected_nb_channels; i++)

            ADD_EXPRESSION(last_expr);



    if (expected_nb_channels > 0 && eval->nb_channels != expected_nb_channels) {

        av_log(ctx, AV_LOG_ERROR,

               "Mismatch between the specified number of channel expressions '%d' "

               "and the number of expected output channels '%d' for the specified channel layout\n",

               eval->nb_channels, expected_nb_channels);

        ret = AVERROR(EINVAL);

        goto end;

    }



end:

    av_free(args1);

    return ret;

}

static int parse_channel_expressions(AVFilterContext *ctx,

                                     int expected_nb_channels)

{

    EvalContext *eval = ctx->priv;

    char *args1 = av_strdup(eval->exprs);

    char *expr, *last_expr, *buf;

    double (* const *func1)(void *, double) = NULL;

    const char * const *func1_names = NULL;

    int i, ret = 0;



    if (!args1)

        return AVERROR(ENOMEM);



    if (!eval->exprs) {

        av_log(ctx, AV_LOG_ERROR, "Channels expressions list is empty\n");

        return AVERROR(EINVAL);

    }



    if (!strcmp(ctx->filter->name, "aeval")) {

        func1 = aeval_func1;

        func1_names = aeval_func1_names;

    }



#define ADD_EXPRESSION(expr_) do {                                      \

        if (!av_dynarray2_add((void **)&eval->expr, &eval->nb_channels, \

                              sizeof(*eval->expr), NULL)) {             \

            ret = AVERROR(ENOMEM);                                      \

            goto end;                                                   \

        }                                                               \

        eval->expr[eval->nb_channels-1] = NULL;                         \

        ret = av_expr_parse(&eval->expr[eval->nb_channels - 1], expr_,  \

                            var_names, func1_names, func1,              \

                            NULL, NULL, 0, ctx);                        \

        if (ret < 0)                                                    \

            goto end;                                                   \

    } while (0)



    

    for (i = 0; i < eval->nb_channels; i++) {

        av_expr_free(eval->expr[i]);

        eval->expr[i] = NULL;

    }

    av_freep(&eval->expr);

    eval->nb_channels = 0;



    buf = args1;

    while (expr = av_strtok(buf, "|", &buf)) {

        ADD_EXPRESSION(expr);

        last_expr = expr;

    }



    if (expected_nb_channels > eval->nb_channels)

        for (i = eval->nb_channels; i < expected_nb_channels; i++)

            ADD_EXPRESSION(last_expr);



    if (expected_nb_channels > 0 && eval->nb_channels != expected_nb_channels) {

        av_log(ctx, AV_LOG_ERROR,

               "Mismatch between the specified number of channel expressions '%d' "

               "and the number of expected output channels '%d' for the specified channel layout\n",

               eval->nb_channels, expected_nb_channels);

        ret = AVERROR(EINVAL);

        goto end;

    }



end:

    av_free(args1);

    return ret;

}

    char *expr, *last_expr, *buf;
VAR_8staticVAR_8 VAR_8intVAR_8 VAR_8parse_channel_expressionsVAR_8(VAR_8AVFilterContextVAR_8 *VAR_8VAR_0VAR_8,

                                     VAR_8intVAR_8 VAR_8VAR_1VAR_8)

{

    VAR_8EvalContextVAR_8 *VAR_8evalVAR_8 = VAR_8VAR_0VAR_8->VAR_8privVAR_8;

    VAR_8charVAR_8 *VAR_8VAR_2VAR_8 = VAR_8av_strdupVAR_8(VAR_8evalVAR_8->VAR_8exprsVAR_8);

    VAR_8charVAR_8 *VAR_8VAR_3VAR_8, *VAR_8VAR_4VAR_8, *VAR_8VAR_11VAR_8;

    VAR_8doubleVAR_8 (* VAR_8constVAR_8 *VAR_8VAR_6VAR_8)(VAR_8voidVAR_8 *, VAR_8doubleVAR_8) = VAR_8NULLVAR_8;

    VAR_8constVAR_8 VAR_8charVAR_8 * VAR_8constVAR_8 *VAR_8func1_namesVAR_8 = VAR_8NULLVAR_8;

    VAR_8intVAR_8 VAR_8iVAR_8, VAR_8retVAR_8 = VAR_80VAR_8;



    VAR_8ifVAR_8 (!VAR_8VAR_2VAR_8)

        VAR_8returnVAR_8 VAR_8AVERRORVAR_8(VAR_8ENOMEMVAR_8);



    VAR_8ifVAR_8 (!VAR_8evalVAR_8->VAR_8exprsVAR_8) {

        VAR_8av_logVAR_8(VAR_8VAR_0VAR_8, VAR_8AV_LOG_ERRORVAR_8, "VAR_8ChannelsVAR_8 VAR_8expressionsVAR_8 VAR_8listVAR_8 VAR_8isVAR_8 VAR_8emptyVAR_8\VAR_8nVAR_8");

        VAR_8returnVAR_8 VAR_8AVERRORVAR_8(VAR_8EINVALVAR_8);

    }



    VAR_8ifVAR_8 (!VAR_8strcmpVAR_8(VAR_8VAR_0VAR_8->VAR_8filterVAR_8->VAR_8nameVAR_8, "VAR_8aevalVAR_8")) {

        VAR_8VAR_6VAR_8 = VAR_8aeval_func1VAR_8;

        VAR_8func1_namesVAR_8 = VAR_8aeval_func1_namesVAR_8;

    }



#VAR_8defineVAR_8 VAR_8ADD_EXPRESSIONVAR_8(VAR_8expr_VAR_8) VAR_8doVAR_8 {                                      \

        VAR_8ifVAR_8 (!VAR_8av_dynarray2_addVAR_8((VAR_8voidVAR_8 **)&VAR_8evalVAR_8->VAR_8VAR_3VAR_8, &VAR_8evalVAR_8->VAR_8nb_channelsVAR_8, \

                              VAR_8sizeofVAR_8(*VAR_8evalVAR_8->VAR_8VAR_3VAR_8), VAR_8NULLVAR_8)) {             \

            VAR_8retVAR_8 = VAR_8AVERRORVAR_8(VAR_8ENOMEMVAR_8);                                      \

            VAR_8gotoVAR_8 VAR_8endVAR_8;                                                   \

        }                                                               \

        VAR_8evalVAR_8->VAR_8VAR_3VAR_8[VAR_8evalVAR_8->VAR_8nb_channelsVAR_8-VAR_81VAR_8] = VAR_8NULLVAR_8;                         \

        VAR_8retVAR_8 = VAR_8av_expr_parseVAR_8(&VAR_8evalVAR_8->VAR_8VAR_3VAR_8[VAR_8evalVAR_8->VAR_8nb_channelsVAR_8 - VAR_81VAR_8], VAR_8expr_VAR_8,  \

                            VAR_8var_namesVAR_8, VAR_8func1_namesVAR_8, VAR_8VAR_6VAR_8,              \

                            VAR_8NULLVAR_8, VAR_8NULLVAR_8, VAR_80VAR_8, VAR_8VAR_0VAR_8);                        \

        VAR_8ifVAR_8 (VAR_8retVAR_8 < VAR_80VAR_8)                                                    \

            VAR_8gotoVAR_8 VAR_8endVAR_8;                                                   \

    } VAR_8whileVAR_8 (VAR_80VAR_8)



    

    VAR_8forVAR_8 (VAR_8iVAR_8 = VAR_80VAR_8; VAR_8iVAR_8 < VAR_8evalVAR_8->VAR_8nb_channelsVAR_8; VAR_8iVAR_8++) {

        VAR_8av_expr_freeVAR_8(VAR_8evalVAR_8->VAR_8VAR_3VAR_8[VAR_8iVAR_8]);

        VAR_8evalVAR_8->VAR_8VAR_3VAR_8[VAR_8iVAR_8] = VAR_8NULLVAR_8;

    }

    VAR_8av_freepVAR_8(&VAR_8evalVAR_8->VAR_8VAR_3VAR_8);

    VAR_8evalVAR_8->VAR_8nb_channelsVAR_8 = VAR_80VAR_8;



    VAR_8VAR_11VAR_8 = VAR_8VAR_2VAR_8;

    VAR_8whileVAR_8 (VAR_8VAR_3VAR_8 = VAR_8av_strtokVAR_8(VAR_8VAR_11VAR_8, "|", &VAR_8VAR_11VAR_8)) {

        VAR_8ADD_EXPRESSIONVAR_8(VAR_8VAR_3VAR_8);

        VAR_8VAR_4VAR_8 = VAR_8VAR_3VAR_8;

    }



    VAR_8ifVAR_8 (VAR_8VAR_1VAR_8 > VAR_8evalVAR_8->VAR_8nb_channelsVAR_8)

        VAR_8forVAR_8 (VAR_8iVAR_8 = VAR_8evalVAR_8->VAR_8nb_channelsVAR_8; VAR_8iVAR_8 < VAR_8VAR_1VAR_8; VAR_8iVAR_8++)

            VAR_8ADD_EXPRESSIONVAR_8(VAR_8VAR_4VAR_8);



    VAR_8ifVAR_8 (VAR_8VAR_1VAR_8 > VAR_80VAR_8 && VAR_8evalVAR_8->VAR_8nb_channelsVAR_8 != VAR_8VAR_1VAR_8) {

        VAR_8av_logVAR_8(VAR_8VAR_0VAR_8, VAR_8AV_LOG_ERRORVAR_8,

               "VAR_8MismatchVAR_8 VAR_8betweenVAR_8 VAR_8theVAR_8 VAR_8specifiedVAR_8 VAR_8numberVAR_8 VAR_8ofVAR_8 VAR_8channelVAR_8 VAR_8expressionsVAR_8 '%VAR_8dVAR_8' "

               "VAR_8andVAR_8 VAR_8theVAR_8 VAR_8numberVAR_8 VAR_8ofVAR_8 VAR_8expectedVAR_8 VAR_8outputVAR_8 VAR_8channelsVAR_8 '%VAR_8dVAR_8' VAR_8forVAR_8 VAR_8theVAR_8 VAR_8specifiedVAR_8 VAR_8channelVAR_8 VAR_8layoutVAR_8\VAR_8nVAR_8",

               VAR_8evalVAR_8->VAR_8nb_channelsVAR_8, VAR_8VAR_1VAR_8);

        VAR_8retVAR_8 = VAR_8AVERRORVAR_8(VAR_8EINVALVAR_8);

        VAR_8gotoVAR_8 VAR_8endVAR_8;

    }



VAR_8endVAR_8:

    VAR_8av_freeVAR_8(VAR_8VAR_2VAR_8);

    VAR_8returnVAR_8 VAR_8retVAR_8;

}

VAR_8staticVAR_8 VAR_8intVAR_8 VAR_8parse_channel_expressionsVAR_8(VAR_8AVFilterContextVAR_8 *VAR_8VAR_0VAR_8,
VAR_8intVAR_8 VAR_8VAR_1VAR_8)
{ VAR_8EvalContextVAR_8 *VAR_8evalVAR_8 = VAR_8VAR_0VAR_8->VAR_8privVAR_8; VAR_8charVAR_8 *VAR_8VAR_2VAR_8 = VAR_8av_strdupVAR_8(VAR_8evalVAR_8->VAR_8exprsVAR_8); VAR_8charVAR_8 *VAR_8VAR_3VAR_8, *VAR_8VAR_4VAR_8, *VAR_8VAR_11VAR_8; VAR_8doubleVAR_8 (* VAR_8constVAR_8 *VAR_8VAR_6VAR_8)(VAR_8voidVAR_8 *, VAR_8doubleVAR_8) = VAR_8NULLVAR_8; VAR_8constVAR_8 VAR_8charVAR_8 * VAR_8constVAR_8 *VAR_8func1_namesVAR_8 = VAR_8NULLVAR_8; VAR_8intVAR_8 VAR_8iVAR_8, VAR_8retVAR_8 = VAR_80VAR_8; VAR_8ifVAR_8 (!VAR_8VAR_2VAR_8)
VAR_8returnVAR_8 VAR_8AVERRORVAR_8(VAR_8ENOMEMVAR_8); VAR_8ifVAR_8 (!VAR_8evalVAR_8->VAR_8exprsVAR_8) { VAR_8av_logVAR_8(VAR_8VAR_0VAR_8, VAR_8AV_LOG_ERRORVAR_8, "VAR_8ChannelsVAR_8 VAR_8expressionsVAR_8 VAR_8listVAR_8 VAR_8isVAR_8 VAR_8emptyVAR_8\VAR_8nVAR_8"); VAR_8returnVAR_8 VAR_8AVERRORVAR_8(VAR_8EINVALVAR_8); } VAR_8ifVAR_8 (!VAR_8strcmpVAR_8(VAR_8VAR_0VAR_8->VAR_8filterVAR_8->VAR_8nameVAR_8, "VAR_8aevalVAR_8")) { VAR_8VAR_6VAR_8 = VAR_8aeval_func1VAR_8; VAR_8func1_namesVAR_8 = VAR_8aeval_func1_namesVAR_8; } #VAR_8defineVAR_8 VAR_8ADD_EXPRESSIONVAR_8(VAR_8expr_VAR_8) VAR_8doVAR_8 {                                      \ VAR_8ifVAR_8 (!VAR_8av_dynarray2_addVAR_8((VAR_8voidVAR_8 **)&VAR_8evalVAR_8->VAR_8VAR_3VAR_8, &VAR_8evalVAR_8->VAR_8nb_channelsVAR_8, \
VAR_8sizeofVAR_8(*VAR_8evalVAR_8->VAR_8VAR_3VAR_8), VAR_8NULLVAR_8)) {             \ VAR_8retVAR_8 = VAR_8AVERRORVAR_8(VAR_8ENOMEMVAR_8);                                      \ VAR_8gotoVAR_8 VAR_8endVAR_8;                                                   \ }                                                               \ VAR_8evalVAR_8->VAR_8VAR_3VAR_8[VAR_8evalVAR_8->VAR_8nb_channelsVAR_8-VAR_81VAR_8] = VAR_8NULLVAR_8;                         \ VAR_8retVAR_8 = VAR_8av_expr_parseVAR_8(&VAR_8evalVAR_8->VAR_8VAR_3VAR_8[VAR_8evalVAR_8->VAR_8nb_channelsVAR_8 - VAR_81VAR_8], VAR_8expr_VAR_8,  \
VAR_8var_namesVAR_8, VAR_8func1_namesVAR_8, VAR_8VAR_6VAR_8,              \
VAR_8NULLVAR_8, VAR_8NULLVAR_8, VAR_80VAR_8, VAR_8VAR_0VAR_8);                        \ VAR_8ifVAR_8 (VAR_8retVAR_8 < VAR_80VAR_8)                                                    \
VAR_8gotoVAR_8 VAR_8endVAR_8;                                                   \ } VAR_8whileVAR_8 (VAR_80VAR_8) VAR_8forVAR_8 (VAR_8iVAR_8 = VAR_80VAR_8; VAR_8iVAR_8 < VAR_8evalVAR_8->VAR_8nb_channelsVAR_8; VAR_8iVAR_8++) { VAR_8av_expr_freeVAR_8(VAR_8evalVAR_8->VAR_8VAR_3VAR_8[VAR_8iVAR_8]); VAR_8evalVAR_8->VAR_8VAR_3VAR_8[VAR_8iVAR_8] = VAR_8NULLVAR_8; } VAR_8av_freepVAR_8(&VAR_8evalVAR_8->VAR_8VAR_3VAR_8); VAR_8evalVAR_8->VAR_8nb_channelsVAR_8 = VAR_80VAR_8; VAR_8VAR_11VAR_8 = VAR_8VAR_2VAR_8; VAR_8whileVAR_8 (VAR_8VAR_3VAR_8 = VAR_8av_strtokVAR_8(VAR_8VAR_11VAR_8, "|", &VAR_8VAR_11VAR_8)) { VAR_8ADD_EXPRESSIONVAR_8(VAR_8VAR_3VAR_8); VAR_8VAR_4VAR_8 = VAR_8VAR_3VAR_8; } VAR_8ifVAR_8 (VAR_8VAR_1VAR_8 > VAR_8evalVAR_8->VAR_8nb_channelsVAR_8)
VAR_8forVAR_8 (VAR_8iVAR_8 = VAR_8evalVAR_8->VAR_8nb_channelsVAR_8; VAR_8iVAR_8 < VAR_8VAR_1VAR_8; VAR_8iVAR_8++) VAR_8ADD_EXPRESSIONVAR_8(VAR_8VAR_4VAR_8); VAR_8ifVAR_8 (VAR_8VAR_1VAR_8 > VAR_80VAR_8 && VAR_8evalVAR_8->VAR_8nb_channelsVAR_8 != VAR_8VAR_1VAR_8) { VAR_8av_logVAR_8(VAR_8VAR_0VAR_8, VAR_8AV_LOG_ERRORVAR_8,
"VAR_8MismatchVAR_8 VAR_8betweenVAR_8 VAR_8theVAR_8 VAR_8specifiedVAR_8 VAR_8numberVAR_8 VAR_8ofVAR_8 VAR_8channelVAR_8 VAR_8expressionsVAR_8 '%VAR_8dVAR_8' "
"VAR_8andVAR_8 VAR_8theVAR_8 VAR_8numberVAR_8 VAR_8ofVAR_8 VAR_8expectedVAR_8 VAR_8outputVAR_8 VAR_8channelsVAR_8 '%VAR_8dVAR_8' VAR_8forVAR_8 VAR_8theVAR_8 VAR_8specifiedVAR_8 VAR_8channelVAR_8 VAR_8layoutVAR_8\VAR_8nVAR_8",
VAR_8evalVAR_8->VAR_8nb_channelsVAR_8, VAR_8VAR_1VAR_8); VAR_8retVAR_8 = VAR_8AVERRORVAR_8(VAR_8EINVALVAR_8); VAR_8gotoVAR_8 VAR_8endVAR_8; } VAR_8endVAR_8:
VAR_8av_freeVAR_8(VAR_8VAR_2VAR_8); VAR_8returnVAR_8 VAR_8retVAR_8; }