[Spice-devel] [PATCH spice-server 14/28] red_worker: stream - update periodically the input frame rate
Alon Levy
alevy at redhat.com
Sun Apr 14 06:29:16 PDT 2013
On Tue, Feb 26, 2013 at 01:04:00PM -0500, Yonit Halperin wrote:
> Periodically calculate the rate of frames arriving from the guest to the
> server.
ACK.
red_now should be put in a header later.
> ---
> server/red_worker.c | 36 +++++++++++++++++++++++++++++++++++-
> 1 file changed, 35 insertions(+), 1 deletion(-)
>
> diff --git a/server/red_worker.c b/server/red_worker.c
> index c992688..82f2fc9 100644
> --- a/server/red_worker.c
> +++ b/server/red_worker.c
> @@ -115,6 +115,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 FPS_TEST_INTERVAL 1
> #define MAX_FPS 30
> @@ -432,6 +433,11 @@ struct Stream {
> Stream *next;
> RingItem link;
> int bit_rate;
> +
> + SpiceTimer *input_fps_timer;
> + uint32_t num_input_frames;
> + uint64_t input_fps_timer_start;
> + uint32_t input_fps;
> };
>
> typedef struct StreamAgent {
> @@ -1063,6 +1069,7 @@ static void dump_bitmap(RedWorker *worker, SpiceBitmap *bitmap, uint32_t group_i
> #endif
>
> static void red_push_monitors_config(DisplayChannelClient *dcc);
> +static inline uint64_t red_now(void);
>
> /*
> * Macros to make iterating over stuff easier
> @@ -2477,6 +2484,9 @@ 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;
> }
> @@ -2555,6 +2565,7 @@ 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++;
>
> WORKER_FOREACH_DCC(worker, item, dcc) {
> StreamAgent *agent;
> @@ -2892,6 +2903,24 @@ static void red_display_create_stream(DisplayChannelClient *dcc, Stream *stream)
> red_channel_client_pipe_add(&dcc->common.base, &agent->create_item);
> }
>
> +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;
> +}
> +
> /* TODO: we create the stream even if dcc is NULL, i.e. no client - or
> * maybe we can't reach this function in that case? question: do we want to? */
> static void red_create_stream(RedWorker *worker, Drawable *drawable)
> @@ -2925,7 +2954,12 @@ 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;
> WORKER_FOREACH_DCC(worker, dcc_ring_item, dcc) {
> red_display_create_stream(dcc, stream);
> }
> --
> 1.8.1
>
> _______________________________________________
> 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