[Spice-devel] [RFC PATCH spice-server v3 09/20] stream-channel: Allows not fixed size
Frediano Ziglio
fziglio at redhat.com
Fri Aug 25 09:35:18 UTC 2017
>
> On Wed, 2017-08-23 at 10:14 +0100, Frediano Ziglio wrote:
> > Remove the fixed size stream and support any display size.
> >
> > Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
> > ---
> > server/stream-channel.c | 31 +++++++++++++++++++++++++------
> > 1 file changed, 25 insertions(+), 6 deletions(-)
> >
> > diff --git a/server/stream-channel.c b/server/stream-channel.c
> > index 4ab378a8..08c51272 100644
> > --- a/server/stream-channel.c
> > +++ b/server/stream-channel.c
> > @@ -66,6 +66,8 @@ struct StreamChannel {
> > /* current video stream id, <0 if not initialized or
> > * we are not sending a stream */
> > int stream_id;
> > + /* size of the current video stream */
> > + unsigned width, height;
> > };
> >
> > struct StreamChannelClass {
> > @@ -76,6 +78,7 @@ G_DEFINE_TYPE(StreamChannel, stream_channel,
> > RED_TYPE_CHANNEL)
> >
> > enum {
> > RED_PIPE_ITEM_TYPE_SURFACE_CREATE =
> > RED_PIPE_ITEM_TYPE_COMMON_LAST,
> > + RED_PIPE_ITEM_TYPE_SURFACE_DESTROY,
> > RED_PIPE_ITEM_TYPE_FILL_SURFACE,
> > RED_PIPE_ITEM_TYPE_STREAM_CREATE,
> > RED_PIPE_ITEM_TYPE_STREAM_DATA,
> > @@ -130,12 +133,12 @@ stream_channel_client_new(StreamChannel
> > *channel, RedClient *client, RedsStream
> > }
> >
> > static void
> > -fill_base(SpiceMarshaller *m)
> > +fill_base(SpiceMarshaller *m, const StreamChannel *channel)
> > {
> > SpiceMsgDisplayBase base;
> >
> > base.surface_id = PRIMARY_SURFACE_ID;
> > - base.box = (SpiceRect) { 0, 0, 1024, 768 };
> > + base.box = (SpiceRect) { 0, 0, channel->width, channel->height
> > };
> > base.clip = (SpiceClip) { SPICE_CLIP_TYPE_NONE, NULL };
> >
> > spice_marshall_DisplayBase(m, &base);
> > @@ -146,22 +149,29 @@ stream_channel_send_item(RedChannelClient *rcc,
> > RedPipeItem *pipe_item)
> > {
> > SpiceMarshaller *m = red_channel_client_get_marshaller(rcc);
> > StreamChannelClient *client = STREAM_CHANNEL_CLIENT(rcc);
> > + StreamChannel *channel =
> > STREAM_CHANNEL(red_channel_client_get_channel(rcc));
> >
> > switch (pipe_item->type) {
> > case RED_PIPE_ITEM_TYPE_SURFACE_CREATE: {
> > red_channel_client_init_send_data(rcc,
> > SPICE_MSG_DISPLAY_SURFACE_CREATE);
> > SpiceMsgSurfaceCreate surface_create = {
> > PRIMARY_SURFACE_ID,
> > - 1024, 768,
> > + channel->width, channel->height,
> > SPICE_SURFACE_FMT_32_xRGB, SPICE_SURFACE_FLAGS_PRIMARY
> > };
> > spice_marshall_msg_display_surface_create(m,
> > &surface_create);
> > break;
> > }
> > + case RED_PIPE_ITEM_TYPE_SURFACE_DESTROY: {
> > + red_channel_client_init_send_data(rcc,
> > SPICE_MSG_DISPLAY_SURFACE_DESTROY);
> > + SpiceMsgSurfaceDestroy surface_destroy = {
> > PRIMARY_SURFACE_ID };
> > + spice_marshall_msg_display_surface_destroy(m,
> > &surface_destroy);
> > + break;
> > + }
> > case RED_PIPE_ITEM_TYPE_FILL_SURFACE: {
> > red_channel_client_init_send_data(rcc,
> > SPICE_MSG_DISPLAY_DRAW_FILL);
> >
> > - fill_base(m);
> > + fill_base(m, channel);
> >
> > SpiceFill fill;
> > fill.brush = (SpiceBrush) { SPICE_BRUSH_TYPE_SOLID, { .color
> > = 0 } };
> > @@ -260,7 +270,7 @@ stream_channel_connect(RedChannel *red_channel,
> > RedClient *red_client, RedsStrea
> > // "emulate" dcc_start
> > // TODO only if "surface"
> > red_channel_client_pipe_add_empty_msg(rcc,
> > SPICE_MSG_DISPLAY_INVAL_ALL_PALETTES);
> > - // TODO pass proper data
> > + // pass proper data
>
> This is an odd change?
>
This reflect the change in RED_PIPE_ITEM_TYPE_SURFACE_CREATE
implementation.
> > red_channel_client_pipe_add_type(rcc,
> > RED_PIPE_ITEM_TYPE_SURFACE_CREATE);
> > // surface data
> > red_channel_client_pipe_add_type(rcc,
> > RED_PIPE_ITEM_TYPE_FILL_SURFACE);
> > @@ -306,6 +316,8 @@ static void
> > stream_channel_init(StreamChannel *channel)
> > {
> > channel->stream_id = -1;
> > + channel->width = 1024;
> > + channel->height = 768;
> > }
> >
> > static RedPipeItem *
> > @@ -324,7 +336,14 @@ stream_channel_change_format(StreamChannel
> > *channel, const StreamMsgFormat *fmt)
> > // send destroy old stream
> > red_channel_pipes_add_type(red_channel,
> > RED_PIPE_ITEM_TYPE_STREAM_DESTROY);
> >
> > - // TODO send new create surface if required
> > + // send new create surface if required
> > + if (channel->width != fmt->width || channel->height != fmt-
> > >height) {
> > + channel->width = fmt->width;
> > + channel->height = fmt->height;
> > + red_channel_pipes_add_type(red_channel,
> > RED_PIPE_ITEM_TYPE_SURFACE_DESTROY);
> > + red_channel_pipes_add_type(red_channel,
> > RED_PIPE_ITEM_TYPE_SURFACE_CREATE);
> > + // TODO monitors config ??
> > + }
> >
> > // allocate a new stream id
> > channel->stream_id = (channel->stream_id + 1) % NUM_STREAMS;
>
>
> Acked-by: Jonathon Jongsma <jjongsma at redhat.com>
>
>
More information about the Spice-devel
mailing list