static int decode_plane10(UtvideoContext *c, int plane_no,

                          uint16_t *dst, int step, ptrdiff_t stride,

                          int width, int height,

                          const uint8_t *src, const uint8_t *huff,

                          int use_pred)

{

    int i, j, slice, pix, ret;

    int sstart, send;

    VLC vlc;

    GetBitContext gb;

    int prev, fsym;



    if ((ret = build_huff10(huff, &vlc, &fsym)) < 0) {

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

        return ret;

    }

    if (fsym >= 0) { // build_huff reported a symbol to fill slices with

        send = 0;

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

            uint16_t *dest;



            sstart = send;

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

            dest   = dst + sstart * stride;



            prev = 0x200;

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

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

                    pix = fsym;

                    if (use_pred) {

                        prev += pix;

                        prev &= 0x3FF;

                        pix   = prev;

                    }

                    dest[i] = pix;

                }

                dest += stride;

            }

        }

        return 0;

    }



    send = 0;

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

        uint16_t *dest;

        int slice_data_start, slice_data_end, slice_size;



        sstart = send;

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

        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) {

            av_log(c->avctx, AV_LOG_ERROR, "Plane has more than one symbol "

                   "yet a slice has a length of zero.\n");

            goto fail;

        }



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

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

                          (uint32_t *)(src + slice_data_start + c->slices * 4),

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

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



        prev = 0x200;

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

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

                pix = get_vlc2(&gb, vlc.table, VLC_BITS, 3);

                if (pix < 0) {

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

                    goto fail;

                }

                if (use_pred) {

                    prev += pix;

                    prev &= 0x3FF;

                    pix   = prev;

                }

                dest[i] = pix;

            }

            dest += stride;

            if (get_bits_left(&gb) < 0) {

                av_log(c->avctx, AV_LOG_ERROR,

                        "Slice decoding ran out of bits\n");

                goto fail;

            }

        }

        if (get_bits_left(&gb) > 32)

            av_log(c->avctx, AV_LOG_WARNING,

                   "%d bits left after decoding slice\n", get_bits_left(&gb));

    }



    ff_free_vlc(&vlc);



    return 0;

fail:

    ff_free_vlc(&vlc);

    return AVERROR_INVALIDDATA;

}

static int decode_plane10(UtvideoContext *c, int plane_no,

                          uint16_t *dst, int step, ptrdiff_t stride,

                          int width, int height,

                          const uint8_t *src, const uint8_t *huff,

                          int use_pred)

{

    int i, j, slice, pix, ret;

    int sstart, send;

    VLC vlc;

    GetBitContext gb;

    int prev, fsym;



    if ((ret = build_huff10(huff, &vlc, &fsym)) < 0) {

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

        return ret;

    }

    if (fsym >= 0) { 

        send = 0;

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

            uint16_t *dest;



            sstart = send;

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

            dest   = dst + sstart * stride;



            prev = 0x200;

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

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

                    pix = fsym;

                    if (use_pred) {

                        prev += pix;

                        prev &= 0x3FF;

                        pix   = prev;

                    }

                    dest[i] = pix;

                }

                dest += stride;

            }

        }

        return 0;

    }



    send = 0;

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

        uint16_t *dest;

        int slice_data_start, slice_data_end, slice_size;



        sstart = send;

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

        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) {

            av_log(c->avctx, AV_LOG_ERROR, "Plane has more than one symbol "

                   "yet a slice has a length of zero.\n");

            goto fail;

        }



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

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

                          (uint32_t *)(src + slice_data_start + c->slices * 4),

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

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



        prev = 0x200;

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

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

                pix = get_vlc2(&gb, vlc.table, VLC_BITS, 3);

                if (pix < 0) {

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

                    goto fail;

                }

                if (use_pred) {

                    prev += pix;

                    prev &= 0x3FF;

                    pix   = prev;

                }

                dest[i] = pix;

            }

            dest += stride;

            if (get_bits_left(&gb) < 0) {

                av_log(c->avctx, AV_LOG_ERROR,

                        "Slice decoding ran out of bits\n");

                goto fail;

            }

        }

        if (get_bits_left(&gb) > 32)

            av_log(c->avctx, AV_LOG_WARNING,

                   "%d bits left after decoding slice\n", get_bits_left(&gb));

    }



    ff_free_vlc(&vlc);



    return 0;

fail:

    ff_free_vlc(&vlc);

    return AVERROR_INVALIDDATA;

}

static int FUNC_0(UtvideoContext *VAR_0, int VAR_1,

                          uint16_t *VAR_2, int VAR_3, ptrdiff_t VAR_4,

                          int VAR_5, int VAR_6,

                          const uint8_t *VAR_7, const uint8_t *VAR_8,

                          int VAR_9)

{

    int VAR_10, VAR_11, VAR_12, VAR_13, VAR_14;

    int VAR_15, VAR_16;

    VLC vlc;

    GetBitContext gb;

    int VAR_17, VAR_18;



    if ((VAR_14 = build_huff10(VAR_8, &vlc, &VAR_18)) < 0) {

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

        return VAR_14;

    }

    if (VAR_18 >= 0) { 

        VAR_16 = 0;

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

            uint16_t *dest;



            VAR_15 = VAR_16;

            VAR_16   = (VAR_6 * (VAR_12 + 1) / VAR_0->slices);

            dest   = VAR_2 + VAR_15 * VAR_4;



            VAR_17 = 0x200;

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

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

                    VAR_13 = VAR_18;

                    if (VAR_9) {

                        VAR_17 += VAR_13;

                        VAR_17 &= 0x3FF;

                        VAR_13   = VAR_17;

                    }

                    dest[VAR_10] = VAR_13;

                }

                dest += VAR_4;

            }

        }

        return 0;

    }



    VAR_16 = 0;

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

        uint16_t *dest;

        int slice_data_start, slice_data_end, slice_size;



        VAR_15 = VAR_16;

        VAR_16   = (VAR_6 * (VAR_12 + 1) / VAR_0->slices);

        dest   = VAR_2 + VAR_15 * 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) {

            av_log(VAR_0->avctx, AV_LOG_ERROR, "Plane has more than one symbol "

                   "yet a VAR_12 has a length of zero.\n");

            goto fail;

        }



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

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

                          (uint32_t *)(VAR_7 + slice_data_start + VAR_0->slices * 4),

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

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



        VAR_17 = 0x200;

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

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

                VAR_13 = get_vlc2(&gb, vlc.table, VLC_BITS, 3);

                if (VAR_13 < 0) {

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

                    goto fail;

                }

                if (VAR_9) {

                    VAR_17 += VAR_13;

                    VAR_17 &= 0x3FF;

                    VAR_13   = VAR_17;

                }

                dest[VAR_10] = VAR_13;

            }

            dest += VAR_4;

            if (get_bits_left(&gb) < 0) {

                av_log(VAR_0->avctx, AV_LOG_ERROR,

                        "Slice decoding ran out of bits\n");

                goto fail;

            }

        }

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

    }



    ff_free_vlc(&vlc);



    return 0;

fail:

    ff_free_vlc(&vlc);

    return AVERROR_INVALIDDATA;

}

static int FUNC_0(UtvideoContext *VAR_0, int VAR_1,
uint16_t *VAR_2, int VAR_3, ptrdiff_t VAR_4,
int VAR_5, int VAR_6,
const uint8_t *VAR_7, const uint8_t *VAR_8,
int VAR_9)
{ int VAR_10, VAR_11, VAR_12, VAR_13, VAR_14; int VAR_15, VAR_16; VLC vlc; GetBitContext gb; int VAR_17, VAR_18; if ((VAR_14 = build_huff10(VAR_8, &vlc, &VAR_18)) < 0) { av_log(VAR_0->avctx, AV_LOG_ERROR, "Cannot build Huffman codes\n"); return VAR_14; } if (VAR_18 >= 0) { VAR_16 = 0; for (VAR_12 = 0; VAR_12 < VAR_0->slices; VAR_12++) { uint16_t *dest; VAR_15 = VAR_16; VAR_16   = (VAR_6 * (VAR_12 + 1) / VAR_0->slices); dest   = VAR_2 + VAR_15 * VAR_4; VAR_17 = 0x200; for (VAR_11 = VAR_15; VAR_11 < VAR_16; VAR_11++) { for (VAR_10 = 0; VAR_10 < VAR_5 * VAR_3; VAR_10 += VAR_3) { VAR_13 = VAR_18; if (VAR_9) { VAR_17 += VAR_13; VAR_17 &= 0x3FF; VAR_13   = VAR_17; } dest[VAR_10] = VAR_13; } dest += VAR_4; } } return 0; } VAR_16 = 0; for (VAR_12 = 0; VAR_12 < VAR_0->slices; VAR_12++) { uint16_t *dest; int slice_data_start, slice_data_end, slice_size; VAR_15 = VAR_16; VAR_16   = (VAR_6 * (VAR_12 + 1) / VAR_0->slices); dest   = VAR_2 + VAR_15 * 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) { av_log(VAR_0->avctx, AV_LOG_ERROR, "Plane has more than one symbol "
"yet a VAR_12 has a length of zero.\n"); goto fail; } memset(VAR_0->slice_bits + slice_size, 0, AV_INPUT_BUFFER_PADDING_SIZE); VAR_0->bdsp.bswap_buf((uint32_t *) VAR_0->slice_bits,
(uint32_t *)(VAR_7 + slice_data_start + VAR_0->slices * 4),
(slice_data_end - slice_data_start + 3) >> 2); init_get_bits(&gb, VAR_0->slice_bits, slice_size * 8); VAR_17 = 0x200; for (VAR_11 = VAR_15; VAR_11 < VAR_16; VAR_11++) { for (VAR_10 = 0; VAR_10 < VAR_5 * VAR_3; VAR_10 += VAR_3) { VAR_13 = get_vlc2(&gb, vlc.table, VLC_BITS, 3); if (VAR_13 < 0) { av_log(VAR_0->avctx, AV_LOG_ERROR, "Decoding error\n"); goto fail; } if (VAR_9) { VAR_17 += VAR_13; VAR_17 &= 0x3FF; VAR_13   = VAR_17; } dest[VAR_10] = VAR_13; } dest += VAR_4; if (get_bits_left(&gb) < 0) { av_log(VAR_0->avctx, AV_LOG_ERROR,
"Slice decoding ran out of bits\n"); goto fail; } } 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)); } ff_free_vlc(&vlc); return 0; fail:
ff_free_vlc(&vlc); return AVERROR_INVALIDDATA; }