From ac2a854fbfe7b85892c2f6d6eaeaf27d559f9bd7 Mon Sep 17 00:00:00 2001 From: Jonathon Jongsma Date: Tue, 10 Nov 2015 14:41:16 -0600 Subject: worker: Move stream functions to stream.c MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Acked-by: Fabiano FidĂȘncio --- server/stream.c | 70 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) (limited to 'server/stream.c') 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); -- cgit