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. Signed-off-by: Francois Gouget <fgouget@xxxxxxxxxxxxxxx> --- 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@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/spice-devel