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)
        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];
    }
    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)
        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];
    }
    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)
        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];
    }
    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)
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]; } 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; }