static int decode_sgirle8(AVCodecContext *avctx, uint8_t *dst, const uint8_t *src, int src_size, int width, int height, int linesize)

{

    const uint8_t *src_end = src + src_size;

    int x = 0, y = 0;



#define INC_XY(n) \

    x += n; \

    if (x >= width) { \

        y++; \

        if (y >= height) \

            return 0; \

        x = 0; \

    }



    while (src_end - src >= 2) {

        uint8_t v = *src++;

        if (v > 0 && v < 0xC0) {

            do {

                int length = FFMIN(v, width - x);

                memset(dst + y*linesize + x, RGB332_TO_BGR8(*src), length);

                INC_XY(length);

                v   -= length;

            } while (v > 0);

            src++;

        } else if (v >= 0xC1) {

            v -= 0xC0;

            do {

                int length = FFMIN3(v, width - x, src_end - src);

                if (src_end - src < length)

                    break;

                memcpy_rgb332_to_bgr8(dst + y*linesize + x, src, length);

                INC_XY(length);

                src += length;

                v   -= length;

            } while (v > 0);

        } else {

            avpriv_request_sample(avctx, "opcode %d", v);

            return AVERROR_PATCHWELCOME;

        }

    }

    return 0;

}

static int decode_sgirle8(AVCodecContext *avctx, uint8_t *dst, const uint8_t *src, int src_size, int width, int height, int linesize)

{

    const uint8_t *src_end = src + src_size;

    int x = 0, y = 0;



#define INC_XY(n) \

    x += n; \

    if (x >= width) { \

        y++; \

        if (y >= height) \

            return 0; \

        x = 0; \

    }



    while (src_end - src >= 2) {

        uint8_t v = *src++;

        if (v > 0 && v < 0xC0) {

            do {

                int length = FFMIN(v, width - x);

                memset(dst + y*linesize + x, RGB332_TO_BGR8(*src), length);

                INC_XY(length);

                v   -= length;

            } while (v > 0);

            src++;

        } else if (v >= 0xC1) {

            v -= 0xC0;

            do {

                int length = FFMIN3(v, width - x, src_end - src);

                if (src_end - src < length)

                    break;

                memcpy_rgb332_to_bgr8(dst + y*linesize + x, src, length);

                INC_XY(length);

                src += length;

                v   -= length;

            } while (v > 0);

        } else {

            avpriv_request_sample(avctx, "opcode %d", v);

            return AVERROR_PATCHWELCOME;

        }

    }

    return 0;

}

static int FUNC_0(AVCodecContext *VAR_0, uint8_t *VAR_1, const uint8_t *VAR_2, int VAR_3, int VAR_4, int VAR_5, int VAR_6)

{

    const uint8_t *VAR_7 = VAR_2 + VAR_3;

    int VAR_8 = 0, VAR_9 = 0;



#define INC_XY(n) \

    VAR_8 += n; \

    if (VAR_8 >= VAR_4) { \

        VAR_9++; \

        if (VAR_9 >= VAR_5) \

            return 0; \

        VAR_8 = 0; \

    }



    while (VAR_7 - VAR_2 >= 2) {

        uint8_t v = *VAR_2++;

        if (v > 0 && v < 0xC0) {

            do {

                int VAR_11 = FFMIN(v, VAR_4 - VAR_8);

                memset(VAR_1 + VAR_9*VAR_6 + VAR_8, RGB332_TO_BGR8(*VAR_2), VAR_11);

                INC_XY(VAR_11);

                v   -= VAR_11;

            } while (v > 0);

            VAR_2++;

        } else if (v >= 0xC1) {

            v -= 0xC0;

            do {

                int VAR_11 = FFMIN3(v, VAR_4 - VAR_8, VAR_7 - VAR_2);

                if (VAR_7 - VAR_2 < VAR_11)

                    break;

                memcpy_rgb332_to_bgr8(VAR_1 + VAR_9*VAR_6 + VAR_8, VAR_2, VAR_11);

                INC_XY(VAR_11);

                VAR_2 += VAR_11;

                v   -= VAR_11;

            } while (v > 0);

        } else {

            avpriv_request_sample(VAR_0, "opcode %d", v);

            return AVERROR_PATCHWELCOME;

        }

    }

    return 0;

}

static int FUNC_0(AVCodecContext *VAR_0, uint8_t *VAR_1, const uint8_t *VAR_2, int VAR_3, int VAR_4, int VAR_5, int VAR_6)
{ const uint8_t *VAR_7 = VAR_2 + VAR_3; int VAR_8 = 0, VAR_9 = 0; #define INC_XY(n) \
VAR_8 += n; \ if (VAR_8 >= VAR_4) { \ VAR_9++; \ if (VAR_9 >= VAR_5) \
return 0; \ VAR_8 = 0; \ } while (VAR_7 - VAR_2 >= 2) { uint8_t v = *VAR_2++; if (v > 0 && v < 0xC0) { do { int VAR_11 = FFMIN(v, VAR_4 - VAR_8); memset(VAR_1 + VAR_9*VAR_6 + VAR_8, RGB332_TO_BGR8(*VAR_2), VAR_11); INC_XY(VAR_11); v   -= VAR_11; } while (v > 0); VAR_2++; } else if (v >= 0xC1) { v -= 0xC0; do { int VAR_11 = FFMIN3(v, VAR_4 - VAR_8, VAR_7 - VAR_2); if (VAR_7 - VAR_2 < VAR_11)
break; memcpy_rgb332_to_bgr8(VAR_1 + VAR_9*VAR_6 + VAR_8, VAR_2, VAR_11); INC_XY(VAR_11); VAR_2 += VAR_11; v   -= VAR_11; } while (v > 0); } else { avpriv_request_sample(VAR_0, "opcode %d", v); return AVERROR_PATCHWELCOME; } } return 0; }