[Spice-devel] [PATCH spice 1/2] server: Refresh the input fps every 5 second, without a timer.

Marc-André Lureau marcandre.lureau at gmail.com
Thu Jun 11 15:14:15 PDT 2015


Hi

On Thu, Jun 11, 2015 at 7:39 PM, Francois Gouget <fgouget at codeweavers.com>
wrote:

> Signed-off-by: Francois Gouget <fgouget at codeweavers.com>
> ---
>
> This implements Marc-André Lureau's suggestion:
> http://lists.freedesktop.org/archives/spice-devel/2015-June/020202.html
>
> And supersedes the input-fps rounding patch.
> http://lists.freedesktop.org/archives/spice-devel/2015-June/020176.html
>
>
>  server/red_worker.c | 45 +++++++++++++++------------------------------
>  1 file changed, 15 insertions(+), 30 deletions(-)
>
> diff --git a/server/red_worker.c b/server/red_worker.c
> index 5deb30b..a07a78a 100644
> --- a/server/red_worker.c
> +++ b/server/red_worker.c
> @@ -120,7 +120,7 @@
>  #define RED_STREAM_GRADUAL_FRAMES_START_CONDITION 0.2
>  #define RED_STREAM_FRAMES_RESET_CONDITION 100
>  #define RED_STREAM_MIN_SIZE (96 * 96)
> -#define RED_STREAM_INPUT_FPS_TIMEOUT (5 * 1000) // 5 sec
> +#define RED_STREAM_INPUT_FPS_TIMEOUT ((uint64_t)5 * 1000 * 1000 * 1000)
> // 5 sec
>  #define RED_STREAM_CHANNEL_CAPACITY 0.8
>  /* the client's stream report frequency is the minimum of the 2 values
> below */
>  #define RED_STREAM_CLIENT_REPORT_WINDOW 5 // #frames
> @@ -450,9 +450,8 @@ struct Stream {
>      Stream *next;
>      RingItem link;
>
> -    SpiceTimer *input_fps_timer;
>      uint32_t num_input_frames;
> -    uint64_t input_fps_timer_start;
> +    uint64_t input_fps_start_time;
>      uint32_t input_fps;
>  };
>
> @@ -2532,9 +2531,6 @@ static int is_same_drawable(RedWorker *worker,
> Drawable *d1, Drawable *d2)
>
>  static inline void red_free_stream(RedWorker *worker, Stream *stream)
>  {
> -    if (stream->input_fps_timer) {
> -        spice_timer_remove(stream->input_fps_timer);
> -    }
>      stream->next = worker->free_streams;
>      worker->free_streams = stream;
>  }
> @@ -2613,7 +2609,17 @@ static void red_attach_stream(RedWorker *worker,
> Drawable *drawable, Stream *str
>      stream->current = drawable;
>      drawable->stream = stream;
>      stream->last_time = drawable->creation_time;
> -    stream->num_input_frames++;
> +
> +    uint64_t duration = drawable->creation_time -
> stream->input_fps_start_time;
> +    if (duration >= RED_STREAM_INPUT_FPS_TIMEOUT) {
> +        /* Round to the nearest integer, for instance 24 for 23.976 */
> +        stream->input_fps = ((uint64_t)stream->num_input_frames * 1000 *
> 1000 * 1000 + duration / 2) / duration;
> +        spice_debug("input-fps=%u", stream->input_fps);
> +        stream->num_input_frames = 0;
> +        stream->input_fps_start_time = drawable->creation_time;
>

Every time RED_STREAM_INPUT_FPS_TIMEOUT elpased and a new frame comes,
input_fps is updated.

Patch looks good to me, I haven't tested it though.

+    } else {
> +        stream->num_input_frames++;
> +    }
>
>      WORKER_FOREACH_DCC_SAFE(worker, item, next, dcc) {
>          StreamAgent *agent;
> @@ -3123,24 +3129,6 @@ static void
> red_display_create_stream(DisplayChannelClient *dcc, Stream *stream)
>  #endif
>  }
>
> -static void red_stream_input_fps_timer_cb(void *opaque)
> -{
> -    Stream *stream = opaque;
> -    uint64_t now = red_now();
> -    double duration_sec;
> -
> -    spice_assert(opaque);
> -    if (now == stream->input_fps_timer_start) {
> -        spice_warning("timer start and expiry time are equal");
> -        return;
> -    }
> -    duration_sec = (now -
> stream->input_fps_timer_start)/(1000.0*1000*1000);
> -    stream->input_fps = stream->num_input_frames / duration_sec;
> -    spice_debug("input-fps=%u", stream->input_fps);
> -    stream->num_input_frames = 0;
> -    stream->input_fps_timer_start = now;
> -}
> -
>  static void red_create_stream(RedWorker *worker, Drawable *drawable)
>  {
>      DisplayChannelClient *dcc;
> @@ -3167,12 +3155,9 @@ static void red_create_stream(RedWorker *worker,
> Drawable *drawable)
>      SpiceBitmap *bitmap =
> &drawable->red_drawable->u.copy.src_bitmap->u.bitmap;
>      stream->top_down = !!(bitmap->flags & SPICE_BITMAP_FLAGS_TOP_DOWN);
>      drawable->stream = stream;
> -    stream->input_fps_timer =
> spice_timer_queue_add(red_stream_input_fps_timer_cb, stream);
> -    spice_assert(stream->input_fps_timer);
> -    spice_timer_set(stream->input_fps_timer,
> RED_STREAM_INPUT_FPS_TIMEOUT);
> -    stream->num_input_frames = 0;
> -    stream->input_fps_timer_start = red_now();
>      stream->input_fps = MAX_FPS;
> +    stream->num_input_frames = 0;
> +    stream->input_fps_start_time = drawable->creation_time;
>      worker->streams_size_total += stream->width * stream->height;
>      worker->stream_count++;
>      WORKER_FOREACH_DCC_SAFE(worker, dcc_ring_item, next, dcc) {
> --
> 2.1.4
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/spice-devel
>
>


-- 
Marc-André Lureau
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/spice-devel/attachments/20150612/577da737/attachment.html>


More information about the Spice-devel mailing list