static int decode_rle(CamtasiaContext *c, unsigned int srcsize)
{
    unsigned char *src = c->decomp_buf;
    unsigned char *output, *output_end;
    int p1, p2, line=c->height, pos=0, i;
    uint16_t pix16;
    uint32_t pix32;
    output = c->pic.data[0] + (c->height - 1) * c->pic.linesize[0];
    output_end = c->pic.data[0] + (c->height) * c->pic.linesize[0];
    while(src < c->decomp_buf + srcsize) {
        p1 = *src++;
        if(p1 == 0) {
            p2 = *src++;
            if(p2 == 0) {
                output = c->pic.data[0] + (--line) * c->pic.linesize[0];
                if (line < 0)
                    return -1;
                pos = 0;
                continue;
            } else if(p2 == 1) {
                return 0;
            } else if(p2 == 2) {
                p1 = *src++;
                p2 = *src++;
                line -= p2;
                if (line < 0)
                    return -1;
                pos += p1;
                output = c->pic.data[0] + line * c->pic.linesize[0] + pos * (c->bpp / 8);
                continue;
            }
            if (output + p2 * (c->bpp / 8) > output_end) {
                src += p2 * (c->bpp / 8);
                continue;
            }
            if ((c->bpp == 8) || (c->bpp == 24)) {
                for(i = 0; i < p2 * (c->bpp / 8); i++) {
                    *output++ = *src++;
                }
                if(c->bpp == 8 && (p2 & 1)) {
                    src++;
                }
            } else if (c->bpp == 16) {
                for(i = 0; i < p2; i++) {
                    pix16 = AV_RL16(src);
                    src += 2;
                    *(uint16_t*)output = pix16;
                    output += 2;
                }
            } else if (c->bpp == 32) {
                for(i = 0; i < p2; i++) {
                    pix32 = AV_RL32(src);
                    src += 4;
                    *(uint32_t*)output = pix32;
                    output += 4;
                }
            }
            pos += p2;
        } else {
            int pix[4];
            switch(c->bpp){
            case  8: pix[0] = *src++;
                     break;
            case 16: pix16 = AV_RL16(src);
                     src += 2;
                     *(uint16_t*)pix = pix16;
                     break;
            case 24: pix[0] = *src++;
                     pix[1] = *src++;
                     pix[2] = *src++;
                     break;
            case 32: pix32 = AV_RL32(src);
                     src += 4;
                     *(uint32_t*)pix = pix32;
                     break;
            }
            if (output + p1 * (c->bpp / 8) > output_end)
                continue;
            for(i = 0; i < p1; i++) {
                switch(c->bpp){
                case  8: *output++ = pix[0];
                         break;
                case 16: *(uint16_t*)output = pix16;
                         output += 2;
                         break;
                case 24: *output++ = pix[0];
                         *output++ = pix[1];
                         *output++ = pix[2];
                         break;
                case 32: *(uint32_t*)output = pix32;
                         output += 4;
                         break;
                }
            }
            pos += p1;
        }
    }
    av_log(c->avctx, AV_LOG_ERROR, "Camtasia warning: no End-of-picture code\n");
    return 1;
}
['static int decode_rle(CamtasiaContext *c, unsigned int srcsize)\n{\n    unsigned char *src = c->decomp_buf;\n    unsigned char *output, *output_end;\n    int p1, p2, line=c->height, pos=0, i;\n    uint16_t pix16;\n    uint32_t pix32;\n    output = c->pic.data[0] + (c->height - 1) * c->pic.linesize[0];\n    output_end = c->pic.data[0] + (c->height) * c->pic.linesize[0];\n    while(src < c->decomp_buf + srcsize) {\n        p1 = *src++;\n        if(p1 == 0) {\n            p2 = *src++;\n            if(p2 == 0) {\n                output = c->pic.data[0] + (--line) * c->pic.linesize[0];\n                if (line < 0)\n                    return -1;\n                pos = 0;\n                continue;\n            } else if(p2 == 1) {\n                return 0;\n            } else if(p2 == 2) {\n                p1 = *src++;\n                p2 = *src++;\n                line -= p2;\n                if (line < 0)\n                    return -1;\n                pos += p1;\n                output = c->pic.data[0] + line * c->pic.linesize[0] + pos * (c->bpp / 8);\n                continue;\n            }\n            if (output + p2 * (c->bpp / 8) > output_end) {\n                src += p2 * (c->bpp / 8);\n                continue;\n            }\n            if ((c->bpp == 8) || (c->bpp == 24)) {\n                for(i = 0; i < p2 * (c->bpp / 8); i++) {\n                    *output++ = *src++;\n                }\n                if(c->bpp == 8 && (p2 & 1)) {\n                    src++;\n                }\n            } else if (c->bpp == 16) {\n                for(i = 0; i < p2; i++) {\n                    pix16 = AV_RL16(src);\n                    src += 2;\n                    *(uint16_t*)output = pix16;\n                    output += 2;\n                }\n            } else if (c->bpp == 32) {\n                for(i = 0; i < p2; i++) {\n                    pix32 = AV_RL32(src);\n                    src += 4;\n                    *(uint32_t*)output = pix32;\n                    output += 4;\n                }\n            }\n            pos += p2;\n        } else {\n            int pix[4];\n            switch(c->bpp){\n            case  8: pix[0] = *src++;\n                     break;\n            case 16: pix16 = AV_RL16(src);\n                     src += 2;\n                     *(uint16_t*)pix = pix16;\n                     break;\n            case 24: pix[0] = *src++;\n                     pix[1] = *src++;\n                     pix[2] = *src++;\n                     break;\n            case 32: pix32 = AV_RL32(src);\n                     src += 4;\n                     *(uint32_t*)pix = pix32;\n                     break;\n            }\n            if (output + p1 * (c->bpp / 8) > output_end)\n                continue;\n            for(i = 0; i < p1; i++) {\n                switch(c->bpp){\n                case  8: *output++ = pix[0];\n                         break;\n                case 16: *(uint16_t*)output = pix16;\n                         output += 2;\n                         break;\n                case 24: *output++ = pix[0];\n                         *output++ = pix[1];\n                         *output++ = pix[2];\n                         break;\n                case 32: *(uint32_t*)output = pix32;\n                         output += 4;\n                         break;\n                }\n            }\n            pos += p1;\n        }\n    }\n    av_log(c->avctx, AV_LOG_ERROR, "Camtasia warning: no End-of-picture code\\n");\n    return 1;\n}']