[Spice-devel] [client 1/3] streaming: Remove the display_stream dependency on SpiceMsgIn messages

Christophe Fergeau cfergeau at redhat.com
Wed Apr 5 08:52:01 UTC 2017


On Tue, Apr 04, 2017 at 05:45:28PM +0200, Francois Gouget wrote:
> Code-wise this improves the separation between networking and the video
> decoding.
> It also makes it easier to reuse the latter should the client one day
> receive video streams through other messages.

Ok, this moves message parsing to display_handle_stream_create() rather
than doing it when needed later on. I'd add this to the commit log to
make it easier to parse the patch :) Makes sense to me, and from a quick
glance, code looked ok.

Christophe

> 
> Signed-off-by: Francois Gouget <fgouget at codeweavers.com>
> ---
>  src/channel-display-priv.h |  7 +++----
>  src/channel-display.c      | 37 ++++++++++---------------------------
>  2 files changed, 13 insertions(+), 31 deletions(-)
> 
> diff --git a/src/channel-display-priv.h b/src/channel-display-priv.h
> index b9c08a35..60cc8efa 100644
> --- a/src/channel-display-priv.h
> +++ b/src/channel-display-priv.h
> @@ -99,12 +99,11 @@ typedef struct drops_sequence_stats {
>  } drops_sequence_stats;
>  
>  struct display_stream {
> -    SpiceMsgIn                  *msg_create;
> -    SpiceMsgIn                  *msg_clip;
> -
>      /* from messages */
> +    uint32_t flags;
> +    SpiceRect dest;
>      display_surface             *surface;
> -    const SpiceClip             *clip;
> +    SpiceClip                   clip;
>      QRegion                     region;
>      int                         have_region;
>  
> diff --git a/src/channel-display.c b/src/channel-display.c
> index 7a5a23bb..2423fb0e 100644
> --- a/src/channel-display.c
> +++ b/src/channel-display.c
> @@ -1118,11 +1118,11 @@ static void display_update_stream_region(display_stream *st)
>  {
>      int i;
>  
> -    switch (st->clip->type) {
> +    switch (st->clip.type) {
>      case SPICE_CLIP_TYPE_RECTS:
>          region_clear(&st->region);
> -        for (i = 0; i < st->clip->rects->num_rects; i++) {
> -            region_add(&st->region, &st->clip->rects->rects[i]);
> +        for (i = 0; i < st->clip.rects->num_rects; i++) {
> +            region_add(&st->region, &st->clip.rects->rects[i]);
>          }
>          st->have_region = true;
>          break;
> @@ -1191,9 +1191,9 @@ static void display_handle_stream_create(SpiceChannel *channel, SpiceMsgIn *in)
>      c->streams[op->id] = g_new0(display_stream, 1);
>      st = c->streams[op->id];
>  
> -    st->msg_create = in;
> -    spice_msg_in_ref(in);
> -    st->clip = &op->clip;
> +    st->flags = op->flags;
> +    st->dest = op->dest;
> +    st->clip = op->clip;
>      st->surface = find_surface(c, op->surface_id);
>      st->channel = channel;
>      st->drops_seqs_stats_arr = g_array_new(FALSE, FALSE, sizeof(drops_sequence_stats));
> @@ -1225,9 +1225,7 @@ static const SpiceRect *stream_get_dest(display_stream *st, SpiceMsgIn *frame_ms
>  {
>      if (frame_msg == NULL ||
>          spice_msg_in_type(frame_msg) != SPICE_MSG_DISPLAY_STREAM_DATA_SIZED) {
> -        SpiceMsgDisplayStreamCreate *info = spice_msg_in_parsed(st->msg_create);
> -
> -        return &info->dest;
> +        return &st->dest;
>      } else {
>          SpiceMsgDisplayStreamDataSized *op = spice_msg_in_parsed(frame_msg);
>  
> @@ -1236,13 +1234,6 @@ static const SpiceRect *stream_get_dest(display_stream *st, SpiceMsgIn *frame_ms
>  
>  }
>  
> -static uint32_t stream_get_flags(display_stream *st)
> -{
> -    SpiceMsgDisplayStreamCreate *info = spice_msg_in_parsed(st->msg_create);
> -
> -    return info->flags;
> -}
> -
>  G_GNUC_INTERNAL
>  uint32_t spice_msg_in_frame_data(SpiceMsgIn *frame_msg, uint8_t **data)
>  {
> @@ -1288,7 +1279,7 @@ void stream_display_frame(display_stream *st, SpiceMsgIn *frame_msg,
>      dest = stream_get_dest(st, frame_msg);
>  
>      stride = width * sizeof(uint32_t);
> -    if (!(stream_get_flags(st) & SPICE_STREAM_FLAGS_TOP_DOWN)) {
> +    if (!(st->flags & SPICE_STREAM_FLAGS_TOP_DOWN)) {
>          data += stride * (height - 1);
>          stride = -stride;
>      }
> @@ -1502,12 +1493,8 @@ static void display_handle_stream_clip(SpiceChannel *channel, SpiceMsgIn *in)
>      display_stream *st = get_stream_by_id(channel, op->id);
>  
>      g_return_if_fail(st != NULL);
> -    if (st->msg_clip) {
> -        spice_msg_in_unref(st->msg_clip);
> -    }
> -    spice_msg_in_ref(in);
> -    st->msg_clip = in;
> -    st->clip = &op->clip;
> +
> +    st->clip = op->clip;
>      display_update_stream_region(st);
>  }
>  
> @@ -1561,10 +1548,6 @@ static void destroy_stream(SpiceChannel *channel, int id)
>          st->video_decoder->destroy(st->video_decoder);
>      }
>  
> -    if (st->msg_clip)
> -        spice_msg_in_unref(st->msg_clip);
> -    spice_msg_in_unref(st->msg_create);
> -
>      g_free(st);
>      c->streams[id] = NULL;
>  }
> -- 
> 2.11.0
> 
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/spice-devel
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 801 bytes
Desc: not available
URL: <https://lists.freedesktop.org/archives/spice-devel/attachments/20170405/4ab846bc/attachment.sig>


More information about the Spice-devel mailing list