diff options
author | Marc-André Lureau <marcandre.lureau@gmail.com> | 2013-09-26 14:01:41 +0200 |
---|---|---|
committer | Frediano Ziglio <fziglio@redhat.com> | 2015-11-24 08:55:59 +0000 |
commit | 1549f751b8b9cdaf17b721a8400b6cffce7e36ed (patch) | |
tree | c6a878b510cd24253ed19b848cfad4c55ca143ba /server/dcc.c | |
parent | 1b6881c83b8838b9cd0e81ac40a02e67552e8dbe (diff) | |
download | spice-1549f751b8b9cdaf17b721a8400b6cffce7e36ed.tar.gz spice-1549f751b8b9cdaf17b721a8400b6cffce7e36ed.tar.xz spice-1549f751b8b9cdaf17b721a8400b6cffce7e36ed.zip |
worker: move dcc_handle_message
Acked-by: Fabiano Fidêncio <fidencio@redhat.com>
Diffstat (limited to 'server/dcc.c')
-rw-r--r-- | server/dcc.c | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/server/dcc.c b/server/dcc.c index 6115569d..ec0295a4 100644 --- a/server/dcc.c +++ b/server/dcc.c @@ -1091,3 +1091,84 @@ int dcc_pixmap_cache_unlocked_add(DisplayChannelClient *dcc, uint64_t id, cache->sync[dcc->common.id] = serial; return TRUE; } + +static int dcc_handle_init(DisplayChannelClient *dcc, SpiceMsgcDisplayInit *init) +{ + spice_return_val_if_fail(dcc->expect_init, FALSE); + dcc->expect_init = FALSE; + + spice_return_val_if_fail(!dcc->pixmap_cache, FALSE); + dcc->pixmap_cache = pixmap_cache_get(RED_CHANNEL_CLIENT(dcc)->client, + init->pixmap_cache_id, + init->pixmap_cache_size); + spice_return_val_if_fail(dcc->pixmap_cache, FALSE); + + spice_return_val_if_fail(!dcc->glz_dict, FALSE); + ring_init(&dcc->glz_drawables); + ring_init(&dcc->glz_drawables_inst_to_free); + pthread_mutex_init(&dcc->glz_drawables_inst_to_free_lock, NULL); + dcc->glz_dict = dcc_get_glz_dictionary(dcc, + init->glz_dictionary_id, + init->glz_dictionary_window_size); + spice_return_val_if_fail(dcc->glz_dict, FALSE); + + return TRUE; +} + +static int dcc_handle_stream_report(DisplayChannelClient *dcc, + SpiceMsgcDisplayStreamReport *report) +{ + StreamAgent *agent; + + spice_return_val_if_fail(report->stream_id < NUM_STREAMS, FALSE); + agent = &dcc->stream_agents[report->stream_id]; + spice_return_val_if_fail(agent->mjpeg_encoder, TRUE); + spice_return_val_if_fail(report->unique_id == agent->report_id, TRUE); + + mjpeg_encoder_client_stream_report(agent->mjpeg_encoder, + report->num_frames, + report->num_drops, + report->start_frame_mm_time, + report->end_frame_mm_time, + report->last_frame_delay, + report->audio_delay); + return TRUE; +} + +static int dcc_handle_preferred_compression(DisplayChannelClient *dcc, + SpiceMsgcDisplayPreferredCompression *pc) +{ + switch (pc->image_compression) { + case SPICE_IMAGE_COMPRESSION_AUTO_LZ: + case SPICE_IMAGE_COMPRESSION_AUTO_GLZ: + case SPICE_IMAGE_COMPRESSION_QUIC: +#ifdef USE_LZ4 + case SPICE_IMAGE_COMPRESSION_LZ4: +#endif + case SPICE_IMAGE_COMPRESSION_LZ: + case SPICE_IMAGE_COMPRESSION_GLZ: + case SPICE_IMAGE_COMPRESSION_OFF: + dcc->image_compression = pc->image_compression; + return TRUE; + default: + spice_warning("preferred-compression: unsupported image compression setting"); + return FALSE; + } +} + +int dcc_handle_message(RedChannelClient *rcc, uint32_t size, uint16_t type, void *msg) +{ + DisplayChannelClient *dcc = RCC_TO_DCC(rcc); + + switch (type) { + case SPICE_MSGC_DISPLAY_INIT: + return dcc_handle_init(dcc, (SpiceMsgcDisplayInit *)msg); + case SPICE_MSGC_DISPLAY_STREAM_REPORT: + return dcc_handle_stream_report(dcc, (SpiceMsgcDisplayStreamReport *)msg); + case SPICE_MSGC_DISPLAY_PREFERRED_COMPRESSION: + return dcc_handle_preferred_compression(dcc, + (SpiceMsgcDisplayPreferredCompression *)msg); + default: + return red_channel_client_handle_message(rcc, size, type, msg); + } +} |