[Spice-devel] [PATCH spice-html5 3/3] Add support for stream reports.

Christophe Fergeau cfergeau at redhat.com
Thu Jun 4 01:52:16 PDT 2015


Hey,

On Wed, Jun 03, 2015 at 05:22:55PM -0500, Jeremy White wrote:
> This helps video playback do a slightly better job of keeping up
> in the browser.  It's not a dramatic effect, but enough to start making
> video playback almost tolerable.
> 
> Signed-off-by: Jeremy White <jwhite at codeweavers.com>
> ---
>  display.js   | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++----------
>  enums.js     |  1 +
>  main.js      |  3 +++
>  spiceconn.js |  3 ++-
>  spicemsg.js  | 54 ++++++++++++++++++++++++++++++++++++++++++++++++
>  5 files changed, 116 insertions(+), 12 deletions(-)
> 
> diff --git a/display.js b/display.js
> index 7027230..7938527 100644
> --- a/display.js
> +++ b/display.js
> @@ -477,31 +477,48 @@ SpiceDisplayConn.prototype.process_channel_message = function(msg)
>          return true;
>      }
>  
> -    if (msg.type == SPICE_MSG_DISPLAY_STREAM_DATA)
> +    if (msg.type == SPICE_MSG_DISPLAY_STREAM_DATA ||
> +        msg.type == SPICE_MSG_DISPLAY_STREAM_DATA_SIZED)
>      {
> -        var m = new SpiceMsgDisplayStreamData(msg.data);
> +        var m;
> +        if (msg.type == SPICE_MSG_DISPLAY_STREAM_DATA_SIZED)
> +            m = new SpiceMsgDisplayStreamDataSized(msg.data);
> +        else
> +            m = new SpiceMsgDisplayStreamData(msg.data);
> +

Doesn't this belong to the previous commit?
Same comment as 2/3, not very familiar with all of that, but looks ok.

Christophe


>          if (!this.streams[m.base.id])
>          {
>              console.log("no stream for data");
>              return false;
>          }
> +
> +        var mmtime = (Date.now() - this.parent.our_mm_time) + this.parent.mm_time;
> +        var latency = m.base.multi_media_time - mmtime;
> +
>          if (this.streams[m.base.id].codec_type === SPICE_VIDEO_CODEC_TYPE_MJPEG)
> -        {
> -            process_mjpeg_stream_data(this, m);
> +            process_mjpeg_stream_data(this, m, latency);
> +
> +        if ("report" in this.streams[m.base.id])
> +            process_stream_data_report(this, m, mmtime, latency);
>  
> -        }
>          return true;
>      }
>  
> -    if (msg.type == SPICE_MSG_DISPLAY_STREAM_DATA_SIZED)
> +    if (msg.type == SPICE_MSG_DISPLAY_STREAM_ACTIVATE_REPORT)
>      {
> -        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);
> +        var m = new SpiceMsgDisplayStreamActivateReport(msg.data);
> +
> +        var report = new SpiceMsgcDisplayStreamReport(m.stream_id, m.unique_id);
> +        if (this.streams[m.stream_id])
> +        {
> +            this.streams[m.stream_id].report = report;
> +            this.streams[m.stream_id].max_window_size = m.max_window_size;
> +            this.streams[m.stream_id].timeout_ms = m.timeout_ms
> +        }
> +
>          return true;
>      }
>  
> -
>      if (msg.type == SPICE_MSG_DISPLAY_STREAM_CLIP)
>      {
>          var m = new SpiceMsgDisplayStreamClip(msg.data);
> @@ -811,8 +828,15 @@ function handle_draw_jpeg_onload()
>      }
>  }
>  
> -function process_mjpeg_stream_data(sc, m)
> +function process_mjpeg_stream_data(sc, m, latency)
>  {
> +    if (latency < 0)
> +    {
> +        if ("report" in sc.streams[m.base.id])
> +            sc.streams[m.base.id].report.num_drops++;
> +        return;
> +    }
> +
>      var tmpstr = "data:image/jpeg,";
>      var img = new Image;
>      var i;
> @@ -837,3 +861,24 @@ function process_mjpeg_stream_data(sc, m)
>      img.src = tmpstr;
>  }
>  
> +function process_stream_data_report(sc, m, mmtime, latency)
> +{
> +    sc.streams[m.base.id].report.num_frames++;
> +    if (sc.streams[m.base.id].report.start_frame_mm_time == 0)
> +        sc.streams[m.base.id].report.start_frame_mm_time = m.base.multi_media_time;
> +
> +    if (sc.streams[m.base.id].report.num_frames > sc.streams[m.base.id].max_window_size ||
> +        (m.base.multi_media_time - sc.streams[m.base.id].report.start_frame_mm_time) > sc.streams[m.base.id].timeout_ms)
> +    {
> +        sc.streams[m.base.id].report.end_frame_mm_time = m.base.multi_media_time;
> +        sc.streams[m.base.id].report.last_frame_delay = latency;
> +
> +        var msg = new SpiceMiniData();
> +        msg.build_msg(SPICE_MSGC_DISPLAY_STREAM_REPORT, sc.streams[m.base.id].report);
> +        sc.send_msg(msg);
> +
> +        sc.streams[m.base.id].report.start_frame_mm_time = 0;
> +        sc.streams[m.base.id].report.num_frames = 0;
> +        sc.streams[m.base.id].report.num_drops = 0;
> +    }
> +}
> diff --git a/enums.js b/enums.js
> index 7f55e46..6e94025 100644
> --- a/enums.js
> +++ b/enums.js
> @@ -133,6 +133,7 @@ var SPICE_MSG_DISPLAY_DRAW_COMPOSITE    = 318;
>  var SPICE_MSG_DISPLAY_STREAM_ACTIVATE_REPORT = 319;
>  
>  var SPICE_MSGC_DISPLAY_INIT             = 101;
> +var SPICE_MSGC_DISPLAY_STREAM_REPORT    = 102;
>  
>  var SPICE_MSG_INPUTS_INIT               = 101;
>  var SPICE_MSG_INPUTS_KEY_MODIFIERS      = 102;
> diff --git a/main.js b/main.js
> index bfc102a..99b2274 100644
> --- a/main.js
> +++ b/main.js
> @@ -86,6 +86,9 @@ SpiceMainConn.prototype.process_channel_message = function(msg)
>                            " ; ram_hint "                + this.main_init.ram_hint);
>          }
>  
> +        this.our_mm_time = Date.now();
> +        this.mm_time = this.main_init.multi_media_time;
> +
>          this.handle_mouse_mode(this.main_init.current_mouse_mode,
>                                 this.main_init.supported_mouse_modes);
>  
> diff --git a/spiceconn.js b/spiceconn.js
> index b7043c0..f19b109 100644
> --- a/spiceconn.js
> +++ b/spiceconn.js
> @@ -135,7 +135,8 @@ SpiceConn.prototype =
>              );
>          else if (msg.channel_type == SPICE_CHANNEL_DISPLAY)
>              msg.channel_caps.push(
> -                (1 << SPICE_DISPLAY_CAP_SIZED_STREAM)
> +                (1 << SPICE_DISPLAY_CAP_SIZED_STREAM) |
> +                (1 << SPICE_DISPLAY_CAP_STREAM_REPORT)
>              );
>  
>          hdr.size = msg.buffer_size();
> diff --git a/spicemsg.js b/spicemsg.js
> index 4b78d94..db6625a 100644
> --- a/spicemsg.js
> +++ b/spicemsg.js
> @@ -1201,6 +1201,60 @@ SpiceMsgDisplayStreamDestroy.prototype =
>      },
>  }
>  
> +function SpiceMsgDisplayStreamActivateReport(a, at)
> +{
> +    this.from_buffer(a, at);
> +}
> +
> +SpiceMsgDisplayStreamActivateReport.prototype =
> +{
> +    from_buffer: function(a, at)
> +    {
> +        at = at || 0;
> +        var dv = new SpiceDataView(a);
> +        this.stream_id = dv.getUint32(at, true); at += 4;
> +        this.unique_id = dv.getUint32(at, true); at += 4;
> +        this.max_window_size = dv.getUint32(at, true); at += 4;
> +        this.timeout_ms = dv.getUint32(at, true); at += 4;
> +    },
> +}
> +
> +function SpiceMsgcDisplayStreamReport(stream_id, unique_id)
> +{
> +    this.stream_id = stream_id;
> +    this.unique_id = unique_id;
> +    this.start_frame_mm_time = 0;
> +    this.end_frame_mm_time = 0;
> +    this.num_frames = 0;
> +    this.num_drops = 0;
> +    this.last_frame_delay = 0;
> +
> +    // TODO - Implement audio delay
> +    this.audio_delay = -1;
> +}
> +
> +SpiceMsgcDisplayStreamReport.prototype =
> +{
> +    to_buffer: function(a, at)
> +    {
> +        at = at || 0;
> +        var dv = new SpiceDataView(a);
> +        dv.setUint32(at, this.stream_id, true); at += 4;
> +        dv.setUint32(at, this.unique_id, true); at += 4;
> +        dv.setUint32(at, this.start_frame_mm_time, true); at += 4;
> +        dv.setUint32(at, this.end_frame_mm_time, true); at += 4;
> +        dv.setUint32(at, this.num_frames, true); at += 4;
> +        dv.setUint32(at, this.num_drops, true); at += 4;
> +        dv.setUint32(at, this.last_frame_delay, true); at += 4;
> +        dv.setUint32(at, this.audio_delay, true); at += 4;
> +        return at;
> +    },
> +    buffer_size: function()
> +    {
> +        return 8 * 4;
> +    }
> +}
> +
>  function SpiceMsgDisplayInvalList(a, at)
>  {
>      this.count = 0;
> -- 
> 2.1.4
> 
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/spice-devel
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 819 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/spice-devel/attachments/20150604/97566c50/attachment.sig>


More information about the Spice-devel mailing list