static int decode_plane(UtvideoContext *c, int plane_no,

                        uint8_t *dst, int step, int stride,

                        int width, int height,

                        const uint8_t *src, int src_size, int use_pred)

{

    int i, j, slice, pix;

    int sstart, send;

    VLC vlc;

    GetBitContext gb;

    int prev;

    const int cmask = ~(!plane_no && c->avctx->pix_fmt == PIX_FMT_YUV420P);



    if (build_huff(src, &vlc)) {

        av_log(c->avctx, AV_LOG_ERROR, "Cannot build Huffman codes\n");

        return AVERROR_INVALIDDATA;

    }



    src      += 256;

    src_size -= 256;



    send = 0;

    for (slice = 0; slice < c->slices; slice++) {

        uint8_t *dest;

        int slice_data_start, slice_data_end, slice_size;



        sstart = send;

        send   = (height * (slice + 1) / c->slices) & cmask;

        dest   = dst + sstart * stride;



        // slice offset and size validation was done earlier

        slice_data_start = slice ? AV_RL32(src + slice * 4 - 4) : 0;

        slice_data_end   = AV_RL32(src + slice * 4);

        slice_size       = slice_data_end - slice_data_start;



        if (!slice_size) {

            for (j = sstart; j < send; j++) {

                for (i = 0; i < width * step; i += step)

                    dest[i] = 0x80;

                dest += stride;

            }

            continue;

        }



        memcpy(c->slice_bits, src + slice_data_start + c->slices * 4, slice_size);

        memset(c->slice_bits + slice_size, 0, FF_INPUT_BUFFER_PADDING_SIZE);

        c->dsp.bswap_buf((uint32_t*)c->slice_bits, (uint32_t*)c->slice_bits,

                         (slice_data_end - slice_data_start + 3) >> 2);

        init_get_bits(&gb, c->slice_bits, slice_size * 8);



        prev = 0x80;

        for (j = sstart; j < send; j++) {

            for (i = 0; i < width * step; i += step) {

                if (get_bits_left(&gb) <= 0) {

                    av_log(c->avctx, AV_LOG_ERROR, "Slice decoding ran out of bits\n");

                    goto fail;

                }

                pix = get_vlc2(&gb, vlc.table, vlc.bits, 4);

                if (pix < 0) {

                    av_log(c->avctx, AV_LOG_ERROR, "Decoding error\n");

                    goto fail;

                }

                if (use_pred) {

                    prev += pix;

                    pix   = prev;

                }

                dest[i] = pix;

            }

            dest += stride;

        }

        if (get_bits_left(&gb) > 32)

            av_log(c->avctx, AV_LOG_WARNING, "%d bits left after decoding slice\n",

                   get_bits_left(&gb));

    }



    free_vlc(&vlc);



    return 0;

fail:

    free_vlc(&vlc);

    return AVERROR_INVALIDDATA;

}

static int decode_plane(UtvideoContext *c, int plane_no,

                        uint8_t *dst, int step, int stride,

                        int width, int height,

                        const uint8_t *src, int src_size, int use_pred)

{

    int i, j, slice, pix;

    int sstart, send;

    VLC vlc;

    GetBitContext gb;

    int prev;

    const int cmask = ~(!plane_no && c->avctx->pix_fmt == PIX_FMT_YUV420P);



    if (build_huff(src, &vlc)) {

        av_log(c->avctx, AV_LOG_ERROR, "Cannot build Huffman codes\n");

        return AVERROR_INVALIDDATA;

    }



    src      += 256;

    src_size -= 256;



    send = 0;

    for (slice = 0; slice < c->slices; slice++) {

        uint8_t *dest;

        int slice_data_start, slice_data_end, slice_size;



        sstart = send;

        send   = (height * (slice + 1) / c->slices) & cmask;

        dest   = dst + sstart * stride;



        

        slice_data_start = slice ? AV_RL32(src + slice * 4 - 4) : 0;

        slice_data_end   = AV_RL32(src + slice * 4);

        slice_size       = slice_data_end - slice_data_start;



        if (!slice_size) {

            for (j = sstart; j < send; j++) {

                for (i = 0; i < width * step; i += step)

                    dest[i] = 0x80;

                dest += stride;

            }

            continue;

        }



        memcpy(c->slice_bits, src + slice_data_start + c->slices * 4, slice_size);

        memset(c->slice_bits + slice_size, 0, FF_INPUT_BUFFER_PADDING_SIZE);

        c->dsp.bswap_buf((uint32_t*)c->slice_bits, (uint32_t*)c->slice_bits,

                         (slice_data_end - slice_data_start + 3) >> 2);

        init_get_bits(&gb, c->slice_bits, slice_size * 8);



        prev = 0x80;

        for (j = sstart; j < send; j++) {

            for (i = 0; i < width * step; i += step) {

                if (get_bits_left(&gb) <= 0) {

                    av_log(c->avctx, AV_LOG_ERROR, "Slice decoding ran out of bits\n");

                    goto fail;

                }

                pix = get_vlc2(&gb, vlc.table, vlc.bits, 4);

                if (pix < 0) {

                    av_log(c->avctx, AV_LOG_ERROR, "Decoding error\n");

                    goto fail;

                }

                if (use_pred) {

                    prev += pix;

                    pix   = prev;

                }

                dest[i] = pix;

            }

            dest += stride;

        }

        if (get_bits_left(&gb) > 32)

            av_log(c->avctx, AV_LOG_WARNING, "%d bits left after decoding slice\n",

                   get_bits_left(&gb));

    }



    free_vlc(&vlc);



    return 0;

fail:

    free_vlc(&vlc);

    return AVERROR_INVALIDDATA;

}

static int FUNC_0(UtvideoContext *VAR_0, int VAR_1,

                        uint8_t *VAR_2, int VAR_3, int VAR_4,

                        int VAR_5, int VAR_6,

                        const uint8_t *VAR_7, int VAR_8, int VAR_9)

{

    int VAR_10, VAR_11, VAR_12, VAR_13;

    int VAR_14, VAR_15;

    VLC vlc;

    GetBitContext gb;

    int VAR_16;

    const int VAR_17 = ~(!VAR_1 && VAR_0->avctx->pix_fmt == PIX_FMT_YUV420P);



    if (build_huff(VAR_7, &vlc)) {

        av_log(VAR_0->avctx, AV_LOG_ERROR, "Cannot build Huffman codes\n");

        return AVERROR_INVALIDDATA;

    }



    VAR_7      += 256;

    VAR_8 -= 256;



    VAR_15 = 0;

    for (VAR_12 = 0; VAR_12 < VAR_0->slices; VAR_12++) {

        uint8_t *dest;

        int slice_data_start, slice_data_end, slice_size;



        VAR_14 = VAR_15;

        VAR_15   = (VAR_6 * (VAR_12 + 1) / VAR_0->slices) & VAR_17;

        dest   = VAR_2 + VAR_14 * VAR_4;



        

        slice_data_start = VAR_12 ? AV_RL32(VAR_7 + VAR_12 * 4 - 4) : 0;

        slice_data_end   = AV_RL32(VAR_7 + VAR_12 * 4);

        slice_size       = slice_data_end - slice_data_start;



        if (!slice_size) {

            for (VAR_11 = VAR_14; VAR_11 < VAR_15; VAR_11++) {

                for (VAR_10 = 0; VAR_10 < VAR_5 * VAR_3; VAR_10 += VAR_3)

                    dest[VAR_10] = 0x80;

                dest += VAR_4;

            }

            continue;

        }



        memcpy(VAR_0->slice_bits, VAR_7 + slice_data_start + VAR_0->slices * 4, slice_size);

        memset(VAR_0->slice_bits + slice_size, 0, FF_INPUT_BUFFER_PADDING_SIZE);

        VAR_0->dsp.bswap_buf((uint32_t*)VAR_0->slice_bits, (uint32_t*)VAR_0->slice_bits,

                         (slice_data_end - slice_data_start + 3) >> 2);

        init_get_bits(&gb, VAR_0->slice_bits, slice_size * 8);



        VAR_16 = 0x80;

        for (VAR_11 = VAR_14; VAR_11 < VAR_15; VAR_11++) {

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

                if (get_bits_left(&gb) <= 0) {

                    av_log(VAR_0->avctx, AV_LOG_ERROR, "Slice decoding ran out of bits\n");

                    goto fail;

                }

                VAR_13 = get_vlc2(&gb, vlc.table, vlc.bits, 4);

                if (VAR_13 < 0) {

                    av_log(VAR_0->avctx, AV_LOG_ERROR, "Decoding error\n");

                    goto fail;

                }

                if (VAR_9) {

                    VAR_16 += VAR_13;

                    VAR_13   = VAR_16;

                }

                dest[VAR_10] = VAR_13;

            }

            dest += VAR_4;

        }

        if (get_bits_left(&gb) > 32)

            av_log(VAR_0->avctx, AV_LOG_WARNING, "%d bits left after decoding VAR_12\n",

                   get_bits_left(&gb));

    }



    free_vlc(&vlc);



    return 0;

fail:

    free_vlc(&vlc);

    return AVERROR_INVALIDDATA;

}

static int FUNC_0(UtvideoContext *VAR_0, int VAR_1,
uint8_t *VAR_2, int VAR_3, int VAR_4,
int VAR_5, int VAR_6,
const uint8_t *VAR_7, int VAR_8, int VAR_9)
{ int VAR_10, VAR_11, VAR_12, VAR_13; int VAR_14, VAR_15; VLC vlc; GetBitContext gb; int VAR_16; const int VAR_17 = ~(!VAR_1 && VAR_0->avctx->pix_fmt == PIX_FMT_YUV420P); if (build_huff(VAR_7, &vlc)) { av_log(VAR_0->avctx, AV_LOG_ERROR, "Cannot build Huffman codes\n"); return AVERROR_INVALIDDATA; } VAR_7      += 256; VAR_8 -= 256; VAR_15 = 0; for (VAR_12 = 0; VAR_12 < VAR_0->slices; VAR_12++) { uint8_t *dest; int slice_data_start, slice_data_end, slice_size; VAR_14 = VAR_15; VAR_15   = (VAR_6 * (VAR_12 + 1) / VAR_0->slices) & VAR_17; dest   = VAR_2 + VAR_14 * VAR_4; slice_data_start = VAR_12 ? AV_RL32(VAR_7 + VAR_12 * 4 - 4) : 0; slice_data_end   = AV_RL32(VAR_7 + VAR_12 * 4); slice_size       = slice_data_end - slice_data_start; if (!slice_size) { for (VAR_11 = VAR_14; VAR_11 < VAR_15; VAR_11++) { for (VAR_10 = 0; VAR_10 < VAR_5 * VAR_3; VAR_10 += VAR_3) dest[VAR_10] = 0x80; dest += VAR_4; } continue; } memcpy(VAR_0->slice_bits, VAR_7 + slice_data_start + VAR_0->slices * 4, slice_size); memset(VAR_0->slice_bits + slice_size, 0, FF_INPUT_BUFFER_PADDING_SIZE); VAR_0->dsp.bswap_buf((uint32_t*)VAR_0->slice_bits, (uint32_t*)VAR_0->slice_bits,
(slice_data_end - slice_data_start + 3) >> 2); init_get_bits(&gb, VAR_0->slice_bits, slice_size * 8); VAR_16 = 0x80; for (VAR_11 = VAR_14; VAR_11 < VAR_15; VAR_11++) { for (VAR_10 = 0; VAR_10 < VAR_5 * VAR_3; VAR_10 += VAR_3) { if (get_bits_left(&gb) <= 0) { av_log(VAR_0->avctx, AV_LOG_ERROR, "Slice decoding ran out of bits\n"); goto fail; } VAR_13 = get_vlc2(&gb, vlc.table, vlc.bits, 4); if (VAR_13 < 0) { av_log(VAR_0->avctx, AV_LOG_ERROR, "Decoding error\n"); goto fail; } if (VAR_9) { VAR_16 += VAR_13; VAR_13   = VAR_16; } dest[VAR_10] = VAR_13; } dest += VAR_4; } if (get_bits_left(&gb) > 32)
av_log(VAR_0->avctx, AV_LOG_WARNING, "%d bits left after decoding VAR_12\n",
get_bits_left(&gb)); } free_vlc(&vlc); return 0; fail:
free_vlc(&vlc); return AVERROR_INVALIDDATA; }