static int tscc2_decode_mb(TSCC2Context *c, int *q, int vlc_set,

                           uint8_t *dst, int stride, int plane)

{

    GetBitContext *gb = &c->gb;

    int prev_dc, dc, nc, ac, bpos, val;

    int i, j, k, l;



    if (get_bits1(gb)) {

        if (get_bits1(gb)) {

            val = get_bits(gb, 8);

            for (i = 0; i < 8; i++, dst += stride)

                memset(dst, val, 16);

        } else {

            if (get_bits_left(gb) < 16 * 8 * 8)

                return AVERROR_INVALIDDATA;

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

                for (j = 0; j < 16; j++)

                    dst[j] = get_bits(gb, 8);

                dst += stride;

            }

        }

        return 0;

    }



    prev_dc = 0;

    for (j = 0; j < 2; j++) {

        for (k = 0; k < 4; k++) {

            if (!(j | k)) {

                dc = get_bits(gb, 8);

            } else {

                dc = get_vlc2(gb, c->dc_vlc.table, 9, 2);

                if (dc == -1)

                    return AVERROR_INVALIDDATA;

                if (dc == 0x100)

                    dc = get_bits(gb, 8);

            }

            dc          = (dc + prev_dc) & 0xFF;

            prev_dc     = dc;

            c->block[0] = dc;



            nc = get_vlc2(gb, c->nc_vlc[vlc_set].table, 9, 1);

            if (nc == -1)

                return AVERROR_INVALIDDATA;



            bpos = 1;

            memset(c->block + 1, 0, 15 * sizeof(*c->block));

            for (l = 0; l < nc; l++) {

                ac = get_vlc2(gb, c->ac_vlc[vlc_set].table, 9, 2);

                if (ac == -1)

                    return AVERROR_INVALIDDATA;

                if (ac == 0x1000)

                    ac = get_bits(gb, 12);

                bpos += ac & 0xF;

                if (bpos >= 64)

                    return AVERROR_INVALIDDATA;

                val = sign_extend(ac >> 4, 8);

                c->block[tscc2_zigzag[bpos++]] = val;

            }

            tscc2_idct4_put(c->block, q, dst + k * 4, stride);

        }

        dst += 4 * stride;

    }

    return 0;

}

static int tscc2_decode_mb(TSCC2Context *c, int *q, int vlc_set,

                           uint8_t *dst, int stride, int plane)

{

    GetBitContext *gb = &c->gb;

    int prev_dc, dc, nc, ac, bpos, val;

    int i, j, k, l;



    if (get_bits1(gb)) {

        if (get_bits1(gb)) {

            val = get_bits(gb, 8);

            for (i = 0; i < 8; i++, dst += stride)

                memset(dst, val, 16);

        } else {

            if (get_bits_left(gb) < 16 * 8 * 8)

                return AVERROR_INVALIDDATA;

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

                for (j = 0; j < 16; j++)

                    dst[j] = get_bits(gb, 8);

                dst += stride;

            }

        }

        return 0;

    }



    prev_dc = 0;

    for (j = 0; j < 2; j++) {

        for (k = 0; k < 4; k++) {

            if (!(j | k)) {

                dc = get_bits(gb, 8);

            } else {

                dc = get_vlc2(gb, c->dc_vlc.table, 9, 2);

                if (dc == -1)

                    return AVERROR_INVALIDDATA;

                if (dc == 0x100)

                    dc = get_bits(gb, 8);

            }

            dc          = (dc + prev_dc) & 0xFF;

            prev_dc     = dc;

            c->block[0] = dc;



            nc = get_vlc2(gb, c->nc_vlc[vlc_set].table, 9, 1);

            if (nc == -1)

                return AVERROR_INVALIDDATA;



            bpos = 1;

            memset(c->block + 1, 0, 15 * sizeof(*c->block));

            for (l = 0; l < nc; l++) {

                ac = get_vlc2(gb, c->ac_vlc[vlc_set].table, 9, 2);

                if (ac == -1)

                    return AVERROR_INVALIDDATA;

                if (ac == 0x1000)

                    ac = get_bits(gb, 12);

                bpos += ac & 0xF;

                if (bpos >= 64)

                    return AVERROR_INVALIDDATA;

                val = sign_extend(ac >> 4, 8);

                c->block[tscc2_zigzag[bpos++]] = val;

            }

            tscc2_idct4_put(c->block, q, dst + k * 4, stride);

        }

        dst += 4 * stride;

    }

    return 0;

}

static int FUNC_0(TSCC2Context *VAR_0, int *VAR_1, int VAR_2,

                           uint8_t *VAR_3, int VAR_4, int VAR_5)

{

    GetBitContext *gb = &VAR_0->gb;

    int VAR_6, VAR_7, VAR_8, VAR_9, VAR_10, VAR_11;

    int VAR_12, VAR_13, VAR_14, VAR_15;



    if (get_bits1(gb)) {

        if (get_bits1(gb)) {

            VAR_11 = get_bits(gb, 8);

            for (VAR_12 = 0; VAR_12 < 8; VAR_12++, VAR_3 += VAR_4)

                memset(VAR_3, VAR_11, 16);

        } else {

            if (get_bits_left(gb) < 16 * 8 * 8)

                return AVERROR_INVALIDDATA;

            for (VAR_12 = 0; VAR_12 < 8; VAR_12++) {

                for (VAR_13 = 0; VAR_13 < 16; VAR_13++)

                    VAR_3[VAR_13] = get_bits(gb, 8);

                VAR_3 += VAR_4;

            }

        }

        return 0;

    }



    VAR_6 = 0;

    for (VAR_13 = 0; VAR_13 < 2; VAR_13++) {

        for (VAR_14 = 0; VAR_14 < 4; VAR_14++) {

            if (!(VAR_13 | VAR_14)) {

                VAR_7 = get_bits(gb, 8);

            } else {

                VAR_7 = get_vlc2(gb, VAR_0->dc_vlc.table, 9, 2);

                if (VAR_7 == -1)

                    return AVERROR_INVALIDDATA;

                if (VAR_7 == 0x100)

                    VAR_7 = get_bits(gb, 8);

            }

            VAR_7          = (VAR_7 + VAR_6) & 0xFF;

            VAR_6     = VAR_7;

            VAR_0->block[0] = VAR_7;



            VAR_8 = get_vlc2(gb, VAR_0->nc_vlc[VAR_2].table, 9, 1);

            if (VAR_8 == -1)

                return AVERROR_INVALIDDATA;



            VAR_10 = 1;

            memset(VAR_0->block + 1, 0, 15 * sizeof(*VAR_0->block));

            for (VAR_15 = 0; VAR_15 < VAR_8; VAR_15++) {

                VAR_9 = get_vlc2(gb, VAR_0->ac_vlc[VAR_2].table, 9, 2);

                if (VAR_9 == -1)

                    return AVERROR_INVALIDDATA;

                if (VAR_9 == 0x1000)

                    VAR_9 = get_bits(gb, 12);

                VAR_10 += VAR_9 & 0xF;

                if (VAR_10 >= 64)

                    return AVERROR_INVALIDDATA;

                VAR_11 = sign_extend(VAR_9 >> 4, 8);

                VAR_0->block[tscc2_zigzag[VAR_10++]] = VAR_11;

            }

            tscc2_idct4_put(VAR_0->block, VAR_1, VAR_3 + VAR_14 * 4, VAR_4);

        }

        VAR_3 += 4 * VAR_4;

    }

    return 0;

}

static int FUNC_0(TSCC2Context *VAR_0, int *VAR_1, int VAR_2,
uint8_t *VAR_3, int VAR_4, int VAR_5)
{ GetBitContext *gb = &VAR_0->gb; int VAR_6, VAR_7, VAR_8, VAR_9, VAR_10, VAR_11; int VAR_12, VAR_13, VAR_14, VAR_15; if (get_bits1(gb)) { if (get_bits1(gb)) { VAR_11 = get_bits(gb, 8); for (VAR_12 = 0; VAR_12 < 8; VAR_12++, VAR_3 += VAR_4) memset(VAR_3, VAR_11, 16); } else { if (get_bits_left(gb) < 16 * 8 * 8)
return AVERROR_INVALIDDATA; for (VAR_12 = 0; VAR_12 < 8; VAR_12++) { for (VAR_13 = 0; VAR_13 < 16; VAR_13++) VAR_3[VAR_13] = get_bits(gb, 8); VAR_3 += VAR_4; } } return 0; } VAR_6 = 0; for (VAR_13 = 0; VAR_13 < 2; VAR_13++) { for (VAR_14 = 0; VAR_14 < 4; VAR_14++) { if (!(VAR_13 | VAR_14)) { VAR_7 = get_bits(gb, 8); } else { VAR_7 = get_vlc2(gb, VAR_0->dc_vlc.table, 9, 2); if (VAR_7 == -1)
return AVERROR_INVALIDDATA; if (VAR_7 == 0x100)
VAR_7 = get_bits(gb, 8); } VAR_7          = (VAR_7 + VAR_6) & 0xFF; VAR_6     = VAR_7; VAR_0->block[0] = VAR_7; VAR_8 = get_vlc2(gb, VAR_0->nc_vlc[VAR_2].table, 9, 1); if (VAR_8 == -1)
return AVERROR_INVALIDDATA; VAR_10 = 1; memset(VAR_0->block + 1, 0, 15 * sizeof(*VAR_0->block)); for (VAR_15 = 0; VAR_15 < VAR_8; VAR_15++) { VAR_9 = get_vlc2(gb, VAR_0->ac_vlc[VAR_2].table, 9, 2); if (VAR_9 == -1)
return AVERROR_INVALIDDATA; if (VAR_9 == 0x1000)
VAR_9 = get_bits(gb, 12); VAR_10 += VAR_9 & 0xF; if (VAR_10 >= 64)
return AVERROR_INVALIDDATA; VAR_11 = sign_extend(VAR_9 >> 4, 8); VAR_0->block[tscc2_zigzag[VAR_10++]] = VAR_11; } tscc2_idct4_put(VAR_0->block, VAR_1, VAR_3 + VAR_14 * 4, VAR_4); } VAR_3 += 4 * VAR_4; } return 0; }