On Thu, 2017-08-10 at 20:51 +0100, Frediano Ziglio wrote: > This protocol allows a guest to send a video stream to the server. > > Signed-off-by: Frediano Ziglio <fziglio@xxxxxxxxxx> > --- > spice/Makefile.am | 1 + > spice/stream-device.h | 128 > ++++++++++++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 129 insertions(+) > create mode 100644 spice/stream-device.h > > diff --git a/spice/Makefile.am b/spice/Makefile.am > index a54ae89..4f9a607 100644 > --- a/spice/Makefile.am > +++ b/spice/Makefile.am > @@ -19,6 +19,7 @@ spice_protocol_include_HEADERS = \ > types.h \ > vd_agent.h \ > vdi_dev.h \ > + stream-device.h \ > $(NULL) > > -include $(top_srcdir)/git.mk > diff --git a/spice/stream-device.h b/spice/stream-device.h > new file mode 100644 > index 0000000..2441ac1 > --- /dev/null > +++ b/spice/stream-device.h > @@ -0,0 +1,128 @@ > +/* > + Copyright (C) 2017 Red Hat, Inc. > + > + Redistribution and use in source and binary forms, with or > without > + modification, are permitted provided that the following > conditions are > + met: > + > + * Redistributions of source code must retain the above > copyright > + notice, this list of conditions and the following > disclaimer. > + * Redistributions in binary form must reproduce the above > copyright > + notice, this list of conditions and the following > disclaimer in > + the documentation and/or other materials provided with the > + distribution. > + * Neither the name of the copyright holder nor the names of > its > + contributors may be used to endorse or promote products > derived > + from this software without specific prior written > permission. > + > + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND > CONTRIBUTORS "AS > + IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT > LIMITED > + TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A > + PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE > COPYRIGHT > + HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, > INCIDENTAL, > + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT > + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF > USE, > + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON > ANY > + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR > TORT > + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE > USE > + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH > DAMAGE. > +*/ > + > +/* > + * This header contains definition for the device that > + * allows to send streamed data to the server. > + * > + * The device is currently implemented as a VirtIO port inside the > + * guest. The guest should open that device to use this protocol to > + * communicate with the host. > + * The name of the port is "com.redhat.stream.0". > + */ > + > +#ifndef SPICE_STREAM_DEVICE_H_ > +#define SPICE_STREAM_DEVICE_H_ > + > +#include <spice/types.h> > + > +/* > + * Structures are all "naturally aligned" > + * containing integers up to 64 bit. > + * All numbers are in little endian format. > + * > + * The protocol can be defined by these states: > + * - Initial. Device just opened. Guest should wait missing "for". Guests should wait for a message... > + * a message from the host; > + * - Idle. No streaming allowed; > + * - Ready. Server sent list of possible codecs; > + * - Streaming. Stream active, enabled by the guest. > + */ > + > +/* version of the protocol */ > +#define STREAM_DEVICE_PROTOCOL 1 > + > +typedef struct StreamDevHeader { > + /* should be STREAM_DEVICE_PROTOCOL */ > + uint8_t protocol_version; > + /* reserved, should be set to 0 */ > + uint8_t padding; > + /* as defined in StreamDevType enumeration */ > + uint16_t type; > + /* size of the following message. > + * A message of type STREAM_TYPE_XXX_YYY is represented with a > + * corresponding StreamMsgXxxYyy structure. */ > + uint32_t size; > +} StreamDevHeader; > + > +typedef enum StreamDevType { > + /* invalid, do not use */ > + STREAM_TYPE_INVALID = 0, > + /* allows to send version information */ > + STREAM_TYPE_CAPABILITIES, > + /* send screen resolution */ > + STREAM_TYPE_FORMAT, > + /* stream data */ > + STREAM_TYPE_DATA, > +} StreamDevType; The name StreamDevType makes it sound like it's a type of stream device. I think a better name would be something like StreamDevMessageType or StreamMessageType since these are message types. > + > +/* Generic extension capabilities. > + * This is a set of bit to specify which capability host and guest > supports. bit -> bits capability -> capabilities supports -> support > + * This message is sent by the host to the guest or by the guest to > the host. > + * Should be sent as first message. > + * If not sent means that guest/host doesn't support any extension. "If it is not sent, it means"... > + * Guest should sent this as a reply from same type of message sent -> send > + * from the host. > + * This message should be limited to 1024 bytes. This allows > + * plenty of negotiations. > + * > + * States allowed: Initial(host), Idle(guest) > + * state will change to Idle. > + */ > +typedef struct StreamMsgCapabilities { > + uint8_t capabilities[0]; > +} StreamMsgCapabilities; > + > +/* Define the format of the stream, start a new stream. > + * This message is sent by the guest to the host to > + * tell the host the new stream format. > + * > + * States allowed: Ready > + * state will change to Streaming. > + */ > +typedef struct StreamMsgFormat { > + /* screen resolution/stream size */ > + uint32_t width; > + uint32_t height; > + /* as defined in SpiceVideoCodecType enumeration */ > + uint8_t codec; > + uint8_t padding1[3]; > +} StreamMsgFormat; > + > +/* This message contains just raw data stream. > + * This message is sent by the guest to the host. > + * > + * States allowed: Streaming > + */ > +typedef struct StreamMsgData { > + uint8_t data[0]; > +} StreamMsgData; > + > +#endif /* SPICE_STREAM_DEVICE_H_ */ _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/spice-devel