diff options
author | Jeremy White <jwhite@codeweavers.com> | 2016-12-29 15:25:43 -0600 |
---|---|---|
committer | Jeremy White <jwhite@codeweavers.com> | 2017-01-20 09:58:03 -0600 |
commit | 4ea12e87a222c5c5df3c3ed3838561505d6c4cc5 (patch) | |
tree | b1d302487634e123dc6263ae84063076594fffac /display.js | |
parent | 368fdaf51de2478eee9223032b3f7caee58cf132 (diff) |
Only drop an mjpeg frame if we are not currently processing one.
Diffstat (limited to 'display.js')
-rw-r--r-- | display.js | 14 |
1 files changed, 12 insertions, 2 deletions
@@ -582,7 +582,9 @@ SpiceDisplayConn.prototype.process_channel_message = function(msg) media.spiceconn = this; v.spice_stream = s; } - else if (m.codec_type != SPICE_VIDEO_CODEC_TYPE_MJPEG) + else if (m.codec_type == SPICE_VIDEO_CODEC_TYPE_MJPEG) + this.streams[m.id].frames_loading = 0; + else console.log("Unhandled stream codec: "+m.codec_type); return true; } @@ -884,6 +886,9 @@ function handle_draw_jpeg_onload() var temp_canvas = null; var context; + if (this.o.sc.streams[this.o.id]) + this.o.sc.streams[this.o.id].frames_loading--; + /*------------------------------------------------------------ ** FIXME: ** The helper should be extended to be able to handle actual HtmlImageElements @@ -970,7 +975,10 @@ function handle_draw_jpeg_onload() function process_mjpeg_stream_data(sc, m, time_until_due) { - if (time_until_due < 0) + /* If we are currently processing an mjpeg frame when a new one arrives, + and the new one is 'late', drop the new frame. This helps the browsers + keep up, and provides rate control feedback as well */ + if (time_until_due < 0 && sc.streams[m.base.id].frames_loading > 0) { if ("report" in sc.streams[m.base.id]) sc.streams[m.base.id].report.num_drops++; @@ -1001,6 +1009,8 @@ function process_mjpeg_stream_data(sc, m, time_until_due) }; img.onload = handle_draw_jpeg_onload; img.src = tmpstr; + + sc.streams[m.base.id].frames_loading++; } function process_stream_data_report(sc, id, msg_mmtime, time_until_due) |