[Spice-devel] [PATCH spice-html5 2/3] Implement support for sized data streams.

Jeremy White jwhite at codeweavers.com
Wed Jun 3 15:22:54 PDT 2015


Signed-off-by: Jeremy White <jwhite at codeweavers.com>
---
 display.js   | 60 ++++++++++++++++++++++++++++++++++++++----------------------
 enums.js     | 11 +++++++++++
 spiceconn.js |  4 ++++
 spicemsg.js  | 23 +++++++++++++++++++++++
 4 files changed, 76 insertions(+), 22 deletions(-)

diff --git a/display.js b/display.js
index a749dae..7027230 100644
--- a/display.js
+++ b/display.js
@@ -487,32 +487,21 @@ SpiceDisplayConn.prototype.process_channel_message = function(msg)
         }
         if (this.streams[m.base.id].codec_type === SPICE_VIDEO_CODEC_TYPE_MJPEG)
         {
-            var tmpstr = "data:image/jpeg,";
-            var img = new Image;
-            var i;
-            for (i = 0; i < m.data.length; i++)
-            {
-                tmpstr +=  '%';
-                if (m.data[i] < 16)
-                tmpstr += '0';
-                tmpstr += m.data[i].toString(16);
-            }
-            var strm_base = new SpiceMsgDisplayBase();
-            strm_base.surface_id = this.streams[m.base.id].surface_id;
-            strm_base.box = this.streams[m.base.id].dest;
-            strm_base.clip = this.streams[m.base.id].clip;
-            img.o =
-                { base: strm_base,
-                  tag: "mjpeg." + m.base.id,
-                  descriptor: null,
-                  sc : this,
-                };
-            img.onload = handle_draw_jpeg_onload;
-            img.src = tmpstr;
+            process_mjpeg_stream_data(this, m);
+
         }
         return true;
     }
 
+    if (msg.type == SPICE_MSG_DISPLAY_STREAM_DATA_SIZED)
+    {
+        var m = new SpiceMsgDisplayStreamDataSized(msg.data);
+        if (this.streams[m.base.id].codec_type === SPICE_VIDEO_CODEC_TYPE_MJPEG)
+            process_mjpeg_stream_data(this, m);
+        return true;
+    }
+
+
     if (msg.type == SPICE_MSG_DISPLAY_STREAM_CLIP)
     {
         var m = new SpiceMsgDisplayStreamClip(msg.data);
@@ -821,3 +810,30 @@ function handle_draw_jpeg_onload()
         this.o.sc.surfaces[this.o.base.surface_id].draw_count++;
     }
 }
+
+function process_mjpeg_stream_data(sc, m)
+{
+    var tmpstr = "data:image/jpeg,";
+    var img = new Image;
+    var i;
+    for (i = 0; i < m.data.length; i++)
+    {
+        tmpstr +=  '%';
+        if (m.data[i] < 16)
+        tmpstr += '0';
+        tmpstr += m.data[i].toString(16);
+    }
+    var strm_base = new SpiceMsgDisplayBase();
+    strm_base.surface_id = sc.streams[m.base.id].surface_id;
+    strm_base.box = m.dest || sc.streams[m.base.id].dest;
+    strm_base.clip = sc.streams[m.base.id].clip;
+    img.o =
+        { base: strm_base,
+          tag: "mjpeg." + m.base.id,
+          descriptor: null,
+          sc : sc,
+        };
+    img.onload = handle_draw_jpeg_onload;
+    img.src = tmpstr;
+}
+
diff --git a/enums.js b/enums.js
index 17d77cb..7f55e46 100644
--- a/enums.js
+++ b/enums.js
@@ -127,6 +127,10 @@ var SPICE_MSG_DISPLAY_DRAW_TRANSPARENT  = 312;
 var SPICE_MSG_DISPLAY_DRAW_ALPHA_BLEND  = 313;
 var SPICE_MSG_DISPLAY_SURFACE_CREATE    = 314;
 var SPICE_MSG_DISPLAY_SURFACE_DESTROY   = 315;
+var SPICE_MSG_DISPLAY_STREAM_DATA_SIZED = 316;
+var SPICE_MSG_DISPLAY_MONITORS_CONFIG   = 317;
+var SPICE_MSG_DISPLAY_DRAW_COMPOSITE    = 318;
+var SPICE_MSG_DISPLAY_STREAM_ACTIVATE_REPORT = 319;
 
 var SPICE_MSGC_DISPLAY_INIT             = 101;
 
@@ -171,6 +175,13 @@ var SPICE_MAIN_CAP_NAME_AND_UUID          = 1;
 var SPICE_MAIN_CAP_AGENT_CONNECTED_TOKENS = 2;
 var SPICE_MAIN_CAP_SEAMLESS_MIGRATE       = 3;
 
+var SPICE_DISPLAY_CAP_SIZED_STREAM        = 0;
+var SPICE_DISPLAY_CAP_MONITORS_CONFIG     = 1;
+var SPICE_DISPLAY_CAP_COMPOSITE           = 2;
+var SPICE_DISPLAY_CAP_A8_SURFACE          = 3;
+var SPICE_DISPLAY_CAP_STREAM_REPORT       = 4;
+var SPICE_DISPLAY_CAP_LZ4_COMPRESSION     = 5;
+
 var SPICE_AUDIO_DATA_MODE_INVALID       = 0;
 var SPICE_AUDIO_DATA_MODE_RAW           = 1;
 var SPICE_AUDIO_DATA_MODE_CELT_0_5_1    = 2;
diff --git a/spiceconn.js b/spiceconn.js
index ec42d8d..b7043c0 100644
--- a/spiceconn.js
+++ b/spiceconn.js
@@ -133,6 +133,10 @@ SpiceConn.prototype =
             msg.channel_caps.push(
                 (1 << SPICE_MAIN_CAP_AGENT_CONNECTED_TOKENS)
             );
+        else if (msg.channel_type == SPICE_CHANNEL_DISPLAY)
+            msg.channel_caps.push(
+                (1 << SPICE_DISPLAY_CAP_SIZED_STREAM)
+            );
 
         hdr.size = msg.buffer_size();
 
diff --git a/spicemsg.js b/spicemsg.js
index e167b3d..4b78d94 100644
--- a/spicemsg.js
+++ b/spicemsg.js
@@ -1146,6 +1146,29 @@ SpiceMsgDisplayStreamData.prototype =
     },
 }
 
+function SpiceMsgDisplayStreamDataSized(a, at)
+{
+    this.from_buffer(a, at);
+}
+
+SpiceMsgDisplayStreamDataSized.prototype =
+{
+    from_buffer: function(a, at)
+    {
+        at = at || 0;
+        var dv = new SpiceDataView(a);
+        this.base = new SpiceStreamDataHeader;
+        at = this.base.from_dv(dv, at, a);
+        this.width = dv.getUint32(at, true); at += 4;
+        this.height = dv.getUint32(at, true); at += 4;
+        this.dest = new SpiceRect;
+        at = this.dest.from_dv(dv, at, a);
+        this.data_size = dv.getUint32(at, true); at += 4;
+        this.data = dv.u8.subarray(at, at + this.data_size);
+    },
+}
+
+
 function SpiceMsgDisplayStreamClip(a, at)
 {
     this.from_buffer(a, at);
-- 
2.1.4



More information about the Spice-devel mailing list