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

                             GetByteContext *gb)

{

    unsigned char rle_code;

    unsigned char extra_byte, odd_pixel;

    unsigned char stream_byte;

    unsigned int pixel_ptr = 0;

    int row_dec = pic->linesize[0];

    int row_ptr = (avctx->height - 1) * row_dec;

    int frame_size = row_dec * avctx->height;

    int i;



    while (row_ptr >= 0) {

        if (bytestream2_get_bytes_left(gb) <= 0) {

            av_log(avctx, AV_LOG_ERROR,

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

                   row_ptr);

            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 */

                row_ptr -= row_dec;

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

                row_ptr -= stream_byte * row_dec;

            } else {

                // copy pixels from encoded stream

                odd_pixel =  stream_byte & 1;

                rle_code = (stream_byte + 1) / 2;

                extra_byte = rle_code & 0x01;

                if (row_ptr + pixel_ptr + stream_byte > frame_size ||

                    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][row_ptr + pixel_ptr] = stream_byte >> 4;

                    pixel_ptr++;

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

                        break;

                    if (pixel_ptr >= avctx->width)

                        break;

                    pic->data[0][row_ptr + 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 (row_ptr + pixel_ptr + stream_byte > frame_size) {

                av_log(avctx, AV_LOG_ERROR,

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

                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][row_ptr + pixel_ptr] = stream_byte >> 4;

                else

                    pic->data[0][row_ptr + 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, AVPicture *pic,

                             GetByteContext *gb)

{

    unsigned char rle_code;

    unsigned char extra_byte, odd_pixel;

    unsigned char stream_byte;

    unsigned int pixel_ptr = 0;

    int row_dec = pic->linesize[0];

    int row_ptr = (avctx->height - 1) * row_dec;

    int frame_size = row_dec * avctx->height;

    int i;



    while (row_ptr >= 0) {

        if (bytestream2_get_bytes_left(gb) <= 0) {

            av_log(avctx, AV_LOG_ERROR,

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

                   row_ptr);

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

                

                row_ptr -= row_dec;

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

                row_ptr -= stream_byte * row_dec;

            } else {

                

                odd_pixel =  stream_byte & 1;

                rle_code = (stream_byte + 1) / 2;

                extra_byte = rle_code & 0x01;

                if (row_ptr + pixel_ptr + stream_byte > frame_size ||

                    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][row_ptr + pixel_ptr] = stream_byte >> 4;

                    pixel_ptr++;

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

                        break;

                    if (pixel_ptr >= avctx->width)

                        break;

                    pic->data[0][row_ptr + pixel_ptr] = stream_byte & 0x0F;

                    pixel_ptr++;

                }



                

                if (extra_byte)

                    bytestream2_skip(gb, 1);

            }

        } else {

            

            if (row_ptr + pixel_ptr + stream_byte > frame_size) {

                av_log(avctx, AV_LOG_ERROR,

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

                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][row_ptr + pixel_ptr] = stream_byte >> 4;

                else

                    pic->data[0][row_ptr + 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, AVPicture *VAR_1,

                             GetByteContext *VAR_2)

{

    unsigned char VAR_3;

    unsigned char VAR_4, VAR_5;

    unsigned char VAR_6;

    unsigned int VAR_7 = 0;

    int VAR_8 = VAR_1->linesize[0];

    int VAR_9 = (VAR_0->height - 1) * VAR_8;

    int VAR_10 = VAR_8 * VAR_0->height;

    int VAR_11;



    while (VAR_9 >= 0) {

        if (bytestream2_get_bytes_left(VAR_2) <= 0) {

            av_log(VAR_0, AV_LOG_ERROR,

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

                   VAR_9);

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

                VAR_9 -= VAR_6 * VAR_8;

            } else {

                

                VAR_5 =  VAR_6 & 1;

                VAR_3 = (VAR_6 + 1) / 2;

                VAR_4 = VAR_3 & 0x01;

                if (VAR_9 + VAR_7 + VAR_6 > VAR_10 ||

                    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_11 = 0; VAR_11 < VAR_3; VAR_11++) {

                    if (VAR_7 >= VAR_0->width)

                        break;

                    VAR_6 = bytestream2_get_byteu(VAR_2);

                    VAR_1->data[0][VAR_9 + VAR_7] = VAR_6 >> 4;

                    VAR_7++;

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

                        break;

                    if (VAR_7 >= VAR_0->width)

                        break;

                    VAR_1->data[0][VAR_9 + VAR_7] = VAR_6 & 0x0F;

                    VAR_7++;

                }



                

                if (VAR_4)

                    bytestream2_skip(VAR_2, 1);

            }

        } else {

            

            if (VAR_9 + VAR_7 + VAR_6 > VAR_10) {

                av_log(VAR_0, AV_LOG_ERROR,

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

                return AVERROR_INVALIDDATA;

            }

            VAR_6 = bytestream2_get_byte(VAR_2);

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

                if (VAR_7 >= VAR_0->width)

                    break;

                if ((VAR_11 & 1) == 0)

                    VAR_1->data[0][VAR_9 + VAR_7] = VAR_6 >> 4;

                else

                    VAR_1->data[0][VAR_9 + 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, AVPicture *VAR_1,
GetByteContext *VAR_2)
{ unsigned char VAR_3; unsigned char VAR_4, VAR_5; unsigned char VAR_6; unsigned int VAR_7 = 0; int VAR_8 = VAR_1->linesize[0]; int VAR_9 = (VAR_0->height - 1) * VAR_8; int VAR_10 = VAR_8 * VAR_0->height; int VAR_11; while (VAR_9 >= 0) { if (bytestream2_get_bytes_left(VAR_2) <= 0) { av_log(VAR_0, AV_LOG_ERROR,
"MS RLE: bytestream overrun, %d rows left\n",
VAR_9); 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_9 -= 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); VAR_9 -= VAR_6 * VAR_8; } else { VAR_5 =  VAR_6 & 1; VAR_3 = (VAR_6 + 1) / 2; VAR_4 = VAR_3 & 0x01; if (VAR_9 + VAR_7 + VAR_6 > VAR_10 ||
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_11 = 0; VAR_11 < VAR_3; VAR_11++) { if (VAR_7 >= VAR_0->width)
break; VAR_6 = bytestream2_get_byteu(VAR_2); VAR_1->data[0][VAR_9 + VAR_7] = VAR_6 >> 4; VAR_7++; if (VAR_11 + 1 == VAR_3 && VAR_5)
break; if (VAR_7 >= VAR_0->width)
break; VAR_1->data[0][VAR_9 + VAR_7] = VAR_6 & 0x0F; VAR_7++; } if (VAR_4)
bytestream2_skip(VAR_2, 1); } } else { if (VAR_9 + VAR_7 + VAR_6 > VAR_10) { av_log(VAR_0, AV_LOG_ERROR,
"MS RLE: frame ptr just went out of bounds (run)\n"); return AVERROR_INVALIDDATA; } VAR_6 = bytestream2_get_byte(VAR_2); for (VAR_11 = 0; VAR_11 < VAR_3; VAR_11++) { if (VAR_7 >= VAR_0->width)
break; if ((VAR_11 & 1) == 0)
VAR_1->data[0][VAR_9 + VAR_7] = VAR_6 >> 4; else
VAR_1->data[0][VAR_9 + 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; }