static int bit_allocation(IMCContext *q, IMCChannel *chctx,

                          int stream_format_code, int freebits, int flag)

{

    int i, j;

    const float limit = -1.e20;

    float highest = 0.0;

    int indx;

    int t1 = 0;

    int t2 = 1;

    float summa = 0.0;

    int iacc = 0;

    int summer = 0;

    int rres, cwlen;

    float lowest = 1.e10;

    int low_indx = 0;

    float workT[32];

    int flg;

    int found_indx = 0;



    for (i = 0; i < BANDS; i++)

        highest = FFMAX(highest, chctx->flcoeffs1[i]);



    for (i = 0; i < BANDS - 1; i++)

        chctx->flcoeffs4[i] = chctx->flcoeffs3[i] - log2f(chctx->flcoeffs5[i]);

    chctx->flcoeffs4[BANDS - 1] = limit;



    highest = highest * 0.25;



    for (i = 0; i < BANDS; i++) {

        indx = -1;

        if ((band_tab[i + 1] - band_tab[i]) == chctx->bandWidthT[i])

            indx = 0;



        if ((band_tab[i + 1] - band_tab[i]) > chctx->bandWidthT[i])

            indx = 1;



        if (((band_tab[i + 1] - band_tab[i]) / 2) >= chctx->bandWidthT[i])

            indx = 2;



        if (indx == -1)

            return AVERROR_INVALIDDATA;



        chctx->flcoeffs4[i] += xTab[(indx * 2 + (chctx->flcoeffs1[i] < highest)) * 2 + flag];

    }



    if (stream_format_code & 0x2) {

        chctx->flcoeffs4[0] = limit;

        chctx->flcoeffs4[1] = limit;

        chctx->flcoeffs4[2] = limit;

        chctx->flcoeffs4[3] = limit;

    }



    for (i = (stream_format_code & 0x2) ? 4 : 0; i < BANDS - 1; i++) {

        iacc  += chctx->bandWidthT[i];

        summa += chctx->bandWidthT[i] * chctx->flcoeffs4[i];

    }



    if (!iacc)

        return AVERROR_INVALIDDATA;



    chctx->bandWidthT[BANDS - 1] = 0;

    summa = (summa * 0.5 - freebits) / iacc;





    for (i = 0; i < BANDS / 2; i++) {

        rres = summer - freebits;

        if ((rres >= -8) && (rres <= 8))

            break;



        summer = 0;

        iacc   = 0;



        for (j = (stream_format_code & 0x2) ? 4 : 0; j < BANDS; j++) {

            cwlen = av_clipf(((chctx->flcoeffs4[j] * 0.5) - summa + 0.5), 0, 6);



            chctx->bitsBandT[j] = cwlen;

            summer += chctx->bandWidthT[j] * cwlen;



            if (cwlen > 0)

                iacc += chctx->bandWidthT[j];

        }



        flg = t2;

        t2 = 1;

        if (freebits < summer)

            t2 = -1;

        if (i == 0)

            flg = t2;

        if (flg != t2)

            t1++;



        summa = (float)(summer - freebits) / ((t1 + 1) * iacc) + summa;

    }



    for (i = (stream_format_code & 0x2) ? 4 : 0; i < BANDS; i++) {

        for (j = band_tab[i]; j < band_tab[i + 1]; j++)

            chctx->CWlengthT[j] = chctx->bitsBandT[i];

    }



    if (freebits > summer) {

        for (i = 0; i < BANDS; i++) {

            workT[i] = (chctx->bitsBandT[i] == 6) ? -1.e20

                                              : (chctx->bitsBandT[i] * -2 + chctx->flcoeffs4[i] - 0.415);

        }



        highest = 0.0;



        do {

            if (highest <= -1.e20)

                break;



            found_indx = 0;

            highest = -1.e20;



            for (i = 0; i < BANDS; i++) {

                if (workT[i] > highest) {

                    highest = workT[i];

                    found_indx = i;

                }

            }



            if (highest > -1.e20) {

                workT[found_indx] -= 2.0;

                if (++chctx->bitsBandT[found_indx] == 6)

                    workT[found_indx] = -1.e20;



                for (j = band_tab[found_indx]; j < band_tab[found_indx + 1] && (freebits > summer); j++) {

                    chctx->CWlengthT[j]++;

                    summer++;

                }

            }

        } while (freebits > summer);

    }

    if (freebits < summer) {

        for (i = 0; i < BANDS; i++) {

            workT[i] = chctx->bitsBandT[i] ? (chctx->bitsBandT[i] * -2 + chctx->flcoeffs4[i] + 1.585)

                                       : 1.e20;

        }

        if (stream_format_code & 0x2) {

            workT[0] = 1.e20;

            workT[1] = 1.e20;

            workT[2] = 1.e20;

            workT[3] = 1.e20;

        }

        while (freebits < summer) {

            lowest   = 1.e10;

            low_indx = 0;

            for (i = 0; i < BANDS; i++) {

                if (workT[i] < lowest) {

                    lowest   = workT[i];

                    low_indx = i;

                }

            }

            // if (lowest >= 1.e10)

            //     break;

            workT[low_indx] = lowest + 2.0;



            if (!--chctx->bitsBandT[low_indx])

                workT[low_indx] = 1.e20;



            for (j = band_tab[low_indx]; j < band_tab[low_indx+1] && (freebits < summer); j++) {

                if (chctx->CWlengthT[j] > 0) {

                    chctx->CWlengthT[j]--;

                    summer--;

                }

            }

        }

    }

    return 0;

}

static int bit_allocation(IMCContext *q, IMCChannel *chctx,

                          int stream_format_code, int freebits, int flag)

{

    int i, j;

    const float limit = -1.e20;

    float highest = 0.0;

    int indx;

    int t1 = 0;

    int t2 = 1;

    float summa = 0.0;

    int iacc = 0;

    int summer = 0;

    int rres, cwlen;

    float lowest = 1.e10;

    int low_indx = 0;

    float workT[32];

    int flg;

    int found_indx = 0;



    for (i = 0; i < BANDS; i++)

        highest = FFMAX(highest, chctx->flcoeffs1[i]);



    for (i = 0; i < BANDS - 1; i++)

        chctx->flcoeffs4[i] = chctx->flcoeffs3[i] - log2f(chctx->flcoeffs5[i]);

    chctx->flcoeffs4[BANDS - 1] = limit;



    highest = highest * 0.25;



    for (i = 0; i < BANDS; i++) {

        indx = -1;

        if ((band_tab[i + 1] - band_tab[i]) == chctx->bandWidthT[i])

            indx = 0;



        if ((band_tab[i + 1] - band_tab[i]) > chctx->bandWidthT[i])

            indx = 1;



        if (((band_tab[i + 1] - band_tab[i]) / 2) >= chctx->bandWidthT[i])

            indx = 2;



        if (indx == -1)

            return AVERROR_INVALIDDATA;



        chctx->flcoeffs4[i] += xTab[(indx * 2 + (chctx->flcoeffs1[i] < highest)) * 2 + flag];

    }



    if (stream_format_code & 0x2) {

        chctx->flcoeffs4[0] = limit;

        chctx->flcoeffs4[1] = limit;

        chctx->flcoeffs4[2] = limit;

        chctx->flcoeffs4[3] = limit;

    }



    for (i = (stream_format_code & 0x2) ? 4 : 0; i < BANDS - 1; i++) {

        iacc  += chctx->bandWidthT[i];

        summa += chctx->bandWidthT[i] * chctx->flcoeffs4[i];

    }



    if (!iacc)

        return AVERROR_INVALIDDATA;



    chctx->bandWidthT[BANDS - 1] = 0;

    summa = (summa * 0.5 - freebits) / iacc;





    for (i = 0; i < BANDS / 2; i++) {

        rres = summer - freebits;

        if ((rres >= -8) && (rres <= 8))

            break;



        summer = 0;

        iacc   = 0;



        for (j = (stream_format_code & 0x2) ? 4 : 0; j < BANDS; j++) {

            cwlen = av_clipf(((chctx->flcoeffs4[j] * 0.5) - summa + 0.5), 0, 6);



            chctx->bitsBandT[j] = cwlen;

            summer += chctx->bandWidthT[j] * cwlen;



            if (cwlen > 0)

                iacc += chctx->bandWidthT[j];

        }



        flg = t2;

        t2 = 1;

        if (freebits < summer)

            t2 = -1;

        if (i == 0)

            flg = t2;

        if (flg != t2)

            t1++;



        summa = (float)(summer - freebits) / ((t1 + 1) * iacc) + summa;

    }



    for (i = (stream_format_code & 0x2) ? 4 : 0; i < BANDS; i++) {

        for (j = band_tab[i]; j < band_tab[i + 1]; j++)

            chctx->CWlengthT[j] = chctx->bitsBandT[i];

    }



    if (freebits > summer) {

        for (i = 0; i < BANDS; i++) {

            workT[i] = (chctx->bitsBandT[i] == 6) ? -1.e20

                                              : (chctx->bitsBandT[i] * -2 + chctx->flcoeffs4[i] - 0.415);

        }



        highest = 0.0;



        do {

            if (highest <= -1.e20)

                break;



            found_indx = 0;

            highest = -1.e20;



            for (i = 0; i < BANDS; i++) {

                if (workT[i] > highest) {

                    highest = workT[i];

                    found_indx = i;

                }

            }



            if (highest > -1.e20) {

                workT[found_indx] -= 2.0;

                if (++chctx->bitsBandT[found_indx] == 6)

                    workT[found_indx] = -1.e20;



                for (j = band_tab[found_indx]; j < band_tab[found_indx + 1] && (freebits > summer); j++) {

                    chctx->CWlengthT[j]++;

                    summer++;

                }

            }

        } while (freebits > summer);

    }

    if (freebits < summer) {

        for (i = 0; i < BANDS; i++) {

            workT[i] = chctx->bitsBandT[i] ? (chctx->bitsBandT[i] * -2 + chctx->flcoeffs4[i] + 1.585)

                                       : 1.e20;

        }

        if (stream_format_code & 0x2) {

            workT[0] = 1.e20;

            workT[1] = 1.e20;

            workT[2] = 1.e20;

            workT[3] = 1.e20;

        }

        while (freebits < summer) {

            lowest   = 1.e10;

            low_indx = 0;

            for (i = 0; i < BANDS; i++) {

                if (workT[i] < lowest) {

                    lowest   = workT[i];

                    low_indx = i;

                }

            }

            

            

            workT[low_indx] = lowest + 2.0;



            if (!--chctx->bitsBandT[low_indx])

                workT[low_indx] = 1.e20;



            for (j = band_tab[low_indx]; j < band_tab[low_indx+1] && (freebits < summer); j++) {

                if (chctx->CWlengthT[j] > 0) {

                    chctx->CWlengthT[j]--;

                    summer--;

                }

            }

        }

    }

    return 0;

}

static int FUNC_0(IMCContext *VAR_0, IMCChannel *VAR_1,

                          int VAR_2, int VAR_3, int VAR_4)

{

    int VAR_5, VAR_6;

    const float VAR_7 = -1.e20;

    float VAR_8 = 0.0;

    int VAR_9;

    int VAR_10 = 0;

    int VAR_11 = 1;

    float VAR_12 = 0.0;

    int VAR_13 = 0;

    int VAR_14 = 0;

    int VAR_15, VAR_16;

    float VAR_17 = 1.e10;

    int VAR_18 = 0;

    float VAR_19[32];

    int VAR_20;

    int VAR_21 = 0;



    for (VAR_5 = 0; VAR_5 < BANDS; VAR_5++)

        VAR_8 = FFMAX(VAR_8, VAR_1->flcoeffs1[VAR_5]);



    for (VAR_5 = 0; VAR_5 < BANDS - 1; VAR_5++)

        VAR_1->flcoeffs4[VAR_5] = VAR_1->flcoeffs3[VAR_5] - log2f(VAR_1->flcoeffs5[VAR_5]);

    VAR_1->flcoeffs4[BANDS - 1] = VAR_7;



    VAR_8 = VAR_8 * 0.25;



    for (VAR_5 = 0; VAR_5 < BANDS; VAR_5++) {

        VAR_9 = -1;

        if ((band_tab[VAR_5 + 1] - band_tab[VAR_5]) == VAR_1->bandWidthT[VAR_5])

            VAR_9 = 0;



        if ((band_tab[VAR_5 + 1] - band_tab[VAR_5]) > VAR_1->bandWidthT[VAR_5])

            VAR_9 = 1;



        if (((band_tab[VAR_5 + 1] - band_tab[VAR_5]) / 2) >= VAR_1->bandWidthT[VAR_5])

            VAR_9 = 2;



        if (VAR_9 == -1)

            return AVERROR_INVALIDDATA;



        VAR_1->flcoeffs4[VAR_5] += xTab[(VAR_9 * 2 + (VAR_1->flcoeffs1[VAR_5] < VAR_8)) * 2 + VAR_4];

    }



    if (VAR_2 & 0x2) {

        VAR_1->flcoeffs4[0] = VAR_7;

        VAR_1->flcoeffs4[1] = VAR_7;

        VAR_1->flcoeffs4[2] = VAR_7;

        VAR_1->flcoeffs4[3] = VAR_7;

    }



    for (VAR_5 = (VAR_2 & 0x2) ? 4 : 0; VAR_5 < BANDS - 1; VAR_5++) {

        VAR_13  += VAR_1->bandWidthT[VAR_5];

        VAR_12 += VAR_1->bandWidthT[VAR_5] * VAR_1->flcoeffs4[VAR_5];

    }



    if (!VAR_13)

        return AVERROR_INVALIDDATA;



    VAR_1->bandWidthT[BANDS - 1] = 0;

    VAR_12 = (VAR_12 * 0.5 - VAR_3) / VAR_13;





    for (VAR_5 = 0; VAR_5 < BANDS / 2; VAR_5++) {

        VAR_15 = VAR_14 - VAR_3;

        if ((VAR_15 >= -8) && (VAR_15 <= 8))

            break;



        VAR_14 = 0;

        VAR_13   = 0;



        for (VAR_6 = (VAR_2 & 0x2) ? 4 : 0; VAR_6 < BANDS; VAR_6++) {

            VAR_16 = av_clipf(((VAR_1->flcoeffs4[VAR_6] * 0.5) - VAR_12 + 0.5), 0, 6);



            VAR_1->bitsBandT[VAR_6] = VAR_16;

            VAR_14 += VAR_1->bandWidthT[VAR_6] * VAR_16;



            if (VAR_16 > 0)

                VAR_13 += VAR_1->bandWidthT[VAR_6];

        }



        VAR_20 = VAR_11;

        VAR_11 = 1;

        if (VAR_3 < VAR_14)

            VAR_11 = -1;

        if (VAR_5 == 0)

            VAR_20 = VAR_11;

        if (VAR_20 != VAR_11)

            VAR_10++;



        VAR_12 = (float)(VAR_14 - VAR_3) / ((VAR_10 + 1) * VAR_13) + VAR_12;

    }



    for (VAR_5 = (VAR_2 & 0x2) ? 4 : 0; VAR_5 < BANDS; VAR_5++) {

        for (VAR_6 = band_tab[VAR_5]; VAR_6 < band_tab[VAR_5 + 1]; VAR_6++)

            VAR_1->CWlengthT[VAR_6] = VAR_1->bitsBandT[VAR_5];

    }



    if (VAR_3 > VAR_14) {

        for (VAR_5 = 0; VAR_5 < BANDS; VAR_5++) {

            VAR_19[VAR_5] = (VAR_1->bitsBandT[VAR_5] == 6) ? -1.e20

                                              : (VAR_1->bitsBandT[VAR_5] * -2 + VAR_1->flcoeffs4[VAR_5] - 0.415);

        }



        VAR_8 = 0.0;



        do {

            if (VAR_8 <= -1.e20)

                break;



            VAR_21 = 0;

            VAR_8 = -1.e20;



            for (VAR_5 = 0; VAR_5 < BANDS; VAR_5++) {

                if (VAR_19[VAR_5] > VAR_8) {

                    VAR_8 = VAR_19[VAR_5];

                    VAR_21 = VAR_5;

                }

            }



            if (VAR_8 > -1.e20) {

                VAR_19[VAR_21] -= 2.0;

                if (++VAR_1->bitsBandT[VAR_21] == 6)

                    VAR_19[VAR_21] = -1.e20;



                for (VAR_6 = band_tab[VAR_21]; VAR_6 < band_tab[VAR_21 + 1] && (VAR_3 > VAR_14); VAR_6++) {

                    VAR_1->CWlengthT[VAR_6]++;

                    VAR_14++;

                }

            }

        } while (VAR_3 > VAR_14);

    }

    if (VAR_3 < VAR_14) {

        for (VAR_5 = 0; VAR_5 < BANDS; VAR_5++) {

            VAR_19[VAR_5] = VAR_1->bitsBandT[VAR_5] ? (VAR_1->bitsBandT[VAR_5] * -2 + VAR_1->flcoeffs4[VAR_5] + 1.585)

                                       : 1.e20;

        }

        if (VAR_2 & 0x2) {

            VAR_19[0] = 1.e20;

            VAR_19[1] = 1.e20;

            VAR_19[2] = 1.e20;

            VAR_19[3] = 1.e20;

        }

        while (VAR_3 < VAR_14) {

            VAR_17   = 1.e10;

            VAR_18 = 0;

            for (VAR_5 = 0; VAR_5 < BANDS; VAR_5++) {

                if (VAR_19[VAR_5] < VAR_17) {

                    VAR_17   = VAR_19[VAR_5];

                    VAR_18 = VAR_5;

                }

            }

            

            

            VAR_19[VAR_18] = VAR_17 + 2.0;



            if (!--VAR_1->bitsBandT[VAR_18])

                VAR_19[VAR_18] = 1.e20;



            for (VAR_6 = band_tab[VAR_18]; VAR_6 < band_tab[VAR_18+1] && (VAR_3 < VAR_14); VAR_6++) {

                if (VAR_1->CWlengthT[VAR_6] > 0) {

                    VAR_1->CWlengthT[VAR_6]--;

                    VAR_14--;

                }

            }

        }

    }

    return 0;

}

static int FUNC_0(IMCContext *VAR_0, IMCChannel *VAR_1,
int VAR_2, int VAR_3, int VAR_4)
{ int VAR_5, VAR_6; const float VAR_7 = -1.e20; float VAR_8 = 0.0; int VAR_9; int VAR_10 = 0; int VAR_11 = 1; float VAR_12 = 0.0; int VAR_13 = 0; int VAR_14 = 0; int VAR_15, VAR_16; float VAR_17 = 1.e10; int VAR_18 = 0; float VAR_19[32]; int VAR_20; int VAR_21 = 0; for (VAR_5 = 0; VAR_5 < BANDS; VAR_5++) VAR_8 = FFMAX(VAR_8, VAR_1->flcoeffs1[VAR_5]); for (VAR_5 = 0; VAR_5 < BANDS - 1; VAR_5++) VAR_1->flcoeffs4[VAR_5] = VAR_1->flcoeffs3[VAR_5] - log2f(VAR_1->flcoeffs5[VAR_5]); VAR_1->flcoeffs4[BANDS - 1] = VAR_7; VAR_8 = VAR_8 * 0.25; for (VAR_5 = 0; VAR_5 < BANDS; VAR_5++) { VAR_9 = -1; if ((band_tab[VAR_5 + 1] - band_tab[VAR_5]) == VAR_1->bandWidthT[VAR_5])
VAR_9 = 0; if ((band_tab[VAR_5 + 1] - band_tab[VAR_5]) > VAR_1->bandWidthT[VAR_5])
VAR_9 = 1; if (((band_tab[VAR_5 + 1] - band_tab[VAR_5]) / 2) >= VAR_1->bandWidthT[VAR_5])
VAR_9 = 2; if (VAR_9 == -1)
return AVERROR_INVALIDDATA; VAR_1->flcoeffs4[VAR_5] += xTab[(VAR_9 * 2 + (VAR_1->flcoeffs1[VAR_5] < VAR_8)) * 2 + VAR_4]; } if (VAR_2 & 0x2) { VAR_1->flcoeffs4[0] = VAR_7; VAR_1->flcoeffs4[1] = VAR_7; VAR_1->flcoeffs4[2] = VAR_7; VAR_1->flcoeffs4[3] = VAR_7; } for (VAR_5 = (VAR_2 & 0x2) ? 4 : 0; VAR_5 < BANDS - 1; VAR_5++) { VAR_13  += VAR_1->bandWidthT[VAR_5]; VAR_12 += VAR_1->bandWidthT[VAR_5] * VAR_1->flcoeffs4[VAR_5]; } if (!VAR_13)
return AVERROR_INVALIDDATA; VAR_1->bandWidthT[BANDS - 1] = 0; VAR_12 = (VAR_12 * 0.5 - VAR_3) / VAR_13; for (VAR_5 = 0; VAR_5 < BANDS / 2; VAR_5++) { VAR_15 = VAR_14 - VAR_3; if ((VAR_15 >= -8) && (VAR_15 <= 8))
break; VAR_14 = 0; VAR_13   = 0; for (VAR_6 = (VAR_2 & 0x2) ? 4 : 0; VAR_6 < BANDS; VAR_6++) { VAR_16 = av_clipf(((VAR_1->flcoeffs4[VAR_6] * 0.5) - VAR_12 + 0.5), 0, 6); VAR_1->bitsBandT[VAR_6] = VAR_16; VAR_14 += VAR_1->bandWidthT[VAR_6] * VAR_16; if (VAR_16 > 0)
VAR_13 += VAR_1->bandWidthT[VAR_6]; } VAR_20 = VAR_11; VAR_11 = 1; if (VAR_3 < VAR_14)
VAR_11 = -1; if (VAR_5 == 0)
VAR_20 = VAR_11; if (VAR_20 != VAR_11)
VAR_10++; VAR_12 = (float)(VAR_14 - VAR_3) / ((VAR_10 + 1) * VAR_13) + VAR_12; } for (VAR_5 = (VAR_2 & 0x2) ? 4 : 0; VAR_5 < BANDS; VAR_5++) { for (VAR_6 = band_tab[VAR_5]; VAR_6 < band_tab[VAR_5 + 1]; VAR_6++) VAR_1->CWlengthT[VAR_6] = VAR_1->bitsBandT[VAR_5]; } if (VAR_3 > VAR_14) { for (VAR_5 = 0; VAR_5 < BANDS; VAR_5++) { VAR_19[VAR_5] = (VAR_1->bitsBandT[VAR_5] == 6) ? -1.e20
: (VAR_1->bitsBandT[VAR_5] * -2 + VAR_1->flcoeffs4[VAR_5] - 0.415); } VAR_8 = 0.0; do { if (VAR_8 <= -1.e20)
break; VAR_21 = 0; VAR_8 = -1.e20; for (VAR_5 = 0; VAR_5 < BANDS; VAR_5++) { if (VAR_19[VAR_5] > VAR_8) { VAR_8 = VAR_19[VAR_5]; VAR_21 = VAR_5; } } if (VAR_8 > -1.e20) { VAR_19[VAR_21] -= 2.0; if (++VAR_1->bitsBandT[VAR_21] == 6)
VAR_19[VAR_21] = -1.e20; for (VAR_6 = band_tab[VAR_21]; VAR_6 < band_tab[VAR_21 + 1] && (VAR_3 > VAR_14); VAR_6++) { VAR_1->CWlengthT[VAR_6]++; VAR_14++; } } } while (VAR_3 > VAR_14); } if (VAR_3 < VAR_14) { for (VAR_5 = 0; VAR_5 < BANDS; VAR_5++) { VAR_19[VAR_5] = VAR_1->bitsBandT[VAR_5] ? (VAR_1->bitsBandT[VAR_5] * -2 + VAR_1->flcoeffs4[VAR_5] + 1.585)
: 1.e20; } if (VAR_2 & 0x2) { VAR_19[0] = 1.e20; VAR_19[1] = 1.e20; VAR_19[2] = 1.e20; VAR_19[3] = 1.e20; } while (VAR_3 < VAR_14) { VAR_17   = 1.e10; VAR_18 = 0; for (VAR_5 = 0; VAR_5 < BANDS; VAR_5++) { if (VAR_19[VAR_5] < VAR_17) { VAR_17   = VAR_19[VAR_5]; VAR_18 = VAR_5; } } VAR_19[VAR_18] = VAR_17 + 2.0; if (!--VAR_1->bitsBandT[VAR_18])
VAR_19[VAR_18] = 1.e20; for (VAR_6 = band_tab[VAR_18]; VAR_6 < band_tab[VAR_18+1] && (VAR_3 < VAR_14); VAR_6++) { if (VAR_1->CWlengthT[VAR_6] > 0) { VAR_1->CWlengthT[VAR_6]--; VAR_14--; } } } } return 0; }