static int msrle_decode_pal4(AVCodecContext *avctx, AVFrame *pic,

                             GetByteContext *gb)

{

    unsigned char rle_code;

    unsigned char extra_byte, odd_pixel;

    unsigned char stream_byte;

    int pixel_ptr = 0;

    int line = avctx->height - 1;

    int i;



    while (line >= 0 && pixel_ptr <= avctx->width) {

        if (bytestream2_get_bytes_left(gb) <= 0) {

            av_log(avctx, AV_LOG_ERROR,

                   "MS RLE: bytestream overrun, %dx%d left\n",

                   avctx->width - pixel_ptr, line);

            return AVERROR_INVALIDDATA;

        }

        rle_code = stream_byte = bytestream2_get_byteu(gb);

        if (rle_code == 0) {

            /* fetch the next byte to see how to handle escape code */

            stream_byte = bytestream2_get_byte(gb);

            if (stream_byte == 0) {

                /* line is done, goto the next one */

                line--;

                pixel_ptr = 0;

            } else if (stream_byte == 1) {

                /* decode is done */

                return 0;

            } else if (stream_byte == 2) {

                /* reposition frame decode coordinates */

                stream_byte = bytestream2_get_byte(gb);

                pixel_ptr += stream_byte;

                stream_byte = bytestream2_get_byte(gb);

                avpriv_request_sample(avctx, "Unused stream byte %X", stream_byte);

            } else {

                // copy pixels from encoded stream

                odd_pixel =  stream_byte & 1;

                rle_code = (stream_byte + 1) / 2;

                extra_byte = rle_code & 0x01;

                if (pixel_ptr + 2*rle_code - odd_pixel > avctx->width ||

                    bytestream2_get_bytes_left(gb) < rle_code) {

                    av_log(avctx, AV_LOG_ERROR,

                           "MS RLE: frame/stream ptr just went out of bounds (copy)\n");

                    return AVERROR_INVALIDDATA;

                }



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

                    if (pixel_ptr >= avctx->width)

                        break;

                    stream_byte = bytestream2_get_byteu(gb);

                    pic->data[0][line * pic->linesize[0] + pixel_ptr] = stream_byte >> 4;

                    pixel_ptr++;

                    if (i + 1 == rle_code && odd_pixel)

                        break;

                    if (pixel_ptr >= avctx->width)

                        break;

                    pic->data[0][line * pic->linesize[0] + pixel_ptr] = stream_byte & 0x0F;

                    pixel_ptr++;

                }



                // if the RLE code is odd, skip a byte in the stream

                if (extra_byte)

                    bytestream2_skip(gb, 1);

            }

        } else {

            // decode a run of data

            if (pixel_ptr + rle_code > avctx->width + 1) {

                av_log(avctx, AV_LOG_ERROR,

                       "MS RLE: frame ptr just went out of bounds (run) %d %d %d\n", pixel_ptr, rle_code, avctx->width);

                return AVERROR_INVALIDDATA;

            }

            stream_byte = bytestream2_get_byte(gb);

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

                if (pixel_ptr >= avctx->width)

                    break;

                if ((i & 1) == 0)

                    pic->data[0][line * pic->linesize[0] + pixel_ptr] = stream_byte >> 4;

                else

                    pic->data[0][line * pic->linesize[0] + pixel_ptr] = stream_byte & 0x0F;

                pixel_ptr++;

            }

        }

    }



    /* one last sanity check on the way out */

    if (bytestream2_get_bytes_left(gb)) {

        av_log(avctx, AV_LOG_ERROR,

               "MS RLE: ended frame decode with %d bytes left over\n",

               bytestream2_get_bytes_left(gb));

        return AVERROR_INVALIDDATA;

    }



    return 0;

}

static int msrle_decode_pal4(AVCodecContext *avctx, AVFrame *pic,

                             GetByteContext *gb)

{

    unsigned char rle_code;

    unsigned char extra_byte, odd_pixel;

    unsigned char stream_byte;

    int pixel_ptr = 0;

    int line = avctx->height - 1;

    int i;



    while (line >= 0 && pixel_ptr <= avctx->width) {

        if (bytestream2_get_bytes_left(gb) <= 0) {

            av_log(avctx, AV_LOG_ERROR,

                   "MS RLE: bytestream overrun, %dx%d left\n",

                   avctx->width - pixel_ptr, line);

            return AVERROR_INVALIDDATA;

        }

        rle_code = stream_byte = bytestream2_get_byteu(gb);

        if (rle_code == 0) {

            

            stream_byte = bytestream2_get_byte(gb);

            if (stream_byte == 0) {

                

                line--;

                pixel_ptr = 0;

            } else if (stream_byte == 1) {

                

                return 0;

            } else if (stream_byte == 2) {

                

                stream_byte = bytestream2_get_byte(gb);

                pixel_ptr += stream_byte;

                stream_byte = bytestream2_get_byte(gb);

                avpriv_request_sample(avctx, "Unused stream byte %X", stream_byte);

            } else {

                

                odd_pixel =  stream_byte & 1;

                rle_code = (stream_byte + 1) / 2;

                extra_byte = rle_code & 0x01;

                if (pixel_ptr + 2*rle_code - odd_pixel > avctx->width ||

                    bytestream2_get_bytes_left(gb) < rle_code) {

                    av_log(avctx, AV_LOG_ERROR,

                           "MS RLE: frame/stream ptr just went out of bounds (copy)\n");

                    return AVERROR_INVALIDDATA;

                }



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

                    if (pixel_ptr >= avctx->width)

                        break;

                    stream_byte = bytestream2_get_byteu(gb);

                    pic->data[0][line * pic->linesize[0] + pixel_ptr] = stream_byte >> 4;

                    pixel_ptr++;

                    if (i + 1 == rle_code && odd_pixel)

                        break;

                    if (pixel_ptr >= avctx->width)

                        break;

                    pic->data[0][line * pic->linesize[0] + pixel_ptr] = stream_byte & 0x0F;

                    pixel_ptr++;

                }



                

                if (extra_byte)

                    bytestream2_skip(gb, 1);

            }

        } else {

            

            if (pixel_ptr + rle_code > avctx->width + 1) {

                av_log(avctx, AV_LOG_ERROR,

                       "MS RLE: frame ptr just went out of bounds (run) %d %d %d\n", pixel_ptr, rle_code, avctx->width);

                return AVERROR_INVALIDDATA;

            }

            stream_byte = bytestream2_get_byte(gb);

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

                if (pixel_ptr >= avctx->width)

                    break;

                if ((i & 1) == 0)

                    pic->data[0][line * pic->linesize[0] + pixel_ptr] = stream_byte >> 4;

                else

                    pic->data[0][line * pic->linesize[0] + pixel_ptr] = stream_byte & 0x0F;

                pixel_ptr++;

            }

        }

    }



    

    if (bytestream2_get_bytes_left(gb)) {

        av_log(avctx, AV_LOG_ERROR,

               "MS RLE: ended frame decode with %d bytes left over\n",

               bytestream2_get_bytes_left(gb));

        return AVERROR_INVALIDDATA;

    }



    return 0;

}

static int FUNC_0(AVCodecContext *VAR_0, AVFrame *VAR_1,

                             GetByteContext *VAR_2)

{

    unsigned char VAR_3;

    unsigned char VAR_4, VAR_5;

    unsigned char VAR_6;

    int VAR_7 = 0;

    int VAR_8 = VAR_0->height - 1;

    int VAR_9;



    while (VAR_8 >= 0 && VAR_7 <= VAR_0->width) {

        if (bytestream2_get_bytes_left(VAR_2) <= 0) {

            av_log(VAR_0, AV_LOG_ERROR,

                   "MS RLE: bytestream overrun, %dx%d left\n",

                   VAR_0->width - VAR_7, VAR_8);

            return AVERROR_INVALIDDATA;

        }

        VAR_3 = VAR_6 = bytestream2_get_byteu(VAR_2);

        if (VAR_3 == 0) {

            

            VAR_6 = bytestream2_get_byte(VAR_2);

            if (VAR_6 == 0) {

                

                VAR_8--;

                VAR_7 = 0;

            } else if (VAR_6 == 1) {

                

                return 0;

            } else if (VAR_6 == 2) {

                

                VAR_6 = bytestream2_get_byte(VAR_2);

                VAR_7 += VAR_6;

                VAR_6 = bytestream2_get_byte(VAR_2);

                avpriv_request_sample(VAR_0, "Unused stream byte %X", VAR_6);

            } else {

                

                VAR_5 =  VAR_6 & 1;

                VAR_3 = (VAR_6 + 1) / 2;

                VAR_4 = VAR_3 & 0x01;

                if (VAR_7 + 2*VAR_3 - VAR_5 > VAR_0->width ||

                    bytestream2_get_bytes_left(VAR_2) < VAR_3) {

                    av_log(VAR_0, AV_LOG_ERROR,

                           "MS RLE: frame/stream ptr just went out of bounds (copy)\n");

                    return AVERROR_INVALIDDATA;

                }



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

                    if (VAR_7 >= VAR_0->width)

                        break;

                    VAR_6 = bytestream2_get_byteu(VAR_2);

                    VAR_1->data[0][VAR_8 * VAR_1->linesize[0] + VAR_7] = VAR_6 >> 4;

                    VAR_7++;

                    if (VAR_9 + 1 == VAR_3 && VAR_5)

                        break;

                    if (VAR_7 >= VAR_0->width)

                        break;

                    VAR_1->data[0][VAR_8 * VAR_1->linesize[0] + VAR_7] = VAR_6 & 0x0F;

                    VAR_7++;

                }



                

                if (VAR_4)

                    bytestream2_skip(VAR_2, 1);

            }

        } else {

            

            if (VAR_7 + VAR_3 > VAR_0->width + 1) {

                av_log(VAR_0, AV_LOG_ERROR,

                       "MS RLE: frame ptr just went out of bounds (run) %d %d %d\n", VAR_7, VAR_3, VAR_0->width);

                return AVERROR_INVALIDDATA;

            }

            VAR_6 = bytestream2_get_byte(VAR_2);

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

                if (VAR_7 >= VAR_0->width)

                    break;

                if ((VAR_9 & 1) == 0)

                    VAR_1->data[0][VAR_8 * VAR_1->linesize[0] + VAR_7] = VAR_6 >> 4;

                else

                    VAR_1->data[0][VAR_8 * VAR_1->linesize[0] + VAR_7] = VAR_6 & 0x0F;

                VAR_7++;

            }

        }

    }



    

    if (bytestream2_get_bytes_left(VAR_2)) {

        av_log(VAR_0, AV_LOG_ERROR,

               "MS RLE: ended frame decode with %d bytes left over\n",

               bytestream2_get_bytes_left(VAR_2));

        return AVERROR_INVALIDDATA;

    }



    return 0;

}

static int FUNC_0(AVCodecContext *VAR_0, AVFrame *VAR_1,
GetByteContext *VAR_2)
{ unsigned char VAR_3; unsigned char VAR_4, VAR_5; unsigned char VAR_6; int VAR_7 = 0; int VAR_8 = VAR_0->height - 1; int VAR_9; while (VAR_8 >= 0 && VAR_7 <= VAR_0->width) { if (bytestream2_get_bytes_left(VAR_2) <= 0) { av_log(VAR_0, AV_LOG_ERROR,
"MS RLE: bytestream overrun, %dx%d left\n",
VAR_0->width - VAR_7, VAR_8); return AVERROR_INVALIDDATA; } VAR_3 = VAR_6 = bytestream2_get_byteu(VAR_2); if (VAR_3 == 0) { VAR_6 = bytestream2_get_byte(VAR_2); if (VAR_6 == 0) { VAR_8--; VAR_7 = 0; } else if (VAR_6 == 1) { return 0; } else if (VAR_6 == 2) { VAR_6 = bytestream2_get_byte(VAR_2); VAR_7 += VAR_6; VAR_6 = bytestream2_get_byte(VAR_2); avpriv_request_sample(VAR_0, "Unused stream byte %X", VAR_6); } else { VAR_5 =  VAR_6 & 1; VAR_3 = (VAR_6 + 1) / 2; VAR_4 = VAR_3 & 0x01; if (VAR_7 + 2*VAR_3 - VAR_5 > VAR_0->width ||
bytestream2_get_bytes_left(VAR_2) < VAR_3) { av_log(VAR_0, AV_LOG_ERROR,
"MS RLE: frame/stream ptr just went out of bounds (copy)\n"); return AVERROR_INVALIDDATA; } for (VAR_9 = 0; VAR_9 < VAR_3; VAR_9++) { if (VAR_7 >= VAR_0->width)
break; VAR_6 = bytestream2_get_byteu(VAR_2); VAR_1->data[0][VAR_8 * VAR_1->linesize[0] + VAR_7] = VAR_6 >> 4; VAR_7++; if (VAR_9 + 1 == VAR_3 && VAR_5)
break; if (VAR_7 >= VAR_0->width)
break; VAR_1->data[0][VAR_8 * VAR_1->linesize[0] + VAR_7] = VAR_6 & 0x0F; VAR_7++; } if (VAR_4)
bytestream2_skip(VAR_2, 1); } } else { if (VAR_7 + VAR_3 > VAR_0->width + 1) { av_log(VAR_0, AV_LOG_ERROR,
"MS RLE: frame ptr just went out of bounds (run) %d %d %d\n", VAR_7, VAR_3, VAR_0->width); return AVERROR_INVALIDDATA; } VAR_6 = bytestream2_get_byte(VAR_2); for (VAR_9 = 0; VAR_9 < VAR_3; VAR_9++) { if (VAR_7 >= VAR_0->width)
break; if ((VAR_9 & 1) == 0)
VAR_1->data[0][VAR_8 * VAR_1->linesize[0] + VAR_7] = VAR_6 >> 4; else
VAR_1->data[0][VAR_8 * VAR_1->linesize[0] + VAR_7] = VAR_6 & 0x0F; VAR_7++; } } } if (bytestream2_get_bytes_left(VAR_2)) { av_log(VAR_0, AV_LOG_ERROR,
"MS RLE: ended frame decode with %d bytes left over\n",
bytestream2_get_bytes_left(VAR_2)); return AVERROR_INVALIDDATA; } return 0; }