static void qtrle_encode_line(QtrleEncContext *s, AVFrame *p, int line, uint8_t **buf)

{

    int width=s->logical_width;

    int i;

    signed char rlecode;



    /* We will use it to compute the best bulk copy sequence */

    unsigned int bulkcount;

    /* This will be the number of pixels equal to the preivous frame one's

     * starting from the ith pixel */

    unsigned int skipcount;

    /* This will be the number of consecutive equal pixels in the current

     * frame, starting from the ith one also */

    unsigned int repeatcount;



    /* The cost of the three different possibilities */

    int total_bulk_cost;

    int total_skip_cost;

    int total_repeat_cost;



    int temp_cost;

    int j;



    uint8_t *this_line = p->               data[0] + line*p->               linesize[0] +

        (width - 1)*s->pixel_size;

    uint8_t *prev_line = s->previous_frame.data[0] + line*s->previous_frame.linesize[0] +

        (width - 1)*s->pixel_size;



    s->length_table[width] = 0;

    skipcount = 0;



    for (i = width - 1; i >= 0; i--) {



        if (!s->frame.key_frame && !memcmp(this_line, prev_line, s->pixel_size))

            skipcount = FFMIN(skipcount + 1, MAX_RLE_SKIP);

        else

            skipcount = 0;



        total_skip_cost  = s->length_table[i + skipcount] + 2;

        s->skip_table[i] = skipcount;





        if (i < width - 1 && !memcmp(this_line, this_line + s->pixel_size, s->pixel_size))

            repeatcount = FFMIN(repeatcount + 1, MAX_RLE_REPEAT);

        else

            repeatcount = 1;



        total_repeat_cost = s->length_table[i + repeatcount] + 1 + s->pixel_size;



        /* skip code is free for the first pixel, it costs one byte for repeat and bulk copy

         * so let's make it aware */

        if (i == 0) {

            total_skip_cost--;

            total_repeat_cost++;

        }



        if (repeatcount > 1 && (skipcount == 0 || total_repeat_cost < total_skip_cost)) {

            /* repeat is the best */

            s->length_table[i]  = total_repeat_cost;

            s->rlecode_table[i] = -repeatcount;

        }

        else if (skipcount > 0) {

            /* skip is the best choice here */

            s->length_table[i]  = total_skip_cost;

            s->rlecode_table[i] = 0;

        }

        else {

            /* We cannot do neither skip nor repeat

             * thus we search for the best bulk copy to do */



            int limit = FFMIN(width - i, MAX_RLE_BULK);



            temp_cost = 1 + s->pixel_size + !i;

            total_bulk_cost = INT_MAX;



            for (j = 1; j <= limit; j++) {

                if (s->length_table[i + j] + temp_cost < total_bulk_cost) {

                    /* We have found a better bulk copy ... */

                    total_bulk_cost = s->length_table[i + j] + temp_cost;

                    bulkcount = j;

                }

                temp_cost += s->pixel_size;

            }



            s->length_table[i]  = total_bulk_cost;

            s->rlecode_table[i] = bulkcount;

        }



        this_line -= s->pixel_size;

        prev_line -= s->pixel_size;

    }



    /* Good ! Now we have the best sequence for this line, let's output it */



    /* We do a special case for the first pixel so that we avoid testing it in

     * the whole loop */



    i=0;

    this_line = p->               data[0] + line*p->linesize[0];



    if (s->rlecode_table[0] == 0) {

        bytestream_put_byte(buf, s->skip_table[0] + 1);

        i += s->skip_table[0];

    }

    else bytestream_put_byte(buf, 1);





    while (i < width) {

        rlecode = s->rlecode_table[i];

        bytestream_put_byte(buf, rlecode);

        if (rlecode == 0) {

            /* Write a skip sequence */

            bytestream_put_byte(buf, s->skip_table[i] + 1);

            i += s->skip_table[i];

        }

        else if (rlecode > 0) {

            /* bulk copy */

            if (s->avctx->pix_fmt == PIX_FMT_GRAY8) {

                int j;

                // QT grayscale colorspace has 0=white and 255=black, we will

                // ignore the palette that is included in the AVFrame because

                // PIX_FMT_GRAY8 has defined color mapping

                for (j = 0; j < rlecode*s->pixel_size; ++j)

                    bytestream_put_byte(buf, *(this_line + i*s->pixel_size + j) ^ 0xff);

            } else {

                bytestream_put_buffer(buf, this_line + i*s->pixel_size, rlecode*s->pixel_size);

            }

            i += rlecode;

        }

        else {

            /* repeat the bits */

            if (s->avctx->pix_fmt == PIX_FMT_GRAY8) {

                int j;

                // QT grayscale colorspace has 0=white and 255=black, ...

                for (j = 0; j < s->pixel_size; ++j)

                    bytestream_put_byte(buf, *(this_line + i*s->pixel_size + j) ^ 0xff);

            } else {

                bytestream_put_buffer(buf, this_line + i*s->pixel_size, s->pixel_size);

            }

            i -= rlecode;

        }

    }

    bytestream_put_byte(buf, -1); // end RLE line

}

static void qtrle_encode_line(QtrleEncContext *s, AVFrame *p, int line, uint8_t **buf)

{

    int width=s->logical_width;

    int i;

    signed char rlecode;



    

    unsigned int bulkcount;

    



    unsigned int skipcount;

    



    unsigned int repeatcount;



    

    int total_bulk_cost;

    int total_skip_cost;

    int total_repeat_cost;



    int temp_cost;

    int j;



    uint8_t *this_line = p->               data[0] + line*p->               linesize[0] +

        (width - 1)*s->pixel_size;

    uint8_t *prev_line = s->previous_frame.data[0] + line*s->previous_frame.linesize[0] +

        (width - 1)*s->pixel_size;



    s->length_table[width] = 0;

    skipcount = 0;



    for (i = width - 1; i >= 0; i--) {



        if (!s->frame.key_frame && !memcmp(this_line, prev_line, s->pixel_size))

            skipcount = FFMIN(skipcount + 1, MAX_RLE_SKIP);

        else

            skipcount = 0;



        total_skip_cost  = s->length_table[i + skipcount] + 2;

        s->skip_table[i] = skipcount;





        if (i < width - 1 && !memcmp(this_line, this_line + s->pixel_size, s->pixel_size))

            repeatcount = FFMIN(repeatcount + 1, MAX_RLE_REPEAT);

        else

            repeatcount = 1;



        total_repeat_cost = s->length_table[i + repeatcount] + 1 + s->pixel_size;



        



        if (i == 0) {

            total_skip_cost--;

            total_repeat_cost++;

        }



        if (repeatcount > 1 && (skipcount == 0 || total_repeat_cost < total_skip_cost)) {

            

            s->length_table[i]  = total_repeat_cost;

            s->rlecode_table[i] = -repeatcount;

        }

        else if (skipcount > 0) {

            

            s->length_table[i]  = total_skip_cost;

            s->rlecode_table[i] = 0;

        }

        else {

            





            int limit = FFMIN(width - i, MAX_RLE_BULK);



            temp_cost = 1 + s->pixel_size + !i;

            total_bulk_cost = INT_MAX;



            for (j = 1; j <= limit; j++) {

                if (s->length_table[i + j] + temp_cost < total_bulk_cost) {

                    

                    total_bulk_cost = s->length_table[i + j] + temp_cost;

                    bulkcount = j;

                }

                temp_cost += s->pixel_size;

            }



            s->length_table[i]  = total_bulk_cost;

            s->rlecode_table[i] = bulkcount;

        }



        this_line -= s->pixel_size;

        prev_line -= s->pixel_size;

    }



    



    





    i=0;

    this_line = p->               data[0] + line*p->linesize[0];



    if (s->rlecode_table[0] == 0) {

        bytestream_put_byte(buf, s->skip_table[0] + 1);

        i += s->skip_table[0];

    }

    else bytestream_put_byte(buf, 1);





    while (i < width) {

        rlecode = s->rlecode_table[i];

        bytestream_put_byte(buf, rlecode);

        if (rlecode == 0) {

            

            bytestream_put_byte(buf, s->skip_table[i] + 1);

            i += s->skip_table[i];

        }

        else if (rlecode > 0) {

            

            if (s->avctx->pix_fmt == PIX_FMT_GRAY8) {

                int j;

                

                

                

                for (j = 0; j < rlecode*s->pixel_size; ++j)

                    bytestream_put_byte(buf, *(this_line + i*s->pixel_size + j) ^ 0xff);

            } else {

                bytestream_put_buffer(buf, this_line + i*s->pixel_size, rlecode*s->pixel_size);

            }

            i += rlecode;

        }

        else {

            

            if (s->avctx->pix_fmt == PIX_FMT_GRAY8) {

                int j;

                

                for (j = 0; j < s->pixel_size; ++j)

                    bytestream_put_byte(buf, *(this_line + i*s->pixel_size + j) ^ 0xff);

            } else {

                bytestream_put_buffer(buf, this_line + i*s->pixel_size, s->pixel_size);

            }

            i -= rlecode;

        }

    }

    bytestream_put_byte(buf, -1); 

}

    unsigned int bulkcount;     unsigned int repeatcount;
static void FUNC_0(QtrleEncContext *VAR_0, AVFrame *VAR_1, int VAR_2, uint8_t **VAR_3)

{

    int VAR_4=VAR_0->logical_width;

    int VAR_5;

    signed char VAR_6;



    

    unsigned int VAR_7;

    



    unsigned int VAR_8;

    



    unsigned int VAR_9;



    

    int VAR_10;

    int VAR_11;

    int VAR_12;



    int VAR_13;

    int VAR_16;



    uint8_t *this_line = VAR_1->               data[0] + VAR_2*VAR_1->               linesize[0] +

        (VAR_4 - 1)*VAR_0->pixel_size;

    uint8_t *prev_line = VAR_0->previous_frame.data[0] + VAR_2*VAR_0->previous_frame.linesize[0] +

        (VAR_4 - 1)*VAR_0->pixel_size;



    VAR_0->length_table[VAR_4] = 0;

    VAR_8 = 0;



    for (VAR_5 = VAR_4 - 1; VAR_5 >= 0; VAR_5--) {



        if (!VAR_0->frame.key_frame && !memcmp(this_line, prev_line, VAR_0->pixel_size))

            VAR_8 = FFMIN(VAR_8 + 1, MAX_RLE_SKIP);

        else

            VAR_8 = 0;



        VAR_11  = VAR_0->length_table[VAR_5 + VAR_8] + 2;

        VAR_0->skip_table[VAR_5] = VAR_8;





        if (VAR_5 < VAR_4 - 1 && !memcmp(this_line, this_line + VAR_0->pixel_size, VAR_0->pixel_size))

            VAR_9 = FFMIN(VAR_9 + 1, MAX_RLE_REPEAT);

        else

            VAR_9 = 1;



        VAR_12 = VAR_0->length_table[VAR_5 + VAR_9] + 1 + VAR_0->pixel_size;



        



        if (VAR_5 == 0) {

            VAR_11--;

            VAR_12++;

        }



        if (VAR_9 > 1 && (VAR_8 == 0 || VAR_12 < VAR_11)) {

            

            VAR_0->length_table[VAR_5]  = VAR_12;

            VAR_0->rlecode_table[VAR_5] = -VAR_9;

        }

        else if (VAR_8 > 0) {

            

            VAR_0->length_table[VAR_5]  = VAR_11;

            VAR_0->rlecode_table[VAR_5] = 0;

        }

        else {

            





            int VAR_15 = FFMIN(VAR_4 - VAR_5, MAX_RLE_BULK);



            VAR_13 = 1 + VAR_0->pixel_size + !VAR_5;

            VAR_10 = INT_MAX;



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

                if (VAR_0->length_table[VAR_5 + VAR_16] + VAR_13 < VAR_10) {

                    

                    VAR_10 = VAR_0->length_table[VAR_5 + VAR_16] + VAR_13;

                    VAR_7 = VAR_16;

                }

                VAR_13 += VAR_0->pixel_size;

            }



            VAR_0->length_table[VAR_5]  = VAR_10;

            VAR_0->rlecode_table[VAR_5] = VAR_7;

        }



        this_line -= VAR_0->pixel_size;

        prev_line -= VAR_0->pixel_size;

    }



    



    





    VAR_5=0;

    this_line = VAR_1->               data[0] + VAR_2*VAR_1->linesize[0];



    if (VAR_0->rlecode_table[0] == 0) {

        bytestream_put_byte(VAR_3, VAR_0->skip_table[0] + 1);

        VAR_5 += VAR_0->skip_table[0];

    }

    else bytestream_put_byte(VAR_3, 1);





    while (VAR_5 < VAR_4) {

        VAR_6 = VAR_0->rlecode_table[VAR_5];

        bytestream_put_byte(VAR_3, VAR_6);

        if (VAR_6 == 0) {

            

            bytestream_put_byte(VAR_3, VAR_0->skip_table[VAR_5] + 1);

            VAR_5 += VAR_0->skip_table[VAR_5];

        }

        else if (VAR_6 > 0) {

            

            if (VAR_0->avctx->pix_fmt == PIX_FMT_GRAY8) {

                int VAR_16;

                

                

                

                for (VAR_16 = 0; VAR_16 < VAR_6*VAR_0->pixel_size; ++VAR_16)

                    bytestream_put_byte(VAR_3, *(this_line + VAR_5*VAR_0->pixel_size + VAR_16) ^ 0xff);

            } else {

                bytestream_put_buffer(VAR_3, this_line + VAR_5*VAR_0->pixel_size, VAR_6*VAR_0->pixel_size);

            }

            VAR_5 += VAR_6;

        }

        else {

            

            if (VAR_0->avctx->pix_fmt == PIX_FMT_GRAY8) {

                int VAR_16;

                

                for (VAR_16 = 0; VAR_16 < VAR_0->pixel_size; ++VAR_16)

                    bytestream_put_byte(VAR_3, *(this_line + VAR_5*VAR_0->pixel_size + VAR_16) ^ 0xff);

            } else {

                bytestream_put_buffer(VAR_3, this_line + VAR_5*VAR_0->pixel_size, VAR_0->pixel_size);

            }

            VAR_5 -= VAR_6;

        }

    }

    bytestream_put_byte(VAR_3, -1); 

}

static void FUNC_0(QtrleEncContext *VAR_0, AVFrame *VAR_1, int VAR_2, uint8_t **VAR_3)
{ int VAR_4=VAR_0->logical_width; int VAR_5; signed char VAR_6; unsigned int VAR_7; unsigned int VAR_8; unsigned int VAR_9; int VAR_10; int VAR_11; int VAR_12; int VAR_13; int VAR_16; uint8_t *this_line = VAR_1->               data[0] + VAR_2*VAR_1->               linesize[0] +
(VAR_4 - 1)*VAR_0->pixel_size; uint8_t *prev_line = VAR_0->previous_frame.data[0] + VAR_2*VAR_0->previous_frame.linesize[0] +
(VAR_4 - 1)*VAR_0->pixel_size; VAR_0->length_table[VAR_4] = 0; VAR_8 = 0; for (VAR_5 = VAR_4 - 1; VAR_5 >= 0; VAR_5--) { if (!VAR_0->frame.key_frame && !memcmp(this_line, prev_line, VAR_0->pixel_size))
VAR_8 = FFMIN(VAR_8 + 1, MAX_RLE_SKIP); else
VAR_8 = 0; VAR_11  = VAR_0->length_table[VAR_5 + VAR_8] + 2; VAR_0->skip_table[VAR_5] = VAR_8; if (VAR_5 < VAR_4 - 1 && !memcmp(this_line, this_line + VAR_0->pixel_size, VAR_0->pixel_size))
VAR_9 = FFMIN(VAR_9 + 1, MAX_RLE_REPEAT); else
VAR_9 = 1; VAR_12 = VAR_0->length_table[VAR_5 + VAR_9] + 1 + VAR_0->pixel_size; if (VAR_5 == 0) { VAR_11--; VAR_12++; } if (VAR_9 > 1 && (VAR_8 == 0 || VAR_12 < VAR_11)) { VAR_0->length_table[VAR_5]  = VAR_12; VAR_0->rlecode_table[VAR_5] = -VAR_9; } else if (VAR_8 > 0) { VAR_0->length_table[VAR_5]  = VAR_11; VAR_0->rlecode_table[VAR_5] = 0; } else { int VAR_15 = FFMIN(VAR_4 - VAR_5, MAX_RLE_BULK); VAR_13 = 1 + VAR_0->pixel_size + !VAR_5; VAR_10 = INT_MAX; for (VAR_16 = 1; VAR_16 <= VAR_15; VAR_16++) { if (VAR_0->length_table[VAR_5 + VAR_16] + VAR_13 < VAR_10) { VAR_10 = VAR_0->length_table[VAR_5 + VAR_16] + VAR_13; VAR_7 = VAR_16; } VAR_13 += VAR_0->pixel_size; } VAR_0->length_table[VAR_5]  = VAR_10; VAR_0->rlecode_table[VAR_5] = VAR_7; } this_line -= VAR_0->pixel_size; prev_line -= VAR_0->pixel_size; } VAR_5=0; this_line = VAR_1->               data[0] + VAR_2*VAR_1->linesize[0]; if (VAR_0->rlecode_table[0] == 0) { bytestream_put_byte(VAR_3, VAR_0->skip_table[0] + 1); VAR_5 += VAR_0->skip_table[0]; } else bytestream_put_byte(VAR_3, 1); while (VAR_5 < VAR_4) { VAR_6 = VAR_0->rlecode_table[VAR_5]; bytestream_put_byte(VAR_3, VAR_6); if (VAR_6 == 0) { bytestream_put_byte(VAR_3, VAR_0->skip_table[VAR_5] + 1); VAR_5 += VAR_0->skip_table[VAR_5]; } else if (VAR_6 > 0) { if (VAR_0->avctx->pix_fmt == PIX_FMT_GRAY8) { int VAR_16; for (VAR_16 = 0; VAR_16 < VAR_6*VAR_0->pixel_size; ++VAR_16) bytestream_put_byte(VAR_3, *(this_line + VAR_5*VAR_0->pixel_size + VAR_16) ^ 0xff); } else { bytestream_put_buffer(VAR_3, this_line + VAR_5*VAR_0->pixel_size, VAR_6*VAR_0->pixel_size); } VAR_5 += VAR_6; } else { if (VAR_0->avctx->pix_fmt == PIX_FMT_GRAY8) { int VAR_16; for (VAR_16 = 0; VAR_16 < VAR_0->pixel_size; ++VAR_16) bytestream_put_byte(VAR_3, *(this_line + VAR_5*VAR_0->pixel_size + VAR_16) ^ 0xff); } else { bytestream_put_buffer(VAR_3, this_line + VAR_5*VAR_0->pixel_size, VAR_0->pixel_size); } VAR_5 -= VAR_6; } } bytestream_put_byte(VAR_3, -1); }