1
0
Fork 0
mirror of https://github.com/retspen/webvirtcloud synced 2026-07-08 20:45:41 +00:00

Compare commits

..

No commits in common. "d24d6b037de55fd11bdc7cbaf788aefb93b3635e" and "92a20c0aaa4ccdff65da6c068995bfa629e04b15" have entirely different histories.

41 changed files with 144 additions and 242 deletions

View file

@ -1,4 +1,4 @@
Django==3.2.14 Django==3.2.13
django_bootstrap5==21.2 django_bootstrap5==21.2
django-icons==21.1 django-icons==21.1
django-login-required-middleware==0.8 django-login-required-middleware==0.8
@ -6,8 +6,8 @@ django-otp==1.1.3
django-qr-code==2.3.0 django-qr-code==2.3.0
gunicorn==20.1.0 gunicorn==20.1.0
libsass==0.21.0 libsass==0.21.0
libvirt-python==8.5.0 libvirt-python==8.4.0
lxml==4.9.1 lxml==4.9.0
qrcode==7.3.1 qrcode==7.3.1
rwlock==0.0.7 rwlock==0.0.7
websockify==0.10.0 websockify==0.10.0

2
static/js/ace/ace.js Normal file → Executable file

File diff suppressed because one or more lines are too long

2
static/js/ace/ext-textarea.js Normal file → Executable file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

0
static/js/spice-html5/atKeynames.js Normal file → Executable file
View file

0
static/js/spice-html5/bitmap.js Normal file → Executable file
View file

0
static/js/spice-html5/cursor.js Normal file → Executable file
View file

7
static/js/spice-html5/display.js Normal file → Executable file
View file

@ -559,7 +559,6 @@ SpiceDisplayConn.prototype.process_channel_message = function(msg)
var v = document.createElement("video"); var v = document.createElement("video");
v.src = window.URL.createObjectURL(media); v.src = window.URL.createObjectURL(media);
v.setAttribute('muted', true);
v.setAttribute('autoplay', true); v.setAttribute('autoplay', true);
v.setAttribute('width', m.stream_width); v.setAttribute('width', m.stream_width);
v.setAttribute('height', m.stream_height); v.setAttribute('height', m.stream_height);
@ -572,7 +571,7 @@ SpiceDisplayConn.prototype.process_channel_message = function(msg)
top += this.surfaces[m.surface_id].canvas.offsetTop; top += this.surfaces[m.surface_id].canvas.offsetTop;
} }
document.getElementById(this.parent.screen_id).appendChild(v); document.getElementById(this.parent.screen_id).appendChild(v);
v.setAttribute('style', "pointer-events:none; position: absolute; top:" + top + "px; left:" + left + "px;"); v.setAttribute('style', "position: absolute; top:" + top + "px; left:" + left + "px;");
media.addEventListener('sourceopen', handle_video_source_open, false); media.addEventListener('sourceopen', handle_video_source_open, false);
media.addEventListener('sourceended', handle_video_source_ended, false); media.addEventListener('sourceended', handle_video_source_ended, false);
@ -1147,10 +1146,6 @@ function handle_append_video_buffer_done(e)
stream.video.currentTime = stream.video.buffered.start(stream.video.buffered.length - 1); stream.video.currentTime = stream.video.buffered.start(stream.video.buffered.length - 1);
} }
/* Modern browsers try not to auto play video. */
if (this.stream.video.paused && this.stream.video.readyState >= 2)
var promise = this.stream.video.play();
if (Utils.STREAM_DEBUG > 1) if (Utils.STREAM_DEBUG > 1)
console.log(stream.video.currentTime + ":id " + stream.id + " updateend " + Utils.dump_media_element(stream.video)); console.log(stream.video.currentTime + ":id " + stream.id + " updateend " + Utils.dump_media_element(stream.video));
} }

0
static/js/spice-html5/enums.js Normal file → Executable file
View file

0
static/js/spice-html5/filexfer.js Normal file → Executable file
View file

119
static/js/spice-html5/inputs.js Normal file → Executable file
View file

@ -38,8 +38,7 @@ var Meta_state = -1;
** SpiceInputsConn ** SpiceInputsConn
** Drive the Spice Inputs channel (e.g. mouse + keyboard) ** Drive the Spice Inputs channel (e.g. mouse + keyboard)
**--------------------------------------------------------------------------*/ **--------------------------------------------------------------------------*/
function SpiceInputsConn() function SpiceInputsConn() {
{
SpiceConn.apply(this, arguments); SpiceConn.apply(this, arguments);
this.mousex = undefined; this.mousex = undefined;
@ -49,26 +48,22 @@ function SpiceInputsConn()
} }
SpiceInputsConn.prototype = Object.create(SpiceConn.prototype); SpiceInputsConn.prototype = Object.create(SpiceConn.prototype);
SpiceInputsConn.prototype.process_channel_message = function(msg) SpiceInputsConn.prototype.process_channel_message = function (msg) {
{ if (msg.type == Constants.SPICE_MSG_INPUTS_INIT) {
if (msg.type == Constants.SPICE_MSG_INPUTS_INIT)
{
var inputs_init = new Messages.SpiceMsgInputsInit(msg.data); var inputs_init = new Messages.SpiceMsgInputsInit(msg.data);
this.keyboard_modifiers = inputs_init.keyboard_modifiers; this.keyboard_modifiers = inputs_init.keyboard_modifiers;
DEBUG > 1 && console.log("MsgInputsInit - modifier " + this.keyboard_modifiers); DEBUG > 1 && console.log("MsgInputsInit - modifier " + this.keyboard_modifiers);
// FIXME - We don't do anything with the keyboard modifiers... // FIXME - We don't do anything with the keyboard modifiers...
return true; return true;
} }
if (msg.type == Constants.SPICE_MSG_INPUTS_KEY_MODIFIERS) if (msg.type == Constants.SPICE_MSG_INPUTS_KEY_MODIFIERS) {
{
var key = new Messages.SpiceMsgInputsKeyModifiers(msg.data); var key = new Messages.SpiceMsgInputsKeyModifiers(msg.data);
this.keyboard_modifiers = key.keyboard_modifiers; this.keyboard_modifiers = key.keyboard_modifiers;
DEBUG > 1 && console.log("MsgInputsKeyModifiers - modifier " + this.keyboard_modifiers); DEBUG > 1 && console.log("MsgInputsKeyModifiers - modifier " + this.keyboard_modifiers);
// FIXME - We don't do anything with the keyboard modifiers... // FIXME - We don't do anything with the keyboard modifiers...
return true; return true;
} }
if (msg.type == Constants.SPICE_MSG_INPUTS_MOUSE_MOTION_ACK) if (msg.type == Constants.SPICE_MSG_INPUTS_MOUSE_MOTION_ACK) {
{
DEBUG > 1 && console.log("mouse motion ack"); DEBUG > 1 && console.log("mouse motion ack");
this.waiting_for_ack -= Constants.SPICE_INPUT_MOTION_ACK_BUNCH; this.waiting_for_ack -= Constants.SPICE_INPUT_MOTION_ACK_BUNCH;
return true; return true;
@ -78,35 +73,28 @@ SpiceInputsConn.prototype.process_channel_message = function(msg)
function handle_mousemove(e) function handle_mousemove(e) {
{
var msg = new Messages.SpiceMiniData(); var msg = new Messages.SpiceMiniData();
var move; var move;
if (this.sc.mouse_mode == Constants.SPICE_MOUSE_MODE_CLIENT) if (this.sc.mouse_mode == Constants.SPICE_MOUSE_MODE_CLIENT) {
{
move = new Messages.SpiceMsgcMousePosition(this.sc, e) move = new Messages.SpiceMsgcMousePosition(this.sc, e)
msg.build_msg(Constants.SPICE_MSGC_INPUTS_MOUSE_POSITION, move); msg.build_msg(Constants.SPICE_MSGC_INPUTS_MOUSE_POSITION, move);
} }
else else {
{
move = new Messages.SpiceMsgcMouseMotion(this.sc, e) move = new Messages.SpiceMsgcMouseMotion(this.sc, e)
msg.build_msg(Constants.SPICE_MSGC_INPUTS_MOUSE_MOTION, move); msg.build_msg(Constants.SPICE_MSGC_INPUTS_MOUSE_MOTION, move);
} }
if (this.sc && this.sc.inputs && this.sc.inputs.state === "ready") if (this.sc && this.sc.inputs && this.sc.inputs.state === "ready") {
{ if (this.sc.inputs.waiting_for_ack < (2 * Constants.SPICE_INPUT_MOTION_ACK_BUNCH)) {
if (this.sc.inputs.waiting_for_ack < (2 * Constants.SPICE_INPUT_MOTION_ACK_BUNCH))
{
this.sc.inputs.send_msg(msg); this.sc.inputs.send_msg(msg);
this.sc.inputs.waiting_for_ack++; this.sc.inputs.waiting_for_ack++;
} }
else else {
{
DEBUG > 0 && this.sc.log_info("Discarding mouse motion"); DEBUG > 0 && this.sc.log_info("Discarding mouse motion");
} }
} }
if (this.sc && this.sc.cursor && this.sc.cursor.spice_simulated_cursor) if (this.sc && this.sc.cursor && this.sc.cursor.spice_simulated_cursor) {
{
this.sc.cursor.spice_simulated_cursor.style.display = 'block'; this.sc.cursor.spice_simulated_cursor.style.display = 'block';
this.sc.cursor.spice_simulated_cursor.style.left = e.pageX - this.sc.cursor.spice_simulated_cursor.spice_hot_x + 'px'; this.sc.cursor.spice_simulated_cursor.style.left = e.pageX - this.sc.cursor.spice_simulated_cursor.spice_hot_x + 'px';
this.sc.cursor.spice_simulated_cursor.style.top = e.pageY - this.sc.cursor.spice_simulated_cursor.spice_hot_y + 'px'; this.sc.cursor.spice_simulated_cursor.style.top = e.pageY - this.sc.cursor.spice_simulated_cursor.spice_hot_y + 'px';
@ -115,8 +103,7 @@ function handle_mousemove(e)
} }
function handle_mousedown(e) function handle_mousedown(e) {
{
var press = new Messages.SpiceMsgcMousePress(this.sc, e) var press = new Messages.SpiceMsgcMousePress(this.sc, e)
var msg = new Messages.SpiceMiniData(); var msg = new Messages.SpiceMiniData();
msg.build_msg(Constants.SPICE_MSGC_INPUTS_MOUSE_PRESS, press); msg.build_msg(Constants.SPICE_MSGC_INPUTS_MOUSE_PRESS, press);
@ -126,14 +113,12 @@ function handle_mousedown(e)
e.preventDefault(); e.preventDefault();
} }
function handle_contextmenu(e) function handle_contextmenu(e) {
{
e.preventDefault(); e.preventDefault();
return false; return false;
} }
function handle_mouseup(e) function handle_mouseup(e) {
{
var release = new Messages.SpiceMsgcMouseRelease(this.sc, e) var release = new Messages.SpiceMsgcMouseRelease(this.sc, e)
var msg = new Messages.SpiceMiniData(); var msg = new Messages.SpiceMiniData();
msg.build_msg(Constants.SPICE_MSGC_INPUTS_MOUSE_RELEASE, release); msg.build_msg(Constants.SPICE_MSGC_INPUTS_MOUSE_RELEASE, release);
@ -143,8 +128,7 @@ function handle_mouseup(e)
e.preventDefault(); e.preventDefault();
} }
function handle_mousewheel(e) function handle_mousewheel(e) {
{
var press = new Messages.SpiceMsgcMousePress; var press = new Messages.SpiceMsgcMousePress;
var release = new Messages.SpiceMsgcMouseRelease; var release = new Messages.SpiceMsgcMouseRelease;
if (e.deltaY < 0) if (e.deltaY < 0)
@ -166,8 +150,7 @@ function handle_mousewheel(e)
e.preventDefault(); e.preventDefault();
} }
function handle_keydown(e) function handle_keydown(e) {
{
var key = new Messages.SpiceMsgcKeyDown(e) var key = new Messages.SpiceMsgcKeyDown(e)
var msg = new Messages.SpiceMiniData(); var msg = new Messages.SpiceMiniData();
check_and_update_modifiers(e, key.code, this.sc); check_and_update_modifiers(e, key.code, this.sc);
@ -178,8 +161,7 @@ function handle_keydown(e)
e.preventDefault(); e.preventDefault();
} }
function handle_keyup(e) function handle_keyup(e) {
{
var key = new Messages.SpiceMsgcKeyUp(e) var key = new Messages.SpiceMsgcKeyUp(e)
var msg = new Messages.SpiceMiniData(); var msg = new Messages.SpiceMiniData();
check_and_update_modifiers(e, key.code, this.sc); check_and_update_modifiers(e, key.code, this.sc);
@ -190,9 +172,8 @@ function handle_keyup(e)
e.preventDefault(); e.preventDefault();
} }
function sendCtrlAltDel(sc) function sendCtrlAltDel(sc) {
{ if (sc && sc.inputs && sc.inputs.state === "ready") {
if (sc && sc.inputs && sc.inputs.state === "ready"){
var key = new Messages.SpiceMsgcKeyDown(); var key = new Messages.SpiceMsgcKeyDown();
var msg = new Messages.SpiceMiniData(); var msg = new Messages.SpiceMiniData();
@ -246,17 +227,14 @@ function sendCtrlAltFN(sc, f) {
} }
} }
function update_modifier(state, code, sc) function update_modifier(state, code, sc) {
{
var msg = new Messages.SpiceMiniData(); var msg = new Messages.SpiceMiniData();
if (!state) if (!state) {
{
var key = new Messages.SpiceMsgcKeyUp() var key = new Messages.SpiceMsgcKeyUp()
key.code =(0x80|code); key.code = (0x80 | code);
msg.build_msg(Constants.SPICE_MSGC_INPUTS_KEY_UP, key); msg.build_msg(Constants.SPICE_MSGC_INPUTS_KEY_UP, key);
} }
else else {
{
var key = new Messages.SpiceMsgcKeyDown() var key = new Messages.SpiceMsgcKeyDown()
key.code = code; key.code = code;
msg.build_msg(Constants.SPICE_MSGC_INPUTS_KEY_DOWN, key); msg.build_msg(Constants.SPICE_MSGC_INPUTS_KEY_DOWN, key);
@ -265,10 +243,8 @@ function update_modifier(state, code, sc)
sc.inputs.send_msg(msg); sc.inputs.send_msg(msg);
} }
function check_and_update_modifiers(e, code, sc) function check_and_update_modifiers(e, code, sc) {
{ if (Shift_state === -1) {
if (Shift_state === -1)
{
Shift_state = e.shiftKey; Shift_state = e.shiftKey;
Ctrl_state = e.ctrlKey; Ctrl_state = e.ctrlKey;
Alt_state = e.altKey; Alt_state = e.altKey;
@ -283,37 +259,32 @@ function check_and_update_modifiers(e, code, sc)
Ctrl_state = true; Ctrl_state = true;
else if (code === 0xE0B5) else if (code === 0xE0B5)
Meta_state = true; Meta_state = true;
else if (code === (0x80|KeyNames.KEY_ShiftL)) else if (code === (0x80 | KeyNames.KEY_ShiftL))
Shift_state = false; Shift_state = false;
else if (code === (0x80|KeyNames.KEY_Alt)) else if (code === (0x80 | KeyNames.KEY_Alt))
Alt_state = false; Alt_state = false;
else if (code === (0x80|KeyNames.KEY_LCtrl)) else if (code === (0x80 | KeyNames.KEY_LCtrl))
Ctrl_state = false; Ctrl_state = false;
else if (code === (0x80|0xE0B5)) else if (code === (0x80 | 0xE0B5))
Meta_state = false; Meta_state = false;
if (sc && sc.inputs && sc.inputs.state === "ready") if (sc && sc.inputs && sc.inputs.state === "ready") {
{ if (Shift_state != e.shiftKey) {
if (Shift_state != e.shiftKey)
{
console.log("Shift state out of sync"); console.log("Shift state out of sync");
update_modifier(e.shiftKey, KeyNames.KEY_ShiftL, sc); update_modifier(e.shiftKey, KeyNames.KEY_ShiftL, sc);
Shift_state = e.shiftKey; Shift_state = e.shiftKey;
} }
if (Alt_state != e.altKey) if (Alt_state != e.altKey) {
{
console.log("Alt state out of sync"); console.log("Alt state out of sync");
update_modifier(e.altKey, KeyNames.KEY_Alt, sc); update_modifier(e.altKey, KeyNames.KEY_Alt, sc);
Alt_state = e.altKey; Alt_state = e.altKey;
} }
if (Ctrl_state != e.ctrlKey) if (Ctrl_state != e.ctrlKey) {
{
console.log("Ctrl state out of sync"); console.log("Ctrl state out of sync");
update_modifier(e.ctrlKey, KeyNames.KEY_LCtrl, sc); update_modifier(e.ctrlKey, KeyNames.KEY_LCtrl, sc);
Ctrl_state = e.ctrlKey; Ctrl_state = e.ctrlKey;
} }
if (Meta_state != e.metaKey) if (Meta_state != e.metaKey) {
{
console.log("Meta state out of sync"); console.log("Meta state out of sync");
update_modifier(e.metaKey, 0xE0B5, sc); update_modifier(e.metaKey, 0xE0B5, sc);
Meta_state = e.metaKey; Meta_state = e.metaKey;
@ -322,14 +293,14 @@ function check_and_update_modifiers(e, code, sc)
} }
export { export {
SpiceInputsConn, SpiceInputsConn,
handle_mousemove, handle_mousemove,
handle_mousedown, handle_mousedown,
handle_contextmenu, handle_contextmenu,
handle_mouseup, handle_mouseup,
handle_mousewheel, handle_mousewheel,
handle_keydown, handle_keydown,
handle_keyup, handle_keyup,
sendCtrlAltDel, sendCtrlAltDel,
sendCtrlAltFN sendCtrlAltFN
}; };

0
static/js/spice-html5/lz.js Normal file → Executable file
View file

216
static/js/spice-html5/main.js Normal file → Executable file
View file

@ -63,8 +63,7 @@ import { resize_helper, handle_resize } from './resize.js';
** browser, including WebSocket and WebSocket.binaryType == arraybuffer ** browser, including WebSocket and WebSocket.binaryType == arraybuffer
** **
**--------------------------------------------------------------------------*/ **--------------------------------------------------------------------------*/
function SpiceMainConn() function SpiceMainConn() {
{
if (typeof WebSocket === "undefined") if (typeof WebSocket === "undefined")
throw new Error("WebSocket unavailable. You need to use a different browser."); throw new Error("WebSocket unavailable. You need to use a different browser.");
@ -78,47 +77,42 @@ function SpiceMainConn()
} }
SpiceMainConn.prototype = Object.create(SpiceConn.prototype); SpiceMainConn.prototype = Object.create(SpiceConn.prototype);
SpiceMainConn.prototype.process_channel_message = function(msg) SpiceMainConn.prototype.process_channel_message = function (msg) {
{ if (msg.type == Constants.SPICE_MSG_MAIN_MIGRATE_BEGIN) {
if (msg.type == Constants.SPICE_MSG_MAIN_MIGRATE_BEGIN)
{
this.known_unimplemented(msg.type, "Main Migrate Begin"); this.known_unimplemented(msg.type, "Main Migrate Begin");
return true; return true;
} }
if (msg.type == Constants.SPICE_MSG_MAIN_MIGRATE_CANCEL) if (msg.type == Constants.SPICE_MSG_MAIN_MIGRATE_CANCEL) {
{
this.known_unimplemented(msg.type, "Main Migrate Cancel"); this.known_unimplemented(msg.type, "Main Migrate Cancel");
return true; return true;
} }
if (msg.type == Constants.SPICE_MSG_MAIN_INIT) if (msg.type == Constants.SPICE_MSG_MAIN_INIT) {
{
this.log_info("Connected to " + this.ws.url); this.log_info("Connected to " + this.ws.url);
this.report_success("Connected") this.report_success("Connected")
this.main_init = new Messages.SpiceMsgMainInit(msg.data); this.main_init = new Messages.SpiceMsgMainInit(msg.data);
this.connection_id = this.main_init.session_id; this.connection_id = this.main_init.session_id;
this.agent_tokens = this.main_init.agent_tokens; this.agent_tokens = this.main_init.agent_tokens;
if (DEBUG > 0) if (DEBUG > 0) {
{
// FIXME - there is a lot here we don't handle; mouse modes, agent, // FIXME - there is a lot here we don't handle; mouse modes, agent,
// ram_hint, multi_media_time // ram_hint, multi_media_time
this.log_info("session id " + this.main_init.session_id + this.log_info("session id " + this.main_init.session_id +
" ; display_channels_hint " + this.main_init.display_channels_hint + " ; display_channels_hint " + this.main_init.display_channels_hint +
" ; supported_mouse_modes " + this.main_init.supported_mouse_modes + " ; supported_mouse_modes " + this.main_init.supported_mouse_modes +
" ; current_mouse_mode " + this.main_init.current_mouse_mode + " ; current_mouse_mode " + this.main_init.current_mouse_mode +
" ; agent_connected " + this.main_init.agent_connected + " ; agent_connected " + this.main_init.agent_connected +
" ; agent_tokens " + this.main_init.agent_tokens + " ; agent_tokens " + this.main_init.agent_tokens +
" ; multi_media_time " + this.main_init.multi_media_time + " ; multi_media_time " + this.main_init.multi_media_time +
" ; ram_hint " + this.main_init.ram_hint); " ; ram_hint " + this.main_init.ram_hint);
} }
this.our_mm_time = Date.now(); this.our_mm_time = Date.now();
this.mm_time = this.main_init.multi_media_time; this.mm_time = this.main_init.multi_media_time;
this.handle_mouse_mode(this.main_init.current_mouse_mode, this.handle_mouse_mode(this.main_init.current_mouse_mode,
this.main_init.supported_mouse_modes); this.main_init.supported_mouse_modes);
if (this.main_init.agent_connected) if (this.main_init.agent_connected)
this.connect_agent(); this.connect_agent();
@ -130,45 +124,39 @@ SpiceMainConn.prototype.process_channel_message = function(msg)
return true; return true;
} }
if (msg.type == Constants.SPICE_MSG_MAIN_MOUSE_MODE) if (msg.type == Constants.SPICE_MSG_MAIN_MOUSE_MODE) {
{
var mode = new Messages.SpiceMsgMainMouseMode(msg.data); var mode = new Messages.SpiceMsgMainMouseMode(msg.data);
DEBUG > 0 && this.log_info("Mouse supported modes " + mode.supported_modes + "; current " + mode.current_mode); DEBUG > 0 && this.log_info("Mouse supported modes " + mode.supported_modes + "; current " + mode.current_mode);
this.handle_mouse_mode(mode.current_mode, mode.supported_modes); this.handle_mouse_mode(mode.current_mode, mode.supported_modes);
return true; return true;
} }
if (msg.type == Constants.SPICE_MSG_MAIN_MULTI_MEDIA_TIME) if (msg.type == Constants.SPICE_MSG_MAIN_MULTI_MEDIA_TIME) {
{
this.known_unimplemented(msg.type, "Main Multi Media Time"); this.known_unimplemented(msg.type, "Main Multi Media Time");
return true; return true;
} }
if (msg.type == Constants.SPICE_MSG_MAIN_CHANNELS_LIST) if (msg.type == Constants.SPICE_MSG_MAIN_CHANNELS_LIST) {
{
var i; var i;
var chans; var chans;
DEBUG > 0 && console.log("channels"); DEBUG > 0 && console.log("channels");
chans = new Messages.SpiceMsgChannels(msg.data); chans = new Messages.SpiceMsgChannels(msg.data);
for (i = 0; i < chans.channels.length; i++) for (i = 0; i < chans.channels.length; i++) {
{
var conn = { var conn = {
uri: this.ws.url, uri: this.ws.url,
parent: this, parent: this,
connection_id : this.connection_id, connection_id: this.connection_id,
type : chans.channels[i].type, type: chans.channels[i].type,
chan_id : chans.channels[i].id chan_id: chans.channels[i].id
}; };
if (chans.channels[i].type == Constants.SPICE_CHANNEL_DISPLAY) if (chans.channels[i].type == Constants.SPICE_CHANNEL_DISPLAY) {
{
if (chans.channels[i].id == 0) { if (chans.channels[i].id == 0) {
this.display = new SpiceDisplayConn(conn); this.display = new SpiceDisplayConn(conn);
} else { } else {
this.log_warn("The spice-html5 client does not handle multiple heads."); this.log_warn("The spice-html5 client does not handle multiple heads.");
} }
} }
else if (chans.channels[i].type == Constants.SPICE_CHANNEL_INPUTS) else if (chans.channels[i].type == Constants.SPICE_CHANNEL_INPUTS) {
{
this.inputs = new SpiceInputsConn(conn); this.inputs = new SpiceInputsConn(conn);
this.inputs.mouse_mode = this.mouse_mode; this.inputs.mouse_mode = this.mouse_mode;
} }
@ -178,9 +166,8 @@ SpiceMainConn.prototype.process_channel_message = function(msg)
this.cursor = new SpicePlaybackConn(conn); this.cursor = new SpicePlaybackConn(conn);
else if (chans.channels[i].type == Constants.SPICE_CHANNEL_PORT) else if (chans.channels[i].type == Constants.SPICE_CHANNEL_PORT)
this.ports.push(new SpicePortConn(conn)); this.ports.push(new SpicePortConn(conn));
else else {
{ if (!("extra_channels" in this))
if (! ("extra_channels" in this))
this.extra_channels = []; this.extra_channels = [];
this.extra_channels[i] = new SpiceConn(conn); this.extra_channels[i] = new SpiceConn(conn);
this.log_err("Channel type " + this.extra_channels[i].channel_type() + " not implemented"); this.log_err("Channel type " + this.extra_channels[i].channel_type() + " not implemented");
@ -191,29 +178,25 @@ SpiceMainConn.prototype.process_channel_message = function(msg)
return true; return true;
} }
if (msg.type == Constants.SPICE_MSG_MAIN_AGENT_CONNECTED) if (msg.type == Constants.SPICE_MSG_MAIN_AGENT_CONNECTED) {
{
this.connect_agent(); this.connect_agent();
return true; return true;
} }
if (msg.type == Constants.SPICE_MSG_MAIN_AGENT_CONNECTED_TOKENS) if (msg.type == Constants.SPICE_MSG_MAIN_AGENT_CONNECTED_TOKENS) {
{
var connected_tokens = new Messages.SpiceMsgMainAgentTokens(msg.data); var connected_tokens = new Messages.SpiceMsgMainAgentTokens(msg.data);
this.agent_tokens = connected_tokens.num_tokens; this.agent_tokens = connected_tokens.num_tokens;
this.connect_agent(); this.connect_agent();
return true; return true;
} }
if (msg.type == Constants.SPICE_MSG_MAIN_AGENT_TOKEN) if (msg.type == Constants.SPICE_MSG_MAIN_AGENT_TOKEN) {
{
var remaining_tokens, tokens = new Messages.SpiceMsgMainAgentTokens(msg.data); var remaining_tokens, tokens = new Messages.SpiceMsgMainAgentTokens(msg.data);
this.agent_tokens += tokens.num_tokens; this.agent_tokens += tokens.num_tokens;
this.send_agent_message_queue(); this.send_agent_message_queue();
remaining_tokens = this.agent_tokens; remaining_tokens = this.agent_tokens;
while (remaining_tokens > 0 && this.file_xfer_read_queue.length > 0) while (remaining_tokens > 0 && this.file_xfer_read_queue.length > 0) {
{
var xfer_task = this.file_xfer_read_queue.shift(); var xfer_task = this.file_xfer_read_queue.shift();
this.file_xfer_read(xfer_task, xfer_task.read_bytes); this.file_xfer_read(xfer_task, xfer_task.read_bytes);
remaining_tokens--; remaining_tokens--;
@ -221,24 +204,20 @@ SpiceMainConn.prototype.process_channel_message = function(msg)
return true; return true;
} }
if (msg.type == Constants.SPICE_MSG_MAIN_AGENT_DISCONNECTED) if (msg.type == Constants.SPICE_MSG_MAIN_AGENT_DISCONNECTED) {
{
this.agent_connected = false; this.agent_connected = false;
return true; return true;
} }
if (msg.type == Constants.SPICE_MSG_MAIN_AGENT_DATA) if (msg.type == Constants.SPICE_MSG_MAIN_AGENT_DATA) {
{
var agent_data = new Messages.SpiceMsgMainAgentData(msg.data); var agent_data = new Messages.SpiceMsgMainAgentData(msg.data);
if (agent_data.type == Constants.VD_AGENT_ANNOUNCE_CAPABILITIES) if (agent_data.type == Constants.VD_AGENT_ANNOUNCE_CAPABILITIES) {
{
var agent_caps = new Messages.VDAgentAnnounceCapabilities(agent_data.data); var agent_caps = new Messages.VDAgentAnnounceCapabilities(agent_data.data);
if (agent_caps.request) if (agent_caps.request)
this.announce_agent_capabilities(0); this.announce_agent_capabilities(0);
return true; return true;
} }
else if (agent_data.type == Constants.VD_AGENT_FILE_XFER_STATUS) else if (agent_data.type == Constants.VD_AGENT_FILE_XFER_STATUS) {
{
this.handle_file_xfer_status(new Messages.VDAgentFileXferStatusMessage(agent_data.data)); this.handle_file_xfer_status(new Messages.VDAgentFileXferStatusMessage(agent_data.data));
return true; return true;
} }
@ -246,44 +225,37 @@ SpiceMainConn.prototype.process_channel_message = function(msg)
return false; return false;
} }
if (msg.type == Constants.SPICE_MSG_MAIN_MIGRATE_SWITCH_HOST) if (msg.type == Constants.SPICE_MSG_MAIN_MIGRATE_SWITCH_HOST) {
{
this.known_unimplemented(msg.type, "Main Migrate Switch Host"); this.known_unimplemented(msg.type, "Main Migrate Switch Host");
return true; return true;
} }
if (msg.type == Constants.SPICE_MSG_MAIN_MIGRATE_END) if (msg.type == Constants.SPICE_MSG_MAIN_MIGRATE_END) {
{
this.known_unimplemented(msg.type, "Main Migrate End"); this.known_unimplemented(msg.type, "Main Migrate End");
return true; return true;
} }
if (msg.type == Constants.SPICE_MSG_MAIN_NAME) if (msg.type == Constants.SPICE_MSG_MAIN_NAME) {
{
this.known_unimplemented(msg.type, "Main Name"); this.known_unimplemented(msg.type, "Main Name");
return true; return true;
} }
if (msg.type == Constants.SPICE_MSG_MAIN_UUID) if (msg.type == Constants.SPICE_MSG_MAIN_UUID) {
{
this.known_unimplemented(msg.type, "Main UUID"); this.known_unimplemented(msg.type, "Main UUID");
return true; return true;
} }
if (msg.type == Constants.SPICE_MSG_MAIN_MIGRATE_BEGIN_SEAMLESS) if (msg.type == Constants.SPICE_MSG_MAIN_MIGRATE_BEGIN_SEAMLESS) {
{
this.known_unimplemented(msg.type, "Main Migrate Begin Seamless"); this.known_unimplemented(msg.type, "Main Migrate Begin Seamless");
return true; return true;
} }
if (msg.type == Constants.SPICE_MSG_MAIN_MIGRATE_DST_SEAMLESS_ACK) if (msg.type == Constants.SPICE_MSG_MAIN_MIGRATE_DST_SEAMLESS_ACK) {
{
this.known_unimplemented(msg.type, "Main Migrate Dst Seamless ACK"); this.known_unimplemented(msg.type, "Main Migrate Dst Seamless ACK");
return true; return true;
} }
if (msg.type == Constants.SPICE_MSG_MAIN_MIGRATE_DST_SEAMLESS_NACK) if (msg.type == Constants.SPICE_MSG_MAIN_MIGRATE_DST_SEAMLESS_NACK) {
{
this.known_unimplemented(msg.type, "Main Migrate Dst Seamless NACK"); this.known_unimplemented(msg.type, "Main Migrate Dst Seamless NACK");
return true; return true;
} }
@ -291,24 +263,20 @@ SpiceMainConn.prototype.process_channel_message = function(msg)
return false; return false;
} }
SpiceMainConn.prototype.stop = function(msg) SpiceMainConn.prototype.stop = function (msg) {
{
this.state = "closing"; this.state = "closing";
if (this.inputs) if (this.inputs) {
{
this.inputs.cleanup(); this.inputs.cleanup();
this.inputs = undefined; this.inputs = undefined;
} }
if (this.cursor) if (this.cursor) {
{
this.cursor.cleanup(); this.cursor.cleanup();
this.cursor = undefined; this.cursor = undefined;
} }
if (this.display) if (this.display) {
{
this.display.cleanup(); this.display.cleanup();
this.display.destroy_surfaces(); this.display.destroy_surfaces();
this.display = undefined; this.display = undefined;
@ -322,30 +290,26 @@ SpiceMainConn.prototype.stop = function(msg)
this.extra_channels = undefined; this.extra_channels = undefined;
} }
SpiceMainConn.prototype.send_agent_message_queue = function(message) SpiceMainConn.prototype.send_agent_message_queue = function (message) {
{
if (!this.agent_connected) if (!this.agent_connected)
return; return;
if (message) if (message)
this.agent_msg_queue.push(message); this.agent_msg_queue.push(message);
while (this.agent_tokens > 0 && this.agent_msg_queue.length > 0) while (this.agent_tokens > 0 && this.agent_msg_queue.length > 0) {
{
var mr = this.agent_msg_queue.shift(); var mr = this.agent_msg_queue.shift();
this.send_msg(mr); this.send_msg(mr);
this.agent_tokens--; this.agent_tokens--;
} }
} }
SpiceMainConn.prototype.send_agent_message = function(type, message) SpiceMainConn.prototype.send_agent_message = function (type, message) {
{
var agent_data = new Messages.SpiceMsgcMainAgentData(type, message); var agent_data = new Messages.SpiceMsgcMainAgentData(type, message);
var sb = 0, maxsize = Constants.VD_AGENT_MAX_DATA_SIZE - Messages.SpiceMiniData.prototype.buffer_size(); var sb = 0, maxsize = Constants.VD_AGENT_MAX_DATA_SIZE - Messages.SpiceMiniData.prototype.buffer_size();
var data = new ArrayBuffer(agent_data.buffer_size()); var data = new ArrayBuffer(agent_data.buffer_size());
agent_data.to_buffer(data); agent_data.to_buffer(data);
while (sb < agent_data.buffer_size()) while (sb < agent_data.buffer_size()) {
{
var eb = Math.min(sb + maxsize, agent_data.buffer_size()); var eb = Math.min(sb + maxsize, agent_data.buffer_size());
var mr = new Messages.SpiceMiniData(); var mr = new Messages.SpiceMiniData();
mr.type = Constants.SPICE_MSGC_MAIN_AGENT_DATA; mr.type = Constants.SPICE_MSGC_MAIN_AGENT_DATA;
@ -356,22 +320,19 @@ SpiceMainConn.prototype.send_agent_message = function(type, message)
} }
} }
SpiceMainConn.prototype.announce_agent_capabilities = function(request) SpiceMainConn.prototype.announce_agent_capabilities = function (request) {
{
var caps = new Messages.VDAgentAnnounceCapabilities(request, (1 << Constants.VD_AGENT_CAP_MOUSE_STATE) | var caps = new Messages.VDAgentAnnounceCapabilities(request, (1 << Constants.VD_AGENT_CAP_MOUSE_STATE) |
(1 << Constants.VD_AGENT_CAP_MONITORS_CONFIG) | (1 << Constants.VD_AGENT_CAP_MONITORS_CONFIG) |
(1 << Constants.VD_AGENT_CAP_REPLY)); (1 << Constants.VD_AGENT_CAP_REPLY));
this.send_agent_message(Constants.VD_AGENT_ANNOUNCE_CAPABILITIES, caps); this.send_agent_message(Constants.VD_AGENT_ANNOUNCE_CAPABILITIES, caps);
} }
SpiceMainConn.prototype.resize_window = function(flags, width, height, depth, x, y) SpiceMainConn.prototype.resize_window = function (flags, width, height, depth, x, y) {
{
var monitors_config = new Messages.VDAgentMonitorsConfig(flags, width, height, depth, x, y); var monitors_config = new Messages.VDAgentMonitorsConfig(flags, width, height, depth, x, y);
this.send_agent_message(Constants.VD_AGENT_MONITORS_CONFIG, monitors_config); this.send_agent_message(Constants.VD_AGENT_MONITORS_CONFIG, monitors_config);
} }
SpiceMainConn.prototype.file_xfer_start = function(file) SpiceMainConn.prototype.file_xfer_start = function (file) {
{
var task_id, xfer_start, task; var task_id, xfer_start, task;
task_id = this.file_xfer_task_id++; task_id = this.file_xfer_task_id++;
@ -382,16 +343,13 @@ SpiceMainConn.prototype.file_xfer_start = function(file)
this.send_agent_message(Constants.VD_AGENT_FILE_XFER_START, xfer_start); this.send_agent_message(Constants.VD_AGENT_FILE_XFER_START, xfer_start);
} }
SpiceMainConn.prototype.handle_file_xfer_status = function(file_xfer_status) SpiceMainConn.prototype.handle_file_xfer_status = function (file_xfer_status) {
{
var xfer_error, xfer_task; var xfer_error, xfer_task;
if (!this.file_xfer_tasks[file_xfer_status.id]) if (!this.file_xfer_tasks[file_xfer_status.id]) {
{
return; return;
} }
xfer_task = this.file_xfer_tasks[file_xfer_status.id]; xfer_task = this.file_xfer_tasks[file_xfer_status.id];
switch (file_xfer_status.result) switch (file_xfer_status.result) {
{
case Constants.VD_AGENT_FILE_XFER_STATUS_CAN_SEND_DATA: case Constants.VD_AGENT_FILE_XFER_STATUS_CAN_SEND_DATA:
this.file_xfer_read(xfer_task); this.file_xfer_read(xfer_task);
return; return;
@ -411,8 +369,7 @@ SpiceMainConn.prototype.handle_file_xfer_status = function(file_xfer_status)
this.file_xfer_completed(xfer_task, xfer_error) this.file_xfer_completed(xfer_task, xfer_error)
} }
SpiceMainConn.prototype.file_xfer_read = function(file_xfer_task, start_byte) SpiceMainConn.prototype.file_xfer_read = function (file_xfer_task, start_byte) {
{
var FILE_XFER_CHUNK_SIZE = 32 * Constants.VD_AGENT_MAX_DATA_SIZE; var FILE_XFER_CHUNK_SIZE = 32 * Constants.VD_AGENT_MAX_DATA_SIZE;
var _this = this; var _this = this;
var sb, eb; var sb, eb;
@ -420,36 +377,32 @@ SpiceMainConn.prototype.file_xfer_read = function(file_xfer_task, start_byte)
if (!file_xfer_task || if (!file_xfer_task ||
!this.file_xfer_tasks[file_xfer_task.id] || !this.file_xfer_tasks[file_xfer_task.id] ||
(start_byte > 0 && start_byte == file_xfer_task.file.size)) (start_byte > 0 && start_byte == file_xfer_task.file.size)) {
{
return; return;
} }
if (file_xfer_task.cancelled) if (file_xfer_task.cancelled) {
{
var xfer_status = new Messages.VDAgentFileXferStatusMessage(file_xfer_task.id, var xfer_status = new Messages.VDAgentFileXferStatusMessage(file_xfer_task.id,
Constants.VD_AGENT_FILE_XFER_STATUS_CANCELLED); Constants.VD_AGENT_FILE_XFER_STATUS_CANCELLED);
this.send_agent_message(Constants.VD_AGENT_FILE_XFER_STATUS, xfer_status); this.send_agent_message(Constants.VD_AGENT_FILE_XFER_STATUS, xfer_status);
delete this.file_xfer_tasks[file_xfer_task.id]; delete this.file_xfer_tasks[file_xfer_task.id];
return; return;
} }
sb = start_byte || 0, sb = start_byte || 0,
eb = Math.min(sb + FILE_XFER_CHUNK_SIZE, file_xfer_task.file.size); eb = Math.min(sb + FILE_XFER_CHUNK_SIZE, file_xfer_task.file.size);
if (!this.agent_tokens) if (!this.agent_tokens) {
{
file_xfer_task.read_bytes = sb; file_xfer_task.read_bytes = sb;
this.file_xfer_read_queue.push(file_xfer_task); this.file_xfer_read_queue.push(file_xfer_task);
return; return;
} }
reader = new FileReader(); reader = new FileReader();
reader.onload = function(e) reader.onload = function (e) {
{
var xfer_data = new Messages.VDAgentFileXferDataMessage(file_xfer_task.id, var xfer_data = new Messages.VDAgentFileXferDataMessage(file_xfer_task.id,
e.target.result.byteLength, e.target.result.byteLength,
e.target.result); e.target.result);
_this.send_agent_message(Constants.VD_AGENT_FILE_XFER_DATA, xfer_data); _this.send_agent_message(Constants.VD_AGENT_FILE_XFER_DATA, xfer_data);
_this.file_xfer_read(file_xfer_task, eb); _this.file_xfer_read(file_xfer_task, eb);
file_xfer_task.update_progressbar(eb); file_xfer_task.update_progressbar(eb);
@ -459,20 +412,18 @@ SpiceMainConn.prototype.file_xfer_read = function(file_xfer_task, start_byte)
reader.readAsArrayBuffer(slice); reader.readAsArrayBuffer(slice);
} }
SpiceMainConn.prototype.file_xfer_completed = function(file_xfer_task, error) SpiceMainConn.prototype.file_xfer_completed = function (file_xfer_task, error) {
{
if (error) if (error)
this.log_err(error); this.log_err(error);
else else
this.log_info("transfer of '" + file_xfer_task.file.name +"' was successful"); this.log_info("transfer of '" + file_xfer_task.file.name + "' was successful");
file_xfer_task.remove_progressbar(); file_xfer_task.remove_progressbar();
delete this.file_xfer_tasks[file_xfer_task.id]; delete this.file_xfer_tasks[file_xfer_task.id];
} }
SpiceMainConn.prototype.connect_agent = function() SpiceMainConn.prototype.connect_agent = function () {
{
this.agent_connected = true; this.agent_connected = true;
var agent_start = new Messages.SpiceMsgcMainAgentStart(~0); var agent_start = new Messages.SpiceMsgcMainAgentStart(~0);
@ -487,11 +438,9 @@ SpiceMainConn.prototype.connect_agent = function()
} }
SpiceMainConn.prototype.handle_mouse_mode = function(current, supported) SpiceMainConn.prototype.handle_mouse_mode = function (current, supported) {
{
this.mouse_mode = current; this.mouse_mode = current;
if (current != Constants.SPICE_MOUSE_MODE_CLIENT && (supported & Constants.SPICE_MOUSE_MODE_CLIENT)) if (current != Constants.SPICE_MOUSE_MODE_CLIENT && (supported & Constants.SPICE_MOUSE_MODE_CLIENT)) {
{
var mode_request = new Messages.SpiceMsgcMainMouseModeRequest(Constants.SPICE_MOUSE_MODE_CLIENT); var mode_request = new Messages.SpiceMsgcMainMouseModeRequest(Constants.SPICE_MOUSE_MODE_CLIENT);
var mr = new Messages.SpiceMiniData(); var mr = new Messages.SpiceMiniData();
mr.build_msg(Constants.SPICE_MSGC_MAIN_MOUSE_MODE_REQUEST, mode_request); mr.build_msg(Constants.SPICE_MSGC_MAIN_MOUSE_MODE_REQUEST, mode_request);
@ -503,18 +452,17 @@ SpiceMainConn.prototype.handle_mouse_mode = function(current, supported)
} }
/* Shift current time to attempt to get a time matching that of the server */ /* Shift current time to attempt to get a time matching that of the server */
SpiceMainConn.prototype.relative_now = function() SpiceMainConn.prototype.relative_now = function () {
{
var ret = (Date.now() - this.our_mm_time) + this.mm_time; var ret = (Date.now() - this.our_mm_time) + this.mm_time;
return ret; return ret;
} }
export { export {
SpiceMainConn, SpiceMainConn,
handle_file_dragover, handle_file_dragover,
handle_file_drop, handle_file_drop,
resize_helper, resize_helper,
handle_resize, handle_resize,
sendCtrlAltDel, sendCtrlAltDel,
sendCtrlAltFN sendCtrlAltFN,
}; };

0
static/js/spice-html5/playback.js Normal file → Executable file
View file

0
static/js/spice-html5/png.js Normal file → Executable file
View file

2
static/js/spice-html5/port.js Normal file → Executable file
View file

@ -20,7 +20,7 @@
*/ */
import { Constants } from './enums.js'; import { Constants } from './enums.js';
import { DEBUG, arraybuffer_to_str } from './utils.js'; import { DEBUG } from './utils.js';
import { SpiceConn } from './spiceconn.js'; import { SpiceConn } from './spiceconn.js';
import { SpiceMsgPortInit } from './spicemsg.js'; import { SpiceMsgPortInit } from './spicemsg.js';

0
static/js/spice-html5/quic.js Normal file → Executable file
View file

0
static/js/spice-html5/resize.js Normal file → Executable file
View file

0
static/js/spice-html5/simulatecursor.js Normal file → Executable file
View file

0
static/js/spice-html5/spicearraybuffer.js Normal file → Executable file
View file

0
static/js/spice-html5/spiceconn.js Normal file → Executable file
View file

0
static/js/spice-html5/spicedataview.js Normal file → Executable file
View file

0
static/js/spice-html5/spicemsg.js Normal file → Executable file
View file

0
static/js/spice-html5/spicetype.js Normal file → Executable file
View file

View file

0
static/js/spice-html5/thirdparty/browser-es-module-loader/README.md vendored Normal file → Executable file
View file

View file

View file

View file

0
static/js/spice-html5/thirdparty/jsbn.js vendored Normal file → Executable file
View file

0
static/js/spice-html5/thirdparty/prng4.js vendored Normal file → Executable file
View file

0
static/js/spice-html5/thirdparty/rng.js vendored Normal file → Executable file
View file

0
static/js/spice-html5/thirdparty/rsa.js vendored Normal file → Executable file
View file

0
static/js/spice-html5/thirdparty/sha1.js vendored Normal file → Executable file
View file

0
static/js/spice-html5/ticket.js Normal file → Executable file
View file

0
static/js/spice-html5/utils.js Normal file → Executable file
View file

30
static/js/spice-html5/webm.js Normal file → Executable file
View file

@ -62,7 +62,6 @@ var WEBM_CODEC_PRIVATE = [ 0x63, 0xA2 ];
var WEBM_CODEC_ID = [ 0x86 ]; var WEBM_CODEC_ID = [ 0x86 ];
var WEBM_VIDEO = [ 0xE0 ] ; var WEBM_VIDEO = [ 0xE0 ] ;
var WEBM_FLAG_INTERLACED = [ 0x9A ] ;
var WEBM_PIXEL_WIDTH = [ 0xB0 ] ; var WEBM_PIXEL_WIDTH = [ 0xB0 ] ;
var WEBM_PIXEL_HEIGHT = [ 0xBA ] ; var WEBM_PIXEL_HEIGHT = [ 0xBA ] ;
@ -304,7 +303,6 @@ webm_Audio.prototype =
function webm_Video(width, height) function webm_Video(width, height)
{ {
this.id = WEBM_VIDEO; this.id = WEBM_VIDEO;
this.flag_interlaced = 0;
this.width = width; this.width = width;
this.height = height; this.height = height;
} }
@ -317,7 +315,6 @@ webm_Video.prototype =
var dv = new DataView(a); var dv = new DataView(a);
at = EBML_write_array(this.id, dv, at); at = EBML_write_array(this.id, dv, at);
at = EBML_write_u64_data_len(this.buffer_size() - 8 - this.id.length, dv, at); at = EBML_write_u64_data_len(this.buffer_size() - 8 - this.id.length, dv, at);
at = EBML_write_u8_value(WEBM_FLAG_INTERLACED, this.flag_interlaced, dv, at);
at = EBML_write_u16_value(WEBM_PIXEL_WIDTH, this.width, dv, at) at = EBML_write_u16_value(WEBM_PIXEL_WIDTH, this.width, dv, at)
at = EBML_write_u16_value(WEBM_PIXEL_HEIGHT, this.height, dv, at) at = EBML_write_u16_value(WEBM_PIXEL_HEIGHT, this.height, dv, at)
return at; return at;
@ -325,7 +322,6 @@ webm_Video.prototype =
buffer_size: function() buffer_size: function()
{ {
return this.id.length + 8 + return this.id.length + 8 +
WEBM_FLAG_INTERLACED.length + 1 + 1 +
WEBM_PIXEL_WIDTH.length + 1 + 2 + WEBM_PIXEL_WIDTH.length + 1 + 2 +
WEBM_PIXEL_HEIGHT.length + 1 + 2; WEBM_PIXEL_HEIGHT.length + 1 + 2;
}, },
@ -401,7 +397,7 @@ function webm_AudioTrackEntry()
{ {
this.id = WEBM_TRACK_ENTRY; this.id = WEBM_TRACK_ENTRY;
this.number = 1; this.number = 1;
this.uid = 2; // Arbitrary id; most likely makes no difference this.uid = 1;
this.type = 2; // Audio this.type = 2; // Audio
this.flag_enabled = 1; this.flag_enabled = 1;
this.flag_default = 1; this.flag_default = 1;
@ -475,30 +471,20 @@ webm_AudioTrackEntry.prototype =
function webm_VideoTrackEntry(width, height) function webm_VideoTrackEntry(width, height)
{ {
/*
** In general, we follow specifications found by looking here:
** https://www.webmproject.org/docs/container/
** which points here:
** https://www.matroska.org/technical/specs/index.html
** and here:
** https://datatracker.ietf.org/doc/draft-ietf-cellar-matroska/
** Our goal is to supply mandatory values, and note where we differ
** from the default.
*/
this.id = WEBM_TRACK_ENTRY; this.id = WEBM_TRACK_ENTRY;
this.number = 1; this.number = 1;
this.uid = 1; this.uid = 1;
this.type = 1; // Video this.type = 1; // Video
this.flag_enabled = 1; this.flag_enabled = 1;
this.flag_default = 1; this.flag_default = 1;
this.flag_forced = 1; // Different than default; we wish to force this.flag_forced = 1;
this.flag_lacing = 1; this.flag_lacing = 0;
this.min_cache = 0; this.min_cache = 0; // fixme - check
this.max_block_addition_id = 0; this.max_block_addition_id = 0;
this.codec_decode_all = 0; // fixme - check
this.seek_pre_roll = 0; // 80000000; // fixme - check
this.codec_delay = 80000000; // Must match codec_private.preskip
this.codec_id = "V_VP8"; this.codec_id = "V_VP8";
this.codec_decode_all = 1;
this.seek_pre_roll = 0;
this.video = new webm_Video(width, height); this.video = new webm_Video(width, height);
} }
@ -520,6 +506,7 @@ webm_VideoTrackEntry.prototype =
at = EBML_write_u8_value(WEBM_MIN_CACHE, this.min_cache, dv, at); at = EBML_write_u8_value(WEBM_MIN_CACHE, this.min_cache, dv, at);
at = EBML_write_u8_value(WEBM_MAX_BLOCK_ADDITION_ID, this.max_block_addition_id, dv, at); at = EBML_write_u8_value(WEBM_MAX_BLOCK_ADDITION_ID, this.max_block_addition_id, dv, at);
at = EBML_write_u8_value(WEBM_CODEC_DECODE_ALL, this.codec_decode_all, dv, at); at = EBML_write_u8_value(WEBM_CODEC_DECODE_ALL, this.codec_decode_all, dv, at);
at = EBML_write_u32_value(WEBM_CODEC_DELAY, this.codec_delay, dv, at);
at = EBML_write_u32_value(WEBM_SEEK_PRE_ROLL, this.seek_pre_roll, dv, at); at = EBML_write_u32_value(WEBM_SEEK_PRE_ROLL, this.seek_pre_roll, dv, at);
at = EBML_write_u8_value(WEBM_TRACK_TYPE, this.type, dv, at); at = EBML_write_u8_value(WEBM_TRACK_TYPE, this.type, dv, at);
at = this.video.to_buffer(a, at); at = this.video.to_buffer(a, at);
@ -538,6 +525,7 @@ webm_VideoTrackEntry.prototype =
WEBM_MIN_CACHE.length + 1 + 1 + WEBM_MIN_CACHE.length + 1 + 1 +
WEBM_MAX_BLOCK_ADDITION_ID.length + 1 + 1 + WEBM_MAX_BLOCK_ADDITION_ID.length + 1 + 1 +
WEBM_CODEC_DECODE_ALL.length + 1 + 1 + WEBM_CODEC_DECODE_ALL.length + 1 + 1 +
WEBM_CODEC_DELAY.length + 1 + 4 +
WEBM_SEEK_PRE_ROLL.length + 1 + 4 + WEBM_SEEK_PRE_ROLL.length + 1 + 4 +
WEBM_TRACK_TYPE.length + 1 + 1 + WEBM_TRACK_TYPE.length + 1 + 1 +
this.video.buffer_size(); this.video.buffer_size();

0
static/js/spice-html5/wire.js Normal file → Executable file
View file