summaryrefslogtreecommitdiffstats
path: root/server/dcc.c
diff options
context:
space:
mode:
authorMarc-André Lureau <marcandre.lureau@gmail.com>2013-09-26 14:01:41 +0200
committerFrediano Ziglio <fziglio@redhat.com>2015-11-24 08:55:59 +0000
commit1549f751b8b9cdaf17b721a8400b6cffce7e36ed (patch)
treec6a878b510cd24253ed19b848cfad4c55ca143ba /server/dcc.c
parent1b6881c83b8838b9cd0e81ac40a02e67552e8dbe (diff)
downloadspice-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.c81
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);
+ }
+}