Implement support for sized data streams.

This commit is contained in:
Jeremy White 2015-06-03 11:45:18 -05:00
parent e542bda56f
commit 84562db7e4
4 changed files with 76 additions and 22 deletions

View File

@ -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;
}

View File

@ -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;

View File

@ -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();

View File

@ -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);