static int mpeg4_decode_sprite_trajectory(Mpeg4DecContext *ctx, GetBitContext *gb)

{

    MpegEncContext *s = &ctx->m;

    int a     = 2 << s->sprite_warping_accuracy;

    int rho   = 3  - s->sprite_warping_accuracy;

    int r     = 16 / a;

    int alpha = 0;

    int beta  = 0;

    int w     = s->width;

    int h     = s->height;

    int min_ab, i, w2, h2, w3, h3;

    int sprite_ref[4][2];

    int virtual_ref[2][2];



    // only true for rectangle shapes

    const int vop_ref[4][2] = { { 0, 0 },         { s->width, 0 },

                                { 0, s->height }, { s->width, s->height } };

    int d[4][2]             = { { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 } };



    if (w <= 0 || h <= 0)

        return AVERROR_INVALIDDATA;



    for (i = 0; i < ctx->num_sprite_warping_points; i++) {

        int length;

        int x = 0, y = 0;



        length = get_vlc2(gb, sprite_trajectory.table, SPRITE_TRAJ_VLC_BITS, 3);

        if (length)

            x = get_xbits(gb, length);



        if (!(ctx->divx_version == 500 && ctx->divx_build == 413))

            skip_bits1(gb);     /* marker bit */



        length = get_vlc2(gb, sprite_trajectory.table, SPRITE_TRAJ_VLC_BITS, 3);

        if (length)

            y = get_xbits(gb, length);



        skip_bits1(gb);         /* marker bit */

        ctx->sprite_traj[i][0] = d[i][0] = x;

        ctx->sprite_traj[i][1] = d[i][1] = y;

    }

    for (; i < 4; i++)

        ctx->sprite_traj[i][0] = ctx->sprite_traj[i][1] = 0;



    while ((1 << alpha) < w)

        alpha++;

    while ((1 << beta) < h)

        beta++;  /* typo in the mpeg4 std for the definition of w' and h' */

    w2 = 1 << alpha;

    h2 = 1 << beta;



    // Note, the 4th point isn't used for GMC

    if (ctx->divx_version == 500 && ctx->divx_build == 413) {

        sprite_ref[0][0] = a * vop_ref[0][0] + d[0][0];

        sprite_ref[0][1] = a * vop_ref[0][1] + d[0][1];

        sprite_ref[1][0] = a * vop_ref[1][0] + d[0][0] + d[1][0];

        sprite_ref[1][1] = a * vop_ref[1][1] + d[0][1] + d[1][1];

        sprite_ref[2][0] = a * vop_ref[2][0] + d[0][0] + d[2][0];

        sprite_ref[2][1] = a * vop_ref[2][1] + d[0][1] + d[2][1];

    } else {

        sprite_ref[0][0] = (a >> 1) * (2 * vop_ref[0][0] + d[0][0]);

        sprite_ref[0][1] = (a >> 1) * (2 * vop_ref[0][1] + d[0][1]);

        sprite_ref[1][0] = (a >> 1) * (2 * vop_ref[1][0] + d[0][0] + d[1][0]);

        sprite_ref[1][1] = (a >> 1) * (2 * vop_ref[1][1] + d[0][1] + d[1][1]);

        sprite_ref[2][0] = (a >> 1) * (2 * vop_ref[2][0] + d[0][0] + d[2][0]);

        sprite_ref[2][1] = (a >> 1) * (2 * vop_ref[2][1] + d[0][1] + d[2][1]);

    }

    /* sprite_ref[3][0] = (a >> 1) * (2 * vop_ref[3][0] + d[0][0] + d[1][0] + d[2][0] + d[3][0]);

     * sprite_ref[3][1] = (a >> 1) * (2 * vop_ref[3][1] + d[0][1] + d[1][1] + d[2][1] + d[3][1]); */



    /* this is mostly identical to the mpeg4 std (and is totally unreadable

     * because of that...). Perhaps it should be reordered to be more readable.

     * The idea behind this virtual_ref mess is to be able to use shifts later

     * per pixel instead of divides so the distance between points is converted

     * from w&h based to w2&h2 based which are of the 2^x form. */

    virtual_ref[0][0] = 16 * (vop_ref[0][0] + w2) +

                         ROUNDED_DIV(((w - w2) *

                                      (r * sprite_ref[0][0] - 16 * vop_ref[0][0]) +

                                      w2 * (r * sprite_ref[1][0] - 16 * vop_ref[1][0])), w);

    virtual_ref[0][1] = 16 * vop_ref[0][1] +

                        ROUNDED_DIV(((w - w2) *

                                     (r * sprite_ref[0][1] - 16 * vop_ref[0][1]) +

                                     w2 * (r * sprite_ref[1][1] - 16 * vop_ref[1][1])), w);

    virtual_ref[1][0] = 16 * vop_ref[0][0] +

                        ROUNDED_DIV(((h - h2) * (r * sprite_ref[0][0] - 16 * vop_ref[0][0]) +

                                     h2 * (r * sprite_ref[2][0] - 16 * vop_ref[2][0])), h);

    virtual_ref[1][1] = 16 * (vop_ref[0][1] + h2) +

                        ROUNDED_DIV(((h - h2) * (r * sprite_ref[0][1] - 16 * vop_ref[0][1]) +

                                     h2 * (r * sprite_ref[2][1] - 16 * vop_ref[2][1])), h);



    switch (ctx->num_sprite_warping_points) {

    case 0:

        s->sprite_offset[0][0] =

        s->sprite_offset[0][1] =

        s->sprite_offset[1][0] =

        s->sprite_offset[1][1] = 0;

        s->sprite_delta[0][0]  = a;

        s->sprite_delta[0][1]  =

        s->sprite_delta[1][0]  = 0;

        s->sprite_delta[1][1]  = a;

        ctx->sprite_shift[0]   =

        ctx->sprite_shift[1]   = 0;

        break;

    case 1:     // GMC only

        s->sprite_offset[0][0] = sprite_ref[0][0] - a * vop_ref[0][0];

        s->sprite_offset[0][1] = sprite_ref[0][1] - a * vop_ref[0][1];

        s->sprite_offset[1][0] = ((sprite_ref[0][0] >> 1) | (sprite_ref[0][0] & 1)) -

                                 a * (vop_ref[0][0] / 2);

        s->sprite_offset[1][1] = ((sprite_ref[0][1] >> 1) | (sprite_ref[0][1] & 1)) -

                                 a * (vop_ref[0][1] / 2);

        s->sprite_delta[0][0]  = a;

        s->sprite_delta[0][1]  =

        s->sprite_delta[1][0]  = 0;

        s->sprite_delta[1][1]  = a;

        ctx->sprite_shift[0]   =

        ctx->sprite_shift[1]   = 0;

        break;

    case 2:

        s->sprite_offset[0][0] = (sprite_ref[0][0] << (alpha + rho)) +

                                 (-r * sprite_ref[0][0] + virtual_ref[0][0]) *

                                 (-vop_ref[0][0]) +

                                 (r * sprite_ref[0][1] - virtual_ref[0][1]) *

                                 (-vop_ref[0][1]) + (1 << (alpha + rho - 1));

        s->sprite_offset[0][1] = (sprite_ref[0][1] << (alpha + rho)) +

                                 (-r * sprite_ref[0][1] + virtual_ref[0][1]) *

                                 (-vop_ref[0][0]) +

                                 (-r * sprite_ref[0][0] + virtual_ref[0][0]) *

                                 (-vop_ref[0][1]) + (1 << (alpha + rho - 1));

        s->sprite_offset[1][0] = ((-r * sprite_ref[0][0] + virtual_ref[0][0]) *

                                  (-2 * vop_ref[0][0] + 1) +

                                  (r * sprite_ref[0][1] - virtual_ref[0][1]) *

                                  (-2 * vop_ref[0][1] + 1) + 2 * w2 * r *

                                  sprite_ref[0][0] - 16 * w2 + (1 << (alpha + rho + 1)));

        s->sprite_offset[1][1] = ((-r * sprite_ref[0][1] + virtual_ref[0][1]) *

                                  (-2 * vop_ref[0][0] + 1) +

                                  (-r * sprite_ref[0][0] + virtual_ref[0][0]) *

                                  (-2 * vop_ref[0][1] + 1) + 2 * w2 * r *

                                  sprite_ref[0][1] - 16 * w2 + (1 << (alpha + rho + 1)));

        s->sprite_delta[0][0] = (-r * sprite_ref[0][0] + virtual_ref[0][0]);

        s->sprite_delta[0][1] = (+r * sprite_ref[0][1] - virtual_ref[0][1]);

        s->sprite_delta[1][0] = (-r * sprite_ref[0][1] + virtual_ref[0][1]);

        s->sprite_delta[1][1] = (-r * sprite_ref[0][0] + virtual_ref[0][0]);



        ctx->sprite_shift[0]  = alpha + rho;

        ctx->sprite_shift[1]  = alpha + rho + 2;

        break;

    case 3:

        min_ab = FFMIN(alpha, beta);

        w3     = w2 >> min_ab;

        h3     = h2 >> min_ab;

        s->sprite_offset[0][0] = (sprite_ref[0][0] << (alpha + beta + rho - min_ab)) +

                                 (-r * sprite_ref[0][0] + virtual_ref[0][0]) *

                                 h3 * (-vop_ref[0][0]) +

                                 (-r * sprite_ref[0][0] + virtual_ref[1][0]) *

                                 w3 * (-vop_ref[0][1]) +

                                 (1 << (alpha + beta + rho - min_ab - 1));

        s->sprite_offset[0][1] = (sprite_ref[0][1] << (alpha + beta + rho - min_ab)) +

                                 (-r * sprite_ref[0][1] + virtual_ref[0][1]) *

                                 h3 * (-vop_ref[0][0]) +

                                 (-r * sprite_ref[0][1] + virtual_ref[1][1]) *

                                 w3 * (-vop_ref[0][1]) +

                                 (1 << (alpha + beta + rho - min_ab - 1));

        s->sprite_offset[1][0] = (-r * sprite_ref[0][0] + virtual_ref[0][0]) *

                                 h3 * (-2 * vop_ref[0][0] + 1) +

                                 (-r * sprite_ref[0][0] + virtual_ref[1][0]) *

                                 w3 * (-2 * vop_ref[0][1] + 1) + 2 * w2 * h3 *

                                 r * sprite_ref[0][0] - 16 * w2 * h3 +

                                 (1 << (alpha + beta + rho - min_ab + 1));

        s->sprite_offset[1][1] = (-r * sprite_ref[0][1] + virtual_ref[0][1]) *

                                 h3 * (-2 * vop_ref[0][0] + 1) +

                                 (-r * sprite_ref[0][1] + virtual_ref[1][1]) *

                                 w3 * (-2 * vop_ref[0][1] + 1) + 2 * w2 * h3 *

                                 r * sprite_ref[0][1] - 16 * w2 * h3 +

                                 (1 << (alpha + beta + rho - min_ab + 1));

        s->sprite_delta[0][0] = (-r * sprite_ref[0][0] + virtual_ref[0][0]) * h3;

        s->sprite_delta[0][1] = (-r * sprite_ref[0][0] + virtual_ref[1][0]) * w3;

        s->sprite_delta[1][0] = (-r * sprite_ref[0][1] + virtual_ref[0][1]) * h3;

        s->sprite_delta[1][1] = (-r * sprite_ref[0][1] + virtual_ref[1][1]) * w3;



        ctx->sprite_shift[0]  = alpha + beta + rho - min_ab;

        ctx->sprite_shift[1]  = alpha + beta + rho - min_ab + 2;

        break;

    }

    /* try to simplify the situation */

    if (s->sprite_delta[0][0] == a << ctx->sprite_shift[0] &&

        s->sprite_delta[0][1] == 0 &&

        s->sprite_delta[1][0] == 0 &&

        s->sprite_delta[1][1] == a << ctx->sprite_shift[0]) {

        s->sprite_offset[0][0] >>= ctx->sprite_shift[0];

        s->sprite_offset[0][1] >>= ctx->sprite_shift[0];

        s->sprite_offset[1][0] >>= ctx->sprite_shift[1];

        s->sprite_offset[1][1] >>= ctx->sprite_shift[1];

        s->sprite_delta[0][0] = a;

        s->sprite_delta[0][1] = 0;

        s->sprite_delta[1][0] = 0;

        s->sprite_delta[1][1] = a;

        ctx->sprite_shift[0] = 0;

        ctx->sprite_shift[1] = 0;

        s->real_sprite_warping_points = 1;

    } else {

        int shift_y = 16 - ctx->sprite_shift[0];

        int shift_c = 16 - ctx->sprite_shift[1];

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

            s->sprite_offset[0][i] <<= shift_y;

            s->sprite_offset[1][i] <<= shift_c;

            s->sprite_delta[0][i]  <<= shift_y;

            s->sprite_delta[1][i]  <<= shift_y;

            ctx->sprite_shift[i]     = 16;

        }

        s->real_sprite_warping_points = ctx->num_sprite_warping_points;

    }



    return 0;

}

static int mpeg4_decode_sprite_trajectory(Mpeg4DecContext *ctx, GetBitContext *gb)

{

    MpegEncContext *s = &ctx->m;

    int a     = 2 << s->sprite_warping_accuracy;

    int rho   = 3  - s->sprite_warping_accuracy;

    int r     = 16 / a;

    int alpha = 0;

    int beta  = 0;

    int w     = s->width;

    int h     = s->height;

    int min_ab, i, w2, h2, w3, h3;

    int sprite_ref[4][2];

    int virtual_ref[2][2];



    

    const int vop_ref[4][2] = { { 0, 0 },         { s->width, 0 },

                                { 0, s->height }, { s->width, s->height } };

    int d[4][2]             = { { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 } };



    if (w <= 0 || h <= 0)

        return AVERROR_INVALIDDATA;



    for (i = 0; i < ctx->num_sprite_warping_points; i++) {

        int length;

        int x = 0, y = 0;



        length = get_vlc2(gb, sprite_trajectory.table, SPRITE_TRAJ_VLC_BITS, 3);

        if (length)

            x = get_xbits(gb, length);



        if (!(ctx->divx_version == 500 && ctx->divx_build == 413))

            skip_bits1(gb);     



        length = get_vlc2(gb, sprite_trajectory.table, SPRITE_TRAJ_VLC_BITS, 3);

        if (length)

            y = get_xbits(gb, length);



        skip_bits1(gb);         

        ctx->sprite_traj[i][0] = d[i][0] = x;

        ctx->sprite_traj[i][1] = d[i][1] = y;

    }

    for (; i < 4; i++)

        ctx->sprite_traj[i][0] = ctx->sprite_traj[i][1] = 0;



    while ((1 << alpha) < w)

        alpha++;

    while ((1 << beta) < h)

        beta++;  

    w2 = 1 << alpha;

    h2 = 1 << beta;



    

    if (ctx->divx_version == 500 && ctx->divx_build == 413) {

        sprite_ref[0][0] = a * vop_ref[0][0] + d[0][0];

        sprite_ref[0][1] = a * vop_ref[0][1] + d[0][1];

        sprite_ref[1][0] = a * vop_ref[1][0] + d[0][0] + d[1][0];

        sprite_ref[1][1] = a * vop_ref[1][1] + d[0][1] + d[1][1];

        sprite_ref[2][0] = a * vop_ref[2][0] + d[0][0] + d[2][0];

        sprite_ref[2][1] = a * vop_ref[2][1] + d[0][1] + d[2][1];

    } else {

        sprite_ref[0][0] = (a >> 1) * (2 * vop_ref[0][0] + d[0][0]);

        sprite_ref[0][1] = (a >> 1) * (2 * vop_ref[0][1] + d[0][1]);

        sprite_ref[1][0] = (a >> 1) * (2 * vop_ref[1][0] + d[0][0] + d[1][0]);

        sprite_ref[1][1] = (a >> 1) * (2 * vop_ref[1][1] + d[0][1] + d[1][1]);

        sprite_ref[2][0] = (a >> 1) * (2 * vop_ref[2][0] + d[0][0] + d[2][0]);

        sprite_ref[2][1] = (a >> 1) * (2 * vop_ref[2][1] + d[0][1] + d[2][1]);

    }

    





    









    virtual_ref[0][0] = 16 * (vop_ref[0][0] + w2) +

                         ROUNDED_DIV(((w - w2) *

                                      (r * sprite_ref[0][0] - 16 * vop_ref[0][0]) +

                                      w2 * (r * sprite_ref[1][0] - 16 * vop_ref[1][0])), w);

    virtual_ref[0][1] = 16 * vop_ref[0][1] +

                        ROUNDED_DIV(((w - w2) *

                                     (r * sprite_ref[0][1] - 16 * vop_ref[0][1]) +

                                     w2 * (r * sprite_ref[1][1] - 16 * vop_ref[1][1])), w);

    virtual_ref[1][0] = 16 * vop_ref[0][0] +

                        ROUNDED_DIV(((h - h2) * (r * sprite_ref[0][0] - 16 * vop_ref[0][0]) +

                                     h2 * (r * sprite_ref[2][0] - 16 * vop_ref[2][0])), h);

    virtual_ref[1][1] = 16 * (vop_ref[0][1] + h2) +

                        ROUNDED_DIV(((h - h2) * (r * sprite_ref[0][1] - 16 * vop_ref[0][1]) +

                                     h2 * (r * sprite_ref[2][1] - 16 * vop_ref[2][1])), h);



    switch (ctx->num_sprite_warping_points) {

    case 0:

        s->sprite_offset[0][0] =

        s->sprite_offset[0][1] =

        s->sprite_offset[1][0] =

        s->sprite_offset[1][1] = 0;

        s->sprite_delta[0][0]  = a;

        s->sprite_delta[0][1]  =

        s->sprite_delta[1][0]  = 0;

        s->sprite_delta[1][1]  = a;

        ctx->sprite_shift[0]   =

        ctx->sprite_shift[1]   = 0;

        break;

    case 1:     

        s->sprite_offset[0][0] = sprite_ref[0][0] - a * vop_ref[0][0];

        s->sprite_offset[0][1] = sprite_ref[0][1] - a * vop_ref[0][1];

        s->sprite_offset[1][0] = ((sprite_ref[0][0] >> 1) | (sprite_ref[0][0] & 1)) -

                                 a * (vop_ref[0][0] / 2);

        s->sprite_offset[1][1] = ((sprite_ref[0][1] >> 1) | (sprite_ref[0][1] & 1)) -

                                 a * (vop_ref[0][1] / 2);

        s->sprite_delta[0][0]  = a;

        s->sprite_delta[0][1]  =

        s->sprite_delta[1][0]  = 0;

        s->sprite_delta[1][1]  = a;

        ctx->sprite_shift[0]   =

        ctx->sprite_shift[1]   = 0;

        break;

    case 2:

        s->sprite_offset[0][0] = (sprite_ref[0][0] << (alpha + rho)) +

                                 (-r * sprite_ref[0][0] + virtual_ref[0][0]) *

                                 (-vop_ref[0][0]) +

                                 (r * sprite_ref[0][1] - virtual_ref[0][1]) *

                                 (-vop_ref[0][1]) + (1 << (alpha + rho - 1));

        s->sprite_offset[0][1] = (sprite_ref[0][1] << (alpha + rho)) +

                                 (-r * sprite_ref[0][1] + virtual_ref[0][1]) *

                                 (-vop_ref[0][0]) +

                                 (-r * sprite_ref[0][0] + virtual_ref[0][0]) *

                                 (-vop_ref[0][1]) + (1 << (alpha + rho - 1));

        s->sprite_offset[1][0] = ((-r * sprite_ref[0][0] + virtual_ref[0][0]) *

                                  (-2 * vop_ref[0][0] + 1) +

                                  (r * sprite_ref[0][1] - virtual_ref[0][1]) *

                                  (-2 * vop_ref[0][1] + 1) + 2 * w2 * r *

                                  sprite_ref[0][0] - 16 * w2 + (1 << (alpha + rho + 1)));

        s->sprite_offset[1][1] = ((-r * sprite_ref[0][1] + virtual_ref[0][1]) *

                                  (-2 * vop_ref[0][0] + 1) +

                                  (-r * sprite_ref[0][0] + virtual_ref[0][0]) *

                                  (-2 * vop_ref[0][1] + 1) + 2 * w2 * r *

                                  sprite_ref[0][1] - 16 * w2 + (1 << (alpha + rho + 1)));

        s->sprite_delta[0][0] = (-r * sprite_ref[0][0] + virtual_ref[0][0]);

        s->sprite_delta[0][1] = (+r * sprite_ref[0][1] - virtual_ref[0][1]);

        s->sprite_delta[1][0] = (-r * sprite_ref[0][1] + virtual_ref[0][1]);

        s->sprite_delta[1][1] = (-r * sprite_ref[0][0] + virtual_ref[0][0]);



        ctx->sprite_shift[0]  = alpha + rho;

        ctx->sprite_shift[1]  = alpha + rho + 2;

        break;

    case 3:

        min_ab = FFMIN(alpha, beta);

        w3     = w2 >> min_ab;

        h3     = h2 >> min_ab;

        s->sprite_offset[0][0] = (sprite_ref[0][0] << (alpha + beta + rho - min_ab)) +

                                 (-r * sprite_ref[0][0] + virtual_ref[0][0]) *

                                 h3 * (-vop_ref[0][0]) +

                                 (-r * sprite_ref[0][0] + virtual_ref[1][0]) *

                                 w3 * (-vop_ref[0][1]) +

                                 (1 << (alpha + beta + rho - min_ab - 1));

        s->sprite_offset[0][1] = (sprite_ref[0][1] << (alpha + beta + rho - min_ab)) +

                                 (-r * sprite_ref[0][1] + virtual_ref[0][1]) *

                                 h3 * (-vop_ref[0][0]) +

                                 (-r * sprite_ref[0][1] + virtual_ref[1][1]) *

                                 w3 * (-vop_ref[0][1]) +

                                 (1 << (alpha + beta + rho - min_ab - 1));

        s->sprite_offset[1][0] = (-r * sprite_ref[0][0] + virtual_ref[0][0]) *

                                 h3 * (-2 * vop_ref[0][0] + 1) +

                                 (-r * sprite_ref[0][0] + virtual_ref[1][0]) *

                                 w3 * (-2 * vop_ref[0][1] + 1) + 2 * w2 * h3 *

                                 r * sprite_ref[0][0] - 16 * w2 * h3 +

                                 (1 << (alpha + beta + rho - min_ab + 1));

        s->sprite_offset[1][1] = (-r * sprite_ref[0][1] + virtual_ref[0][1]) *

                                 h3 * (-2 * vop_ref[0][0] + 1) +

                                 (-r * sprite_ref[0][1] + virtual_ref[1][1]) *

                                 w3 * (-2 * vop_ref[0][1] + 1) + 2 * w2 * h3 *

                                 r * sprite_ref[0][1] - 16 * w2 * h3 +

                                 (1 << (alpha + beta + rho - min_ab + 1));

        s->sprite_delta[0][0] = (-r * sprite_ref[0][0] + virtual_ref[0][0]) * h3;

        s->sprite_delta[0][1] = (-r * sprite_ref[0][0] + virtual_ref[1][0]) * w3;

        s->sprite_delta[1][0] = (-r * sprite_ref[0][1] + virtual_ref[0][1]) * h3;

        s->sprite_delta[1][1] = (-r * sprite_ref[0][1] + virtual_ref[1][1]) * w3;



        ctx->sprite_shift[0]  = alpha + beta + rho - min_ab;

        ctx->sprite_shift[1]  = alpha + beta + rho - min_ab + 2;

        break;

    }

    

    if (s->sprite_delta[0][0] == a << ctx->sprite_shift[0] &&

        s->sprite_delta[0][1] == 0 &&

        s->sprite_delta[1][0] == 0 &&

        s->sprite_delta[1][1] == a << ctx->sprite_shift[0]) {

        s->sprite_offset[0][0] >>= ctx->sprite_shift[0];

        s->sprite_offset[0][1] >>= ctx->sprite_shift[0];

        s->sprite_offset[1][0] >>= ctx->sprite_shift[1];

        s->sprite_offset[1][1] >>= ctx->sprite_shift[1];

        s->sprite_delta[0][0] = a;

        s->sprite_delta[0][1] = 0;

        s->sprite_delta[1][0] = 0;

        s->sprite_delta[1][1] = a;

        ctx->sprite_shift[0] = 0;

        ctx->sprite_shift[1] = 0;

        s->real_sprite_warping_points = 1;

    } else {

        int shift_y = 16 - ctx->sprite_shift[0];

        int shift_c = 16 - ctx->sprite_shift[1];

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

            s->sprite_offset[0][i] <<= shift_y;

            s->sprite_offset[1][i] <<= shift_c;

            s->sprite_delta[0][i]  <<= shift_y;

            s->sprite_delta[1][i]  <<= shift_y;

            ctx->sprite_shift[i]     = 16;

        }

        s->real_sprite_warping_points = ctx->num_sprite_warping_points;

    }



    return 0;

}

static int FUNC_0(Mpeg4DecContext *VAR_0, GetBitContext *VAR_1)

{

    MpegEncContext *s = &VAR_0->m;

    int VAR_2     = 2 << s->sprite_warping_accuracy;

    int VAR_3   = 3  - s->sprite_warping_accuracy;

    int VAR_4     = 16 / VAR_2;

    int VAR_5 = 0;

    int VAR_6  = 0;

    int VAR_7     = s->width;

    int VAR_8     = s->height;

    int VAR_9, VAR_10, VAR_11, VAR_12, VAR_13, VAR_14;

    int VAR_15[4][2];

    int VAR_16[2][2];



    

    const int VAR_17[4][2] = { { 0, 0 },         { s->width, 0 },

                                { 0, s->height }, { s->width, s->height } };

    int VAR_18[4][2]             = { { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 } };



    if (VAR_7 <= 0 || VAR_8 <= 0)

        return AVERROR_INVALIDDATA;



    for (VAR_10 = 0; VAR_10 < VAR_0->num_sprite_warping_points; VAR_10++) {

        int length;

        int x = 0, y = 0;



        length = get_vlc2(VAR_1, sprite_trajectory.table, SPRITE_TRAJ_VLC_BITS, 3);

        if (length)

            x = get_xbits(VAR_1, length);



        if (!(VAR_0->divx_version == 500 && VAR_0->divx_build == 413))

            skip_bits1(VAR_1);     



        length = get_vlc2(VAR_1, sprite_trajectory.table, SPRITE_TRAJ_VLC_BITS, 3);

        if (length)

            y = get_xbits(VAR_1, length);



        skip_bits1(VAR_1);         

        VAR_0->sprite_traj[VAR_10][0] = VAR_18[VAR_10][0] = x;

        VAR_0->sprite_traj[VAR_10][1] = VAR_18[VAR_10][1] = y;

    }

    for (; VAR_10 < 4; VAR_10++)

        VAR_0->sprite_traj[VAR_10][0] = VAR_0->sprite_traj[VAR_10][1] = 0;



    while ((1 << VAR_5) < VAR_7)

        VAR_5++;

    while ((1 << VAR_6) < VAR_8)

        VAR_6++;  

    VAR_11 = 1 << VAR_5;

    VAR_12 = 1 << VAR_6;



    

    if (VAR_0->divx_version == 500 && VAR_0->divx_build == 413) {

        VAR_15[0][0] = VAR_2 * VAR_17[0][0] + VAR_18[0][0];

        VAR_15[0][1] = VAR_2 * VAR_17[0][1] + VAR_18[0][1];

        VAR_15[1][0] = VAR_2 * VAR_17[1][0] + VAR_18[0][0] + VAR_18[1][0];

        VAR_15[1][1] = VAR_2 * VAR_17[1][1] + VAR_18[0][1] + VAR_18[1][1];

        VAR_15[2][0] = VAR_2 * VAR_17[2][0] + VAR_18[0][0] + VAR_18[2][0];

        VAR_15[2][1] = VAR_2 * VAR_17[2][1] + VAR_18[0][1] + VAR_18[2][1];

    } else {

        VAR_15[0][0] = (VAR_2 >> 1) * (2 * VAR_17[0][0] + VAR_18[0][0]);

        VAR_15[0][1] = (VAR_2 >> 1) * (2 * VAR_17[0][1] + VAR_18[0][1]);

        VAR_15[1][0] = (VAR_2 >> 1) * (2 * VAR_17[1][0] + VAR_18[0][0] + VAR_18[1][0]);

        VAR_15[1][1] = (VAR_2 >> 1) * (2 * VAR_17[1][1] + VAR_18[0][1] + VAR_18[1][1]);

        VAR_15[2][0] = (VAR_2 >> 1) * (2 * VAR_17[2][0] + VAR_18[0][0] + VAR_18[2][0]);

        VAR_15[2][1] = (VAR_2 >> 1) * (2 * VAR_17[2][1] + VAR_18[0][1] + VAR_18[2][1]);

    }

    





    









    VAR_16[0][0] = 16 * (VAR_17[0][0] + VAR_11) +

                         ROUNDED_DIV(((VAR_7 - VAR_11) *

                                      (VAR_4 * VAR_15[0][0] - 16 * VAR_17[0][0]) +

                                      VAR_11 * (VAR_4 * VAR_15[1][0] - 16 * VAR_17[1][0])), VAR_7);

    VAR_16[0][1] = 16 * VAR_17[0][1] +

                        ROUNDED_DIV(((VAR_7 - VAR_11) *

                                     (VAR_4 * VAR_15[0][1] - 16 * VAR_17[0][1]) +

                                     VAR_11 * (VAR_4 * VAR_15[1][1] - 16 * VAR_17[1][1])), VAR_7);

    VAR_16[1][0] = 16 * VAR_17[0][0] +

                        ROUNDED_DIV(((VAR_8 - VAR_12) * (VAR_4 * VAR_15[0][0] - 16 * VAR_17[0][0]) +

                                     VAR_12 * (VAR_4 * VAR_15[2][0] - 16 * VAR_17[2][0])), VAR_8);

    VAR_16[1][1] = 16 * (VAR_17[0][1] + VAR_12) +

                        ROUNDED_DIV(((VAR_8 - VAR_12) * (VAR_4 * VAR_15[0][1] - 16 * VAR_17[0][1]) +

                                     VAR_12 * (VAR_4 * VAR_15[2][1] - 16 * VAR_17[2][1])), VAR_8);



    switch (VAR_0->num_sprite_warping_points) {

    case 0:

        s->sprite_offset[0][0] =

        s->sprite_offset[0][1] =

        s->sprite_offset[1][0] =

        s->sprite_offset[1][1] = 0;

        s->sprite_delta[0][0]  = VAR_2;

        s->sprite_delta[0][1]  =

        s->sprite_delta[1][0]  = 0;

        s->sprite_delta[1][1]  = VAR_2;

        VAR_0->sprite_shift[0]   =

        VAR_0->sprite_shift[1]   = 0;

        break;

    case 1:     

        s->sprite_offset[0][0] = VAR_15[0][0] - VAR_2 * VAR_17[0][0];

        s->sprite_offset[0][1] = VAR_15[0][1] - VAR_2 * VAR_17[0][1];

        s->sprite_offset[1][0] = ((VAR_15[0][0] >> 1) | (VAR_15[0][0] & 1)) -

                                 VAR_2 * (VAR_17[0][0] / 2);

        s->sprite_offset[1][1] = ((VAR_15[0][1] >> 1) | (VAR_15[0][1] & 1)) -

                                 VAR_2 * (VAR_17[0][1] / 2);

        s->sprite_delta[0][0]  = VAR_2;

        s->sprite_delta[0][1]  =

        s->sprite_delta[1][0]  = 0;

        s->sprite_delta[1][1]  = VAR_2;

        VAR_0->sprite_shift[0]   =

        VAR_0->sprite_shift[1]   = 0;

        break;

    case 2:

        s->sprite_offset[0][0] = (VAR_15[0][0] << (VAR_5 + VAR_3)) +

                                 (-VAR_4 * VAR_15[0][0] + VAR_16[0][0]) *

                                 (-VAR_17[0][0]) +

                                 (VAR_4 * VAR_15[0][1] - VAR_16[0][1]) *

                                 (-VAR_17[0][1]) + (1 << (VAR_5 + VAR_3 - 1));

        s->sprite_offset[0][1] = (VAR_15[0][1] << (VAR_5 + VAR_3)) +

                                 (-VAR_4 * VAR_15[0][1] + VAR_16[0][1]) *

                                 (-VAR_17[0][0]) +

                                 (-VAR_4 * VAR_15[0][0] + VAR_16[0][0]) *

                                 (-VAR_17[0][1]) + (1 << (VAR_5 + VAR_3 - 1));

        s->sprite_offset[1][0] = ((-VAR_4 * VAR_15[0][0] + VAR_16[0][0]) *

                                  (-2 * VAR_17[0][0] + 1) +

                                  (VAR_4 * VAR_15[0][1] - VAR_16[0][1]) *

                                  (-2 * VAR_17[0][1] + 1) + 2 * VAR_11 * VAR_4 *

                                  VAR_15[0][0] - 16 * VAR_11 + (1 << (VAR_5 + VAR_3 + 1)));

        s->sprite_offset[1][1] = ((-VAR_4 * VAR_15[0][1] + VAR_16[0][1]) *

                                  (-2 * VAR_17[0][0] + 1) +

                                  (-VAR_4 * VAR_15[0][0] + VAR_16[0][0]) *

                                  (-2 * VAR_17[0][1] + 1) + 2 * VAR_11 * VAR_4 *

                                  VAR_15[0][1] - 16 * VAR_11 + (1 << (VAR_5 + VAR_3 + 1)));

        s->sprite_delta[0][0] = (-VAR_4 * VAR_15[0][0] + VAR_16[0][0]);

        s->sprite_delta[0][1] = (+VAR_4 * VAR_15[0][1] - VAR_16[0][1]);

        s->sprite_delta[1][0] = (-VAR_4 * VAR_15[0][1] + VAR_16[0][1]);

        s->sprite_delta[1][1] = (-VAR_4 * VAR_15[0][0] + VAR_16[0][0]);



        VAR_0->sprite_shift[0]  = VAR_5 + VAR_3;

        VAR_0->sprite_shift[1]  = VAR_5 + VAR_3 + 2;

        break;

    case 3:

        VAR_9 = FFMIN(VAR_5, VAR_6);

        VAR_13     = VAR_11 >> VAR_9;

        VAR_14     = VAR_12 >> VAR_9;

        s->sprite_offset[0][0] = (VAR_15[0][0] << (VAR_5 + VAR_6 + VAR_3 - VAR_9)) +

                                 (-VAR_4 * VAR_15[0][0] + VAR_16[0][0]) *

                                 VAR_14 * (-VAR_17[0][0]) +

                                 (-VAR_4 * VAR_15[0][0] + VAR_16[1][0]) *

                                 VAR_13 * (-VAR_17[0][1]) +

                                 (1 << (VAR_5 + VAR_6 + VAR_3 - VAR_9 - 1));

        s->sprite_offset[0][1] = (VAR_15[0][1] << (VAR_5 + VAR_6 + VAR_3 - VAR_9)) +

                                 (-VAR_4 * VAR_15[0][1] + VAR_16[0][1]) *

                                 VAR_14 * (-VAR_17[0][0]) +

                                 (-VAR_4 * VAR_15[0][1] + VAR_16[1][1]) *

                                 VAR_13 * (-VAR_17[0][1]) +

                                 (1 << (VAR_5 + VAR_6 + VAR_3 - VAR_9 - 1));

        s->sprite_offset[1][0] = (-VAR_4 * VAR_15[0][0] + VAR_16[0][0]) *

                                 VAR_14 * (-2 * VAR_17[0][0] + 1) +

                                 (-VAR_4 * VAR_15[0][0] + VAR_16[1][0]) *

                                 VAR_13 * (-2 * VAR_17[0][1] + 1) + 2 * VAR_11 * VAR_14 *

                                 VAR_4 * VAR_15[0][0] - 16 * VAR_11 * VAR_14 +

                                 (1 << (VAR_5 + VAR_6 + VAR_3 - VAR_9 + 1));

        s->sprite_offset[1][1] = (-VAR_4 * VAR_15[0][1] + VAR_16[0][1]) *

                                 VAR_14 * (-2 * VAR_17[0][0] + 1) +

                                 (-VAR_4 * VAR_15[0][1] + VAR_16[1][1]) *

                                 VAR_13 * (-2 * VAR_17[0][1] + 1) + 2 * VAR_11 * VAR_14 *

                                 VAR_4 * VAR_15[0][1] - 16 * VAR_11 * VAR_14 +

                                 (1 << (VAR_5 + VAR_6 + VAR_3 - VAR_9 + 1));

        s->sprite_delta[0][0] = (-VAR_4 * VAR_15[0][0] + VAR_16[0][0]) * VAR_14;

        s->sprite_delta[0][1] = (-VAR_4 * VAR_15[0][0] + VAR_16[1][0]) * VAR_13;

        s->sprite_delta[1][0] = (-VAR_4 * VAR_15[0][1] + VAR_16[0][1]) * VAR_14;

        s->sprite_delta[1][1] = (-VAR_4 * VAR_15[0][1] + VAR_16[1][1]) * VAR_13;



        VAR_0->sprite_shift[0]  = VAR_5 + VAR_6 + VAR_3 - VAR_9;

        VAR_0->sprite_shift[1]  = VAR_5 + VAR_6 + VAR_3 - VAR_9 + 2;

        break;

    }

    

    if (s->sprite_delta[0][0] == VAR_2 << VAR_0->sprite_shift[0] &&

        s->sprite_delta[0][1] == 0 &&

        s->sprite_delta[1][0] == 0 &&

        s->sprite_delta[1][1] == VAR_2 << VAR_0->sprite_shift[0]) {

        s->sprite_offset[0][0] >>= VAR_0->sprite_shift[0];

        s->sprite_offset[0][1] >>= VAR_0->sprite_shift[0];

        s->sprite_offset[1][0] >>= VAR_0->sprite_shift[1];

        s->sprite_offset[1][1] >>= VAR_0->sprite_shift[1];

        s->sprite_delta[0][0] = VAR_2;

        s->sprite_delta[0][1] = 0;

        s->sprite_delta[1][0] = 0;

        s->sprite_delta[1][1] = VAR_2;

        VAR_0->sprite_shift[0] = 0;

        VAR_0->sprite_shift[1] = 0;

        s->real_sprite_warping_points = 1;

    } else {

        int VAR_19 = 16 - VAR_0->sprite_shift[0];

        int VAR_20 = 16 - VAR_0->sprite_shift[1];

        for (VAR_10 = 0; VAR_10 < 2; VAR_10++) {

            s->sprite_offset[0][VAR_10] <<= VAR_19;

            s->sprite_offset[1][VAR_10] <<= VAR_20;

            s->sprite_delta[0][VAR_10]  <<= VAR_19;

            s->sprite_delta[1][VAR_10]  <<= VAR_19;

            VAR_0->sprite_shift[VAR_10]     = 16;

        }

        s->real_sprite_warping_points = VAR_0->num_sprite_warping_points;

    }



    return 0;

}

static int FUNC_0(Mpeg4DecContext *VAR_0, GetBitContext *VAR_1)
{ MpegEncContext *s = &VAR_0->m; int VAR_2     = 2 << s->sprite_warping_accuracy; int VAR_3   = 3  - s->sprite_warping_accuracy; int VAR_4     = 16 / VAR_2; int VAR_5 = 0; int VAR_6  = 0; int VAR_7     = s->width; int VAR_8     = s->height; int VAR_9, VAR_10, VAR_11, VAR_12, VAR_13, VAR_14; int VAR_15[4][2]; int VAR_16[2][2]; const int VAR_17[4][2] = { { 0, 0 },         { s->width, 0 }, { 0, s->height }, { s->width, s->height } }; int VAR_18[4][2]             = { { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 } }; if (VAR_7 <= 0 || VAR_8 <= 0)
return AVERROR_INVALIDDATA; for (VAR_10 = 0; VAR_10 < VAR_0->num_sprite_warping_points; VAR_10++) { int length; int x = 0, y = 0; length = get_vlc2(VAR_1, sprite_trajectory.table, SPRITE_TRAJ_VLC_BITS, 3); if (length)
x = get_xbits(VAR_1, length); if (!(VAR_0->divx_version == 500 && VAR_0->divx_build == 413))
skip_bits1(VAR_1); length = get_vlc2(VAR_1, sprite_trajectory.table, SPRITE_TRAJ_VLC_BITS, 3); if (length)
y = get_xbits(VAR_1, length); skip_bits1(VAR_1); VAR_0->sprite_traj[VAR_10][0] = VAR_18[VAR_10][0] = x; VAR_0->sprite_traj[VAR_10][1] = VAR_18[VAR_10][1] = y; } for (; VAR_10 < 4; VAR_10++) VAR_0->sprite_traj[VAR_10][0] = VAR_0->sprite_traj[VAR_10][1] = 0; while ((1 << VAR_5) < VAR_7)
VAR_5++; while ((1 << VAR_6) < VAR_8)
VAR_6++; VAR_11 = 1 << VAR_5; VAR_12 = 1 << VAR_6; if (VAR_0->divx_version == 500 && VAR_0->divx_build == 413) { VAR_15[0][0] = VAR_2 * VAR_17[0][0] + VAR_18[0][0]; VAR_15[0][1] = VAR_2 * VAR_17[0][1] + VAR_18[0][1]; VAR_15[1][0] = VAR_2 * VAR_17[1][0] + VAR_18[0][0] + VAR_18[1][0]; VAR_15[1][1] = VAR_2 * VAR_17[1][1] + VAR_18[0][1] + VAR_18[1][1]; VAR_15[2][0] = VAR_2 * VAR_17[2][0] + VAR_18[0][0] + VAR_18[2][0]; VAR_15[2][1] = VAR_2 * VAR_17[2][1] + VAR_18[0][1] + VAR_18[2][1]; } else { VAR_15[0][0] = (VAR_2 >> 1) * (2 * VAR_17[0][0] + VAR_18[0][0]); VAR_15[0][1] = (VAR_2 >> 1) * (2 * VAR_17[0][1] + VAR_18[0][1]); VAR_15[1][0] = (VAR_2 >> 1) * (2 * VAR_17[1][0] + VAR_18[0][0] + VAR_18[1][0]); VAR_15[1][1] = (VAR_2 >> 1) * (2 * VAR_17[1][1] + VAR_18[0][1] + VAR_18[1][1]); VAR_15[2][0] = (VAR_2 >> 1) * (2 * VAR_17[2][0] + VAR_18[0][0] + VAR_18[2][0]); VAR_15[2][1] = (VAR_2 >> 1) * (2 * VAR_17[2][1] + VAR_18[0][1] + VAR_18[2][1]); } VAR_16[0][0] = 16 * (VAR_17[0][0] + VAR_11) +
ROUNDED_DIV(((VAR_7 - VAR_11) *
(VAR_4 * VAR_15[0][0] - 16 * VAR_17[0][0]) +
VAR_11 * (VAR_4 * VAR_15[1][0] - 16 * VAR_17[1][0])), VAR_7); VAR_16[0][1] = 16 * VAR_17[0][1] +
ROUNDED_DIV(((VAR_7 - VAR_11) *
(VAR_4 * VAR_15[0][1] - 16 * VAR_17[0][1]) +
VAR_11 * (VAR_4 * VAR_15[1][1] - 16 * VAR_17[1][1])), VAR_7); VAR_16[1][0] = 16 * VAR_17[0][0] +
ROUNDED_DIV(((VAR_8 - VAR_12) * (VAR_4 * VAR_15[0][0] - 16 * VAR_17[0][0]) +
VAR_12 * (VAR_4 * VAR_15[2][0] - 16 * VAR_17[2][0])), VAR_8); VAR_16[1][1] = 16 * (VAR_17[0][1] + VAR_12) +
ROUNDED_DIV(((VAR_8 - VAR_12) * (VAR_4 * VAR_15[0][1] - 16 * VAR_17[0][1]) +
VAR_12 * (VAR_4 * VAR_15[2][1] - 16 * VAR_17[2][1])), VAR_8); switch (VAR_0->num_sprite_warping_points) { case 0:
s->sprite_offset[0][0] =
s->sprite_offset[0][1] =
s->sprite_offset[1][0] =
s->sprite_offset[1][1] = 0; s->sprite_delta[0][0]  = VAR_2; s->sprite_delta[0][1]  =
s->sprite_delta[1][0]  = 0; s->sprite_delta[1][1]  = VAR_2; VAR_0->sprite_shift[0]   =
VAR_0->sprite_shift[1]   = 0; break; case 1:
s->sprite_offset[0][0] = VAR_15[0][0] - VAR_2 * VAR_17[0][0]; s->sprite_offset[0][1] = VAR_15[0][1] - VAR_2 * VAR_17[0][1]; s->sprite_offset[1][0] = ((VAR_15[0][0] >> 1) | (VAR_15[0][0] & 1)) -
VAR_2 * (VAR_17[0][0] / 2); s->sprite_offset[1][1] = ((VAR_15[0][1] >> 1) | (VAR_15[0][1] & 1)) -
VAR_2 * (VAR_17[0][1] / 2); s->sprite_delta[0][0]  = VAR_2; s->sprite_delta[0][1]  =
s->sprite_delta[1][0]  = 0; s->sprite_delta[1][1]  = VAR_2; VAR_0->sprite_shift[0]   =
VAR_0->sprite_shift[1]   = 0; break; case 2:
s->sprite_offset[0][0] = (VAR_15[0][0] << (VAR_5 + VAR_3)) +
(-VAR_4 * VAR_15[0][0] + VAR_16[0][0]) *
(-VAR_17[0][0]) +
(VAR_4 * VAR_15[0][1] - VAR_16[0][1]) *
(-VAR_17[0][1]) + (1 << (VAR_5 + VAR_3 - 1)); s->sprite_offset[0][1] = (VAR_15[0][1] << (VAR_5 + VAR_3)) +
(-VAR_4 * VAR_15[0][1] + VAR_16[0][1]) *
(-VAR_17[0][0]) +
(-VAR_4 * VAR_15[0][0] + VAR_16[0][0]) *
(-VAR_17[0][1]) + (1 << (VAR_5 + VAR_3 - 1)); s->sprite_offset[1][0] = ((-VAR_4 * VAR_15[0][0] + VAR_16[0][0]) *
(-2 * VAR_17[0][0] + 1) +
(VAR_4 * VAR_15[0][1] - VAR_16[0][1]) *
(-2 * VAR_17[0][1] + 1) + 2 * VAR_11 * VAR_4 *
VAR_15[0][0] - 16 * VAR_11 + (1 << (VAR_5 + VAR_3 + 1))); s->sprite_offset[1][1] = ((-VAR_4 * VAR_15[0][1] + VAR_16[0][1]) *
(-2 * VAR_17[0][0] + 1) +
(-VAR_4 * VAR_15[0][0] + VAR_16[0][0]) *
(-2 * VAR_17[0][1] + 1) + 2 * VAR_11 * VAR_4 *
VAR_15[0][1] - 16 * VAR_11 + (1 << (VAR_5 + VAR_3 + 1))); s->sprite_delta[0][0] = (-VAR_4 * VAR_15[0][0] + VAR_16[0][0]); s->sprite_delta[0][1] = (+VAR_4 * VAR_15[0][1] - VAR_16[0][1]); s->sprite_delta[1][0] = (-VAR_4 * VAR_15[0][1] + VAR_16[0][1]); s->sprite_delta[1][1] = (-VAR_4 * VAR_15[0][0] + VAR_16[0][0]); VAR_0->sprite_shift[0]  = VAR_5 + VAR_3; VAR_0->sprite_shift[1]  = VAR_5 + VAR_3 + 2; break; case 3:
VAR_9 = FFMIN(VAR_5, VAR_6); VAR_13     = VAR_11 >> VAR_9; VAR_14     = VAR_12 >> VAR_9; s->sprite_offset[0][0] = (VAR_15[0][0] << (VAR_5 + VAR_6 + VAR_3 - VAR_9)) +
(-VAR_4 * VAR_15[0][0] + VAR_16[0][0]) *
VAR_14 * (-VAR_17[0][0]) +
(-VAR_4 * VAR_15[0][0] + VAR_16[1][0]) *
VAR_13 * (-VAR_17[0][1]) +
(1 << (VAR_5 + VAR_6 + VAR_3 - VAR_9 - 1)); s->sprite_offset[0][1] = (VAR_15[0][1] << (VAR_5 + VAR_6 + VAR_3 - VAR_9)) +
(-VAR_4 * VAR_15[0][1] + VAR_16[0][1]) *
VAR_14 * (-VAR_17[0][0]) +
(-VAR_4 * VAR_15[0][1] + VAR_16[1][1]) *
VAR_13 * (-VAR_17[0][1]) +
(1 << (VAR_5 + VAR_6 + VAR_3 - VAR_9 - 1)); s->sprite_offset[1][0] = (-VAR_4 * VAR_15[0][0] + VAR_16[0][0]) *
VAR_14 * (-2 * VAR_17[0][0] + 1) +
(-VAR_4 * VAR_15[0][0] + VAR_16[1][0]) *
VAR_13 * (-2 * VAR_17[0][1] + 1) + 2 * VAR_11 * VAR_14 *
VAR_4 * VAR_15[0][0] - 16 * VAR_11 * VAR_14 +
(1 << (VAR_5 + VAR_6 + VAR_3 - VAR_9 + 1)); s->sprite_offset[1][1] = (-VAR_4 * VAR_15[0][1] + VAR_16[0][1]) *
VAR_14 * (-2 * VAR_17[0][0] + 1) +
(-VAR_4 * VAR_15[0][1] + VAR_16[1][1]) *
VAR_13 * (-2 * VAR_17[0][1] + 1) + 2 * VAR_11 * VAR_14 *
VAR_4 * VAR_15[0][1] - 16 * VAR_11 * VAR_14 +
(1 << (VAR_5 + VAR_6 + VAR_3 - VAR_9 + 1)); s->sprite_delta[0][0] = (-VAR_4 * VAR_15[0][0] + VAR_16[0][0]) * VAR_14; s->sprite_delta[0][1] = (-VAR_4 * VAR_15[0][0] + VAR_16[1][0]) * VAR_13; s->sprite_delta[1][0] = (-VAR_4 * VAR_15[0][1] + VAR_16[0][1]) * VAR_14; s->sprite_delta[1][1] = (-VAR_4 * VAR_15[0][1] + VAR_16[1][1]) * VAR_13; VAR_0->sprite_shift[0]  = VAR_5 + VAR_6 + VAR_3 - VAR_9; VAR_0->sprite_shift[1]  = VAR_5 + VAR_6 + VAR_3 - VAR_9 + 2; break; } if (s->sprite_delta[0][0] == VAR_2 << VAR_0->sprite_shift[0] &&
s->sprite_delta[0][1] == 0 &&
s->sprite_delta[1][0] == 0 &&
s->sprite_delta[1][1] == VAR_2 << VAR_0->sprite_shift[0]) { s->sprite_offset[0][0] >>= VAR_0->sprite_shift[0]; s->sprite_offset[0][1] >>= VAR_0->sprite_shift[0]; s->sprite_offset[1][0] >>= VAR_0->sprite_shift[1]; s->sprite_offset[1][1] >>= VAR_0->sprite_shift[1]; s->sprite_delta[0][0] = VAR_2; s->sprite_delta[0][1] = 0; s->sprite_delta[1][0] = 0; s->sprite_delta[1][1] = VAR_2; VAR_0->sprite_shift[0] = 0; VAR_0->sprite_shift[1] = 0; s->real_sprite_warping_points = 1; } else { int VAR_19 = 16 - VAR_0->sprite_shift[0]; int VAR_20 = 16 - VAR_0->sprite_shift[1]; for (VAR_10 = 0; VAR_10 < 2; VAR_10++) { s->sprite_offset[0][VAR_10] <<= VAR_19; s->sprite_offset[1][VAR_10] <<= VAR_20; s->sprite_delta[0][VAR_10]  <<= VAR_19; s->sprite_delta[1][VAR_10]  <<= VAR_19; VAR_0->sprite_shift[VAR_10]     = 16; } s->real_sprite_warping_points = VAR_0->num_sprite_warping_points; } return 0; }