Remove guest side video time-stamping

The multimedia time is defined by the server side monotonic time [1],
but the drawing time-stamp is done in guest side, so it requires
synchronization between host and guest. This is expensive, when no audio
is playing, there is a ~30x/sec wakeup to update the qxl device mmtime,
and it requires marking dirty the rom region.

Instead, the video timestamping can be done more efficiently on server
side, without visible drawbacks.

[1] a better timestamp could be the audio time, since audio players are
    usually sync with audio time)

Related to:
https://bugzilla.redhat.com/show_bug.cgi?id=912763
This commit is contained in:
Marc-André Lureau 2014-11-02 22:11:58 +01:00
parent ab12cf414c
commit c541d7e29d
6 changed files with 2 additions and 26 deletions

View File

@ -751,15 +751,6 @@ static void qxl_worker_loadvm_commands(QXLWorker *qxl_worker,
red_dispatcher_loadvm_commands((RedDispatcher*)qxl_worker, ext, count);
}
void red_dispatcher_set_mm_time(uint32_t mm_time)
{
RedDispatcher *now = dispatchers;
while (now) {
now->qxl->st->qif->set_mm_time(now->qxl, mm_time);
now = now->next;
}
}
static inline int calc_compression_level(void)
{
spice_assert(streaming_video != STREAM_VIDEO_INVALID);

View File

@ -4195,6 +4195,7 @@ static inline void red_process_drawable(RedWorker *worker, RedDrawable *red_draw
return;
}
red_drawable->mm_time = reds_get_mm_time();
surface_id = drawable->surface_id;
worker->surfaces[surface_id].refs++;

View File

@ -6,7 +6,6 @@
#include <spice/protocol.h>
#define MIGRATE_TIMEOUT (1000 * 10) /* 10sec */
#define MM_TIMER_GRANULARITY_MS (1000 / 30)
#define MM_TIME_DELTA 400 /*ms*/
typedef struct TicketAuthentication {
@ -159,7 +158,6 @@ typedef struct RedsState {
int dispatcher_allows_client_mouse;
MonitorMode monitor_mode;
SpiceTimer *mig_timer;
SpiceTimer *mm_timer;
int vm_running;
Ring char_devs_states; /* list of SpiceCharDeviceStateItem */

View File

@ -2830,7 +2830,6 @@ uint32_t reds_get_mm_time(void)
void reds_enable_mm_timer(void)
{
core->timer_start(reds->mm_timer, MM_TIMER_GRANULARITY_MS);
reds->mm_timer_enabled = TRUE;
reds->mm_time_latency = MM_TIME_DELTA;
reds_send_mm_time();
@ -2838,16 +2837,9 @@ void reds_enable_mm_timer(void)
void reds_disable_mm_timer(void)
{
core->timer_cancel(reds->mm_timer);
reds->mm_timer_enabled = FALSE;
}
static void mm_timer_proc(void *opaque)
{
red_dispatcher_set_mm_time(reds_get_mm_time());
core->timer_start(reds->mm_timer, MM_TIMER_GRANULARITY_MS);
}
static SpiceCharDeviceState *attach_to_red_agent(SpiceCharDeviceInstance *sin)
{
VDIPortState *state = &reds->agent_state;
@ -3271,11 +3263,6 @@ static int do_spice_init(SpiceCoreInterface *core_interface)
}
#endif
if (!(reds->mm_timer = core->timer_add(mm_timer_proc, NULL))) {
spice_error("mm timer create failed");
}
reds_enable_mm_timer();
if (reds_init_net() < 0) {
goto err;
}

View File

@ -1117,7 +1117,6 @@ SPICE_GNUC_VISIBLE void spice_server_playback_put_samples(SpicePlaybackInstance
snd_playback_free_frame(playback_channel, playback_channel->pending_frame);
}
frame->time = reds_get_mm_time();
red_dispatcher_set_mm_time(frame->time);
playback_channel->pending_frame = frame;
snd_set_command(&playback_channel->base, SND_PLAYBACK_PCM_MASK);
snd_playback_send(&playback_channel->base);

View File

@ -156,7 +156,7 @@ struct QXLInterface {
void (*attache_worker)(QXLInstance *qin, QXLWorker *qxl_worker);
void (*set_compression_level)(QXLInstance *qin, int level);
void (*set_mm_time)(QXLInstance *qin, uint32_t mm_time);
void (*set_mm_time)(QXLInstance *qin, uint32_t mm_time) SPICE_GNUC_DEPRECATED;
void (*get_init_info)(QXLInstance *qin, QXLDevInitInfo *info);
int (*get_command)(QXLInstance *qin, struct QXLCommandExt *cmd);