summaryrefslogtreecommitdiffstats
path: root/server/stream.c
diff options
context:
space:
mode:
authorJonathon Jongsma <jjongsma@redhat.com>2015-11-10 14:41:16 -0600
committerFrediano Ziglio <fziglio@redhat.com>2015-11-18 08:37:21 +0000
commitac2a854fbfe7b85892c2f6d6eaeaf27d559f9bd7 (patch)
tree1164cc0efcb5c687623c28fa7e22ab7bc9f44d72 /server/stream.c
parent5897952f46881a3324c9c7be9339065310011079 (diff)
downloadspice-ac2a854fbfe7b85892c2f6d6eaeaf27d559f9bd7.tar.gz
spice-ac2a854fbfe7b85892c2f6d6eaeaf27d559f9bd7.tar.xz
spice-ac2a854fbfe7b85892c2f6d6eaeaf27d559f9bd7.zip
worker: Move stream functions to stream.c
Acked-by: Fabiano FidĂȘncio <fidencio@redhat.com>
Diffstat (limited to 'server/stream.c')
-rw-r--r--server/stream.c70
1 files changed, 70 insertions, 0 deletions
diff --git a/server/stream.c b/server/stream.c
index 7ef78767..406111c2 100644
--- a/server/stream.c
+++ b/server/stream.c
@@ -57,6 +57,76 @@ void stream_agent_stats_print(StreamAgent *agent)
#endif
}
+void stream_stop(DisplayChannel *display, Stream *stream)
+{
+ DisplayChannelClient *dcc;
+ RingItem *item, *next;
+
+ spice_return_if_fail(ring_item_is_linked(&stream->link));
+ spice_return_if_fail(!stream->current);
+
+ spice_debug("stream %d", get_stream_id(display, stream));
+ FOREACH_DCC(display, item, next, dcc) {
+ StreamAgent *stream_agent;
+
+ stream_agent = &dcc->stream_agents[get_stream_id(display, stream)];
+ region_clear(&stream_agent->vis_region);
+ region_clear(&stream_agent->clip);
+ spice_assert(!pipe_item_is_linked(&stream_agent->destroy_item));
+ if (stream_agent->mjpeg_encoder && dcc->use_mjpeg_encoder_rate_control) {
+ uint64_t stream_bit_rate = mjpeg_encoder_get_bit_rate(stream_agent->mjpeg_encoder);
+
+ if (stream_bit_rate > dcc->streams_max_bit_rate) {
+ spice_debug("old max-bit-rate=%.2f new=%.2f",
+ dcc->streams_max_bit_rate / 8.0 / 1024.0 / 1024.0,
+ stream_bit_rate / 8.0 / 1024.0 / 1024.0);
+ dcc->streams_max_bit_rate = stream_bit_rate;
+ }
+ }
+ stream->refs++;
+ red_channel_client_pipe_add(RED_CHANNEL_CLIENT(dcc), &stream_agent->destroy_item);
+ stream_agent_stats_print(stream_agent);
+ }
+ display->streams_size_total -= stream->width * stream->height;
+ ring_remove(&stream->link);
+ stream_unref(display, stream);
+}
+
+static void stream_free(DisplayChannel *display, Stream *stream)
+{
+ stream->next = display->free_streams;
+ display->free_streams = stream;
+}
+
+void display_channel_init_streams(DisplayChannel *display)
+{
+ int i;
+
+ ring_init(&display->streams);
+ display->free_streams = NULL;
+ for (i = 0; i < NUM_STREAMS; i++) {
+ Stream *stream = &display->streams_buf[i];
+ ring_item_init(&stream->link);
+ stream_free(display, stream);
+ }
+}
+
+void stream_unref(DisplayChannel *display, Stream *stream)
+{
+ if (--stream->refs != 0)
+ return;
+
+ spice_warn_if_fail(!ring_item_is_linked(&stream->link));
+
+ stream_free(display, stream);
+ display->stream_count--;
+}
+
+void stream_agent_unref(DisplayChannel *display, StreamAgent *agent)
+{
+ stream_unref(display, agent->stream);
+}
+
StreamClipItem *stream_clip_item_new(DisplayChannelClient* dcc, StreamAgent *agent)
{
StreamClipItem *item = spice_new(StreamClipItem, 1);