[Spice-devel] [spice-html5] implement handing of MJPEG display streams
Aric Stewart
aric at codeweavers.com
Thu Sep 6 07:16:47 PDT 2012
Doh, this is what i get for not checking the list and updating this morning.
sorry, it is there thanks!
-aric
On 9/6/12 9:13 AM, Aric Stewart wrote:
> Checking in here. Looks like Jeremy acked this but it never got pushed?
>
> Could someone help me with that?
>
> thanks!
> -aric
>
> On 8/27/12 10:59 AM, Aric Stewart wrote:
>> Signed-off-by: Aric Stewart <aric at codeweavers.com>
>> ---
>> display.js | 66 ++++++++++++++++++++++++++++++++++++++++++
>> enums.js | 2 +
>> spicemsg.js | 92 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>> 3 files changed, 160 insertions(+), 0 deletions(-)
>>
>> diff --git a/display.js b/display.js
>> index 3efabb1..dd0a2e2 100644
>> --- a/display.js
>> +++ b/display.js
>> @@ -421,6 +421,72 @@ SpiceDisplayConn.prototype.process_channel_message = function(msg)
>> return true;
>> }
>>
>> + if (msg.type == SPICE_MSG_DISPLAY_STREAM_CREATE)
>> + {
>> + var m = new SpiceMsgDisplayStreamCreate(msg.data);
>> + DEBUG > 1 && console.log(this.type + ": MsgStreamCreate id" + m.id);
>> + if (!this.streams)
>> + this.streams = new Array();
>> + if (this.streams[m.id])
>> + console.log("Stream already exists");
>> + else
>> + this.streams[m.id] = m;
>> + if (m.codec_type != SPICE_VIDEO_CODEC_TYPE_MJPEG)
>> + console.log("Unhandled stream codec: "+m.codec_type);
>> + return true;
>> + }
>> +
>> + if (msg.type == SPICE_MSG_DISPLAY_STREAM_DATA)
>> + {
>> + var m = new SpiceMsgDisplayStreamData(msg.data);
>> + if (!this.streams[m.base.id])
>> + {
>> + console.log("no stream for data");
>> + return false;
>> + }
>> + 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;
>> + }
>> + return true;
>> + }
>> +
>> + if (msg.type == SPICE_MSG_DISPLAY_STREAM_CLIP)
>> + {
>> + var m = new SpiceMsgDisplayStreamClip(msg.data);
>> + DEBUG > 1 && console.log(this.type + ": MsgStreamClip id" + m.id);
>> + this.streams[m.id].clip = m.clip;
>> + return true;
>> + }
>> +
>> + if (msg.type == SPICE_MSG_DISPLAY_STREAM_DESTROY)
>> + {
>> + var m = new SpiceMsgDisplayStreamDestroy(msg.data);
>> + DEBUG > 1 && console.log(this.type + ": MsgStreamDestroy id" + m.id);
>> + this.streams[m.id] = undefined;
>> + return true;
>> + }
>>
>> return false;
>> }
>> diff --git a/enums.js b/enums.js
>> index cbf9056..fa541a4 100644
>> --- a/enums.js
>> +++ b/enums.js
>> @@ -278,3 +278,5 @@ var SPICE_CURSOR_TYPE_ALPHA = 0,
>> SPICE_CURSOR_TYPE_COLOR16 = 4,
>> SPICE_CURSOR_TYPE_COLOR24 = 5,
>> SPICE_CURSOR_TYPE_COLOR32 = 6;
>> +
>> +var SPICE_VIDEO_CODEC_TYPE_MJPEG = 1;
>> diff --git a/spicemsg.js b/spicemsg.js
>> index 79c76bc..31e54a0 100644
>> --- a/spicemsg.js
>> +++ b/spicemsg.js
>> @@ -789,3 +789,95 @@ function SpiceMsgcKeyUp(e)
>> /* Use the same functions as for KeyDown */
>> SpiceMsgcKeyUp.prototype.to_buffer = SpiceMsgcKeyDown.prototype.to_buffer;
>> SpiceMsgcKeyUp.prototype.buffer_size = SpiceMsgcKeyDown.prototype.buffer_size;
>> +
>> +function SpiceMsgDisplayStreamCreate(a, at)
>> +{
>> + this.from_buffer(a, at);
>> +}
>> +
>> +SpiceMsgDisplayStreamCreate.prototype =
>> +{
>> + from_buffer: function(a, at)
>> + {
>> + at = at || 0;
>> + var dv = new SpiceDataView(a);
>> + this.surface_id = dv.getUint32(at, true); at += 4;
>> + this.id = dv.getUint32(at, true); at += 4;
>> + this.flags = dv.getUint8(at, true); at += 1;
>> + this.codec_type = dv.getUint8(at, true); at += 1;
>> + /*stamp */ at += 8;
>> + this.stream_width = dv.getUint32(at, true); at += 4;
>> + this.stream_height = dv.getUint32(at, true); at += 4;
>> + this.src_width = dv.getUint32(at, true); at += 4;
>> + this.src_height = dv.getUint32(at, true); at += 4;
>> +
>> + this.dest = new SpiceRect;
>> + at = this.dest.from_dv(dv, at, a);
>> + this.clip = new SpiceClip;
>> + this.clip.from_dv(dv, at, a);
>> + },
>> +}
>> +
>> +function SpiceStreamDataHeader(a, at)
>> +{
>> +}
>> +
>> +SpiceStreamDataHeader.prototype =
>> +{
>> + from_dv : function(dv, at, mb)
>> + {
>> + this.id = dv.getUint32(at, true); at += 4;
>> + this.multi_media_time = dv.getUint32(at, true); at += 4;
>> + return at;
>> + },
>> +}
>> +
>> +function SpiceMsgDisplayStreamData(a, at)
>> +{
>> + this.from_buffer(a, at);
>> +}
>> +
>> +SpiceMsgDisplayStreamData.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.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);
>> +}
>> +
>> +SpiceMsgDisplayStreamClip.prototype =
>> +{
>> + from_buffer: function(a, at)
>> + {
>> + at = at || 0;
>> + var dv = new SpiceDataView(a);
>> + this.id = dv.getUint32(at, true); at += 4;
>> + this.clip = new SpiceClip;
>> + this.clip.from_dv(dv, at, a);
>> + },
>> +}
>> +
>> +function SpiceMsgDisplayStreamDestroy(a, at)
>> +{
>> + this.from_buffer(a, at);
>> +}
>> +
>> +SpiceMsgDisplayStreamDestroy.prototype =
>> +{
>> + from_buffer: function(a, at)
>> + {
>> + at = at || 0;
>> + var dv = new SpiceDataView(a);
>> + this.id = dv.getUint32(at, true); at += 4;
>> + },
>> +}
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/spice-devel
>
More information about the Spice-devel
mailing list