static int decode_segment(TAKDecContext *s, int8_t mode, int32_t *decoded, int len)

{

    struct CParam code;

    GetBitContext *gb = &s->gb;

    int i;



    if (!mode) {

        memset(decoded, 0, len * sizeof(*decoded));

        return 0;

    }



    if (mode > FF_ARRAY_ELEMS(xcodes))

        return AVERROR_INVALIDDATA;

    code = xcodes[mode - 1];



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

        int x = get_bits_long(gb, code.init);

        if (x >= code.escape && get_bits1(gb)) {

            x |= 1 << code.init;

            if (x >= code.aescape) {

                int scale = get_unary(gb, 1, 9);

                if (scale == 9) {

                    int scale_bits = get_bits(gb, 3);

                    if (scale_bits > 0) {

                        if (scale_bits == 7) {

                            scale_bits += get_bits(gb, 5);

                            if (scale_bits > 29)

                                return AVERROR_INVALIDDATA;

                        }

                        scale = get_bits_long(gb, scale_bits) + 1;

                        x    += code.scale * scale;

                    }

                    x += code.bias;

                } else

                    x += code.scale * scale - code.escape;

            } else

                x -= code.escape;

        }

        decoded[i] = (x >> 1) ^ -(x & 1);

    }



    return 0;

}

static int decode_segment(TAKDecContext *s, int8_t mode, int32_t *decoded, int len)

{

    struct CParam code;

    GetBitContext *gb = &s->gb;

    int i;



    if (!mode) {

        memset(decoded, 0, len * sizeof(*decoded));

        return 0;

    }



    if (mode > FF_ARRAY_ELEMS(xcodes))

        return AVERROR_INVALIDDATA;

    code = xcodes[mode - 1];



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

        int x = get_bits_long(gb, code.init);

        if (x >= code.escape && get_bits1(gb)) {

            x |= 1 << code.init;

            if (x >= code.aescape) {

                int scale = get_unary(gb, 1, 9);

                if (scale == 9) {

                    int scale_bits = get_bits(gb, 3);

                    if (scale_bits > 0) {

                        if (scale_bits == 7) {

                            scale_bits += get_bits(gb, 5);

                            if (scale_bits > 29)

                                return AVERROR_INVALIDDATA;

                        }

                        scale = get_bits_long(gb, scale_bits) + 1;

                        x    += code.scale * scale;

                    }

                    x += code.bias;

                } else

                    x += code.scale * scale - code.escape;

            } else

                x -= code.escape;

        }

        decoded[i] = (x >> 1) ^ -(x & 1);

    }



    return 0;

}

        int x = get_bits_long(gb, code.init);                 int scale = get_unary(gb, 1, 9);
static int FUNC_0(TAKDecContext *VAR_0, int8_t VAR_1, int32_t *VAR_2, int VAR_3)

{

    struct CParam VAR_4;

    GetBitContext *gb = &VAR_0->gb;

    int VAR_5;



    if (!VAR_1) {

        memset(VAR_2, 0, VAR_3 * sizeof(*VAR_2));

        return 0;

    }



    if (VAR_1 > FF_ARRAY_ELEMS(xcodes))

        return AVERROR_INVALIDDATA;

    VAR_4 = xcodes[VAR_1 - 1];



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

        int VAR_6 = get_bits_long(gb, VAR_4.init);

        if (VAR_6 >= VAR_4.escape && get_bits1(gb)) {

            VAR_6 |= 1 << VAR_4.init;

            if (VAR_6 >= VAR_4.aescape) {

                int VAR_7 = get_unary(gb, 1, 9);

                if (VAR_7 == 9) {

                    int VAR_8 = get_bits(gb, 3);

                    if (VAR_8 > 0) {

                        if (VAR_8 == 7) {

                            VAR_8 += get_bits(gb, 5);

                            if (VAR_8 > 29)

                                return AVERROR_INVALIDDATA;

                        }

                        VAR_7 = get_bits_long(gb, VAR_8) + 1;

                        VAR_6    += VAR_4.VAR_7 * VAR_7;

                    }

                    VAR_6 += VAR_4.bias;

                } else

                    VAR_6 += VAR_4.VAR_7 * VAR_7 - VAR_4.escape;

            } else

                VAR_6 -= VAR_4.escape;

        }

        VAR_2[VAR_5] = (VAR_6 >> 1) ^ -(VAR_6 & 1);

    }



    return 0;

}

static int FUNC_0(TAKDecContext *VAR_0, int8_t VAR_1, int32_t *VAR_2, int VAR_3)
{ struct CParam VAR_4; GetBitContext *gb = &VAR_0->gb; int VAR_5; if (!VAR_1) { memset(VAR_2, 0, VAR_3 * sizeof(*VAR_2)); return 0; } if (VAR_1 > FF_ARRAY_ELEMS(xcodes))
return AVERROR_INVALIDDATA; VAR_4 = xcodes[VAR_1 - 1]; for (VAR_5 = 0; VAR_5 < VAR_3; VAR_5++) { int VAR_6 = get_bits_long(gb, VAR_4.init); if (VAR_6 >= VAR_4.escape && get_bits1(gb)) { VAR_6 |= 1 << VAR_4.init; if (VAR_6 >= VAR_4.aescape) { int VAR_7 = get_unary(gb, 1, 9); if (VAR_7 == 9) { int VAR_8 = get_bits(gb, 3); if (VAR_8 > 0) { if (VAR_8 == 7) { VAR_8 += get_bits(gb, 5); if (VAR_8 > 29)
return AVERROR_INVALIDDATA; } VAR_7 = get_bits_long(gb, VAR_8) + 1; VAR_6    += VAR_4.VAR_7 * VAR_7; } VAR_6 += VAR_4.bias; } else VAR_6 += VAR_4.VAR_7 * VAR_7 - VAR_4.escape; } else VAR_6 -= VAR_4.escape; } VAR_2[VAR_5] = (VAR_6 >> 1) ^ -(VAR_6 & 1); } return 0; }