[Spice-devel] [spice-common v3 06/12] quic: Factor common code

Frediano Ziglio fziglio at redhat.com
Fri Aug 4 07:48:25 UTC 2017


> 
> We don't need 2 different implementations when the only difference is
> the CommonState which is being used.
> 
> Signed-off-by: Christophe Fergeau <cfergeau at redhat.com>
> ---
>  common/quic.c | 194
>  ++++++++++++++++++++++------------------------------------
>  1 file changed, 73 insertions(+), 121 deletions(-)
> 
> diff --git a/common/quic.c b/common/quic.c
> index 3778bdc..1251bbd 100644
> --- a/common/quic.c
> +++ b/common/quic.c
> @@ -519,145 +519,97 @@ static void encoder_init_rle(CommonState *state)
>  }
>  
>  
> +static void encode_state_run(Encoder *encoder, CommonState *state, unsigned
> int runlen)
> +{
> +    int hits = 0;
> +
> +    while (runlen >= state->melcorder) {
> +        hits++;
> +        runlen -= state->melcorder;
> +        if (state->melcstate < MELCSTATES - 1) {
> +            state->melclen = J[++state->melcstate];
> +            state->melcorder = (1L << state->melclen);
> +        }
> +    }
> +
> +    /* send the required number of "hit" bits (one per occurrence
> +       of a run of length melcorder). This number is never too big:
> +       after 31 such "hit" bits, each "hit" would represent a run of 32K
> +       pixels.
> +    */
> +    encode_ones(encoder, hits);
> +
> +    encode(encoder, runlen, state->melclen + 1);
> +
> +    /* adjust melcoder parameters */
> +    if (state->melcstate) {
> +        state->melclen = J[--state->melcstate];
> +        state->melcorder = (1L << state->melclen);
> +    }
> +}
> +
>  static void encode_run(Encoder *encoder, unsigned int runlen) //todo: try
>  use end of line
>  {
> -    int hits = 0;
> -
> -    while (runlen >= encoder->rgb_state.melcorder) {
> -        hits++;
> -        runlen -= encoder->rgb_state.melcorder;
> -        if (encoder->rgb_state.melcstate < MELCSTATES - 1) {
> -            encoder->rgb_state.melclen = J[++encoder->rgb_state.melcstate];
> -            encoder->rgb_state.melcorder = (1L <<
> encoder->rgb_state.melclen);
> -        }
> -    }
> -
> -    /* send the required number of "hit" bits (one per occurrence
> -       of a run of length melcorder). This number is never too big:
> -       after 31 such "hit" bits, each "hit" would represent a run of 32K
> -       pixels.
> -    */
> -    encode_ones(encoder, hits);
> -
> -    encode(encoder, runlen, encoder->rgb_state.melclen + 1);
> -
> -    /* adjust melcoder parameters */
> -    if (encoder->rgb_state.melcstate) {
> -        encoder->rgb_state.melclen = J[--encoder->rgb_state.melcstate];
> -        encoder->rgb_state.melcorder = (1L << encoder->rgb_state.melclen);
> -    }
> +    encode_state_run(encoder, &encoder->rgb_state, runlen);
>  }
>  
>  static void encode_channel_run(Encoder *encoder, Channel *channel, unsigned
>  int runlen)
>  {
> -    //todo: try use end of line
> -    int hits = 0;
> -
> -    while (runlen >= channel->state.melcorder) {
> -        hits++;
> -        runlen -= channel->state.melcorder;
> -        if (channel->state.melcstate < MELCSTATES - 1) {
> -            channel->state.melclen = J[++channel->state.melcstate];
> -            channel->state.melcorder = (1L << channel->state.melclen);
> -        }
> -    }
> -
> -    /* send the required number of "hit" bits (one per occurrence
> -       of a run of length melcorder). This number is never too big:
> -       after 31 such "hit" bits, each "hit" would represent a run of 32K
> -       pixels.
> -    */
> -    encode_ones(encoder, hits);
> -
> -    encode(encoder, runlen, channel->state.melclen + 1);
> -
> -    /* adjust melcoder parameters */
> -    if (channel->state.melcstate) {
> -        channel->state.melclen = J[--channel->state.melcstate];
> -        channel->state.melcorder = (1L << channel->state.melclen);
> -    }
> +    encode_state_run(encoder, &channel->state, runlen);
>  }
>  
> +
>  /* decoding routine: reads bits from the input and returns a run length. */
>  /* argument is the number of pixels left to end-of-line (bound on run
>  length) */
>  
> +static int decode_state_run(Encoder *encoder, CommonState *state)
> +{
> +    int runlen = 0;
> +
> +    do {
> +        register int temp, hits;
> +        temp = lzeroes[(BYTE)(~(encoder->io_word >> 24))];/* number of
> leading ones in the
> +                                                                      input
> stream, up to 8 */
> +        for (hits = 1; hits <= temp; hits++) {
> +            runlen += state->melcorder;
> +
> +            if (state->melcstate < MELCSTATES - 1) {
> +                state->melclen = J[++state->melcstate];
> +                state->melcorder = (1U << state->melclen);
> +            }
> +        }
> +        if (temp != 8) {
> +            decode_eatbits(encoder, temp + 1);  /* consume the leading
> +                                                            0 of the
> remainder encoding */
> +            break;
> +        }
> +        decode_eatbits(encoder, 8);
> +    } while (1);
> +
> +    /* read the length of the remainder */
> +    if (state->melclen) {
> +        runlen += encoder->io_word >> (32 - state->melclen);
> +        decode_eatbits(encoder, state->melclen);
> +    }
> +
> +    /* adjust melcoder parameters */
> +    if (state->melcstate) {
> +        state->melclen = J[--state->melcstate];
> +        state->melcorder = (1U << state->melclen);
> +    }
> +
> +    return runlen;
> +}
> +
>  static int decode_run(Encoder *encoder)
>  {
> -    int runlen = 0;
> -
> -    do {
> -        register int temp, hits;
> -        temp = lzeroes[(BYTE)(~(encoder->io_word >> 24))];/* number of
> leading ones in the
> -                                                                      input
> stream, up to 8 */
> -        for (hits = 1; hits <= temp; hits++) {
> -            runlen += encoder->rgb_state.melcorder;
> -
> -            if (encoder->rgb_state.melcstate < MELCSTATES - 1) {
> -                encoder->rgb_state.melclen =
> J[++encoder->rgb_state.melcstate];
> -                encoder->rgb_state.melcorder = (1U <<
> encoder->rgb_state.melclen);
> -            }
> -        }
> -        if (temp != 8) {
> -            decode_eatbits(encoder, temp + 1);  /* consume the leading
> -                                                            0 of the
> remainder encoding */
> -            break;
> -        }
> -        decode_eatbits(encoder, 8);
> -    } while (1);
> -
> -    /* read the length of the remainder */
> -    if (encoder->rgb_state.melclen) {
> -        runlen += encoder->io_word >> (32 - encoder->rgb_state.melclen);
> -        decode_eatbits(encoder, encoder->rgb_state.melclen);
> -    }
> -
> -    /* adjust melcoder parameters */
> -    if (encoder->rgb_state.melcstate) {
> -        encoder->rgb_state.melclen = J[--encoder->rgb_state.melcstate];
> -        encoder->rgb_state.melcorder = (1U << encoder->rgb_state.melclen);
> -    }
> -
> -    return runlen;
> +    return decode_state_run(encoder, &encoder->rgb_state);
>  }
>  
>  
>  static int decode_channel_run(Encoder *encoder, Channel *channel)
>  {
> -    int runlen = 0;
> -
> -    do {
> -        register int temp, hits;
> -        temp = lzeroes[(BYTE)(~(encoder->io_word >> 24))];/* number of
> leading ones in the
> -                                                                      input
> stream, up to 8 */
> -        for (hits = 1; hits <= temp; hits++) {
> -            runlen += channel->state.melcorder;
> -
> -            if (channel->state.melcstate < MELCSTATES - 1) {
> -                channel->state.melclen = J[++channel->state.melcstate];
> -                channel->state.melcorder = (1U << channel->state.melclen);
> -            }
> -        }
> -        if (temp != 8) {
> -            decode_eatbits(encoder, temp + 1);  /* consume the leading
> -                                                            0 of the
> remainder encoding */
> -            break;
> -        }
> -        decode_eatbits(encoder, 8);
> -    } while (1);
> -
> -    /* read the length of the remainder */
> -    if (channel->state.melclen) {
> -        runlen += encoder->io_word >> (32 - channel->state.melclen);
> -        decode_eatbits(encoder, channel->state.melclen);
> -    }
> -
> -    /* adjust melcoder parameters */
> -    if (channel->state.melcstate) {
> -        channel->state.melclen = J[--channel->state.melcstate];
> -        channel->state.melcorder = (1U << channel->state.melclen);
> -    }
> -
> -    return runlen;
> +    return decode_state_run(encoder, &channel->state);
>  }
>  
>  static inline void init_decode_io(Encoder *encoder)

Acked-by: Frediano Ziglio <fziglio at redhat.com>

Frediano


More information about the Spice-devel mailing list