Like the previous commit, this function deals with how the DisplayChannel allocates and manages the video streams, so it belongs with the implementation of DisplayChannel. Signed-off-by: Jonathon Jongsma <jjongsma@xxxxxxxxxx> --- server/display-channel.c | 61 ++++++++++++++++++++++++++++++++++++++++++++++++ server/display-channel.h | 2 ++ server/video-stream.c | 61 ------------------------------------------------ 3 files changed, 63 insertions(+), 61 deletions(-) diff --git a/server/display-channel.c b/server/display-channel.c index 8c3d72899..c5d80997d 100644 --- a/server/display-channel.c +++ b/server/display-channel.c @@ -2299,6 +2299,67 @@ static void display_channel_init_video_streams(DisplayChannel *display) } } +static VideoStream *display_channel_video_stream_try_new(DisplayChannel *display) +{ + VideoStream *stream; + if (!display->priv->free_streams) { + return NULL; + } + stream = display->priv->free_streams; + display->priv->free_streams = display->priv->free_streams->next; + stream->display = display; + return stream; +} + +void display_channel_create_video_stream(DisplayChannel *display, Drawable *drawable) +{ + DisplayChannelClient *dcc; + VideoStream *stream; + SpiceRect* src_rect; + + spice_assert(!drawable->stream); + + if (!(stream = display_channel_video_stream_try_new(display))) { + return; + } + + spice_assert(drawable->red_drawable->type == QXL_DRAW_COPY); + src_rect = &drawable->red_drawable->u.copy.src_area; + + ring_add(&display->priv->streams, &stream->link); + stream->current = drawable; + stream->last_time = drawable->creation_time; + stream->width = src_rect->right - src_rect->left; + stream->height = src_rect->bottom - src_rect->top; + stream->dest_area = drawable->red_drawable->bbox; + stream->refs = 1; + SpiceBitmap *bitmap = &drawable->red_drawable->u.copy.src_bitmap->u.bitmap; + stream->top_down = !!(bitmap->flags & SPICE_BITMAP_FLAGS_TOP_DOWN); + drawable->stream = stream; + /* Provide an fps estimate the video encoder can use when initializing + * based on the frames that lead to the creation of the stream. Round to + * the nearest integer, for instance 24 for 23.976. + */ + uint64_t duration = drawable->creation_time - drawable->first_frame_time; + if (duration > NSEC_PER_SEC * drawable->frames_count / MAX_FPS) { + stream->input_fps = (NSEC_PER_SEC * drawable->frames_count + duration / 2) / duration; + } else { + stream->input_fps = MAX_FPS; + } + stream->num_input_frames = 0; + stream->input_fps_start_time = drawable->creation_time; + display->priv->streams_size_total += stream->width * stream->height; + display->priv->stream_count++; + FOREACH_DCC(display, dcc) { + dcc_create_stream(dcc, stream); + } + spice_debug("stream %d %dx%d (%d, %d) (%d, %d) %u fps", + display_channel_get_stream_id(display, stream), stream->width, + stream->height, stream->dest_area.left, stream->dest_area.top, + stream->dest_area.right, stream->dest_area.bottom, + stream->input_fps); +} + static void display_channel_constructed(GObject *object) { diff --git a/server/display-channel.h b/server/display-channel.h index 377fc7ea7..3a18c2cc7 100644 --- a/server/display-channel.h +++ b/server/display-channel.h @@ -157,6 +157,8 @@ void display_channel_gl_scanout (DisplayCha void display_channel_gl_draw (DisplayChannel *display, SpiceMsgDisplayGlDraw *draw); void display_channel_gl_draw_done (DisplayChannel *display); +void display_channel_create_video_stream (DisplayChannel *display, + Drawable *drawable); void display_channel_free_video_stream (DisplayChannel *display, VideoStream *stream); diff --git a/server/video-stream.c b/server/video-stream.c index a88d0ae5f..50e53b7b6 100644 --- a/server/video-stream.c +++ b/server/video-stream.c @@ -221,67 +221,6 @@ static void before_reattach_stream(DisplayChannel *display, } } -static VideoStream *display_channel_video_stream_try_new(DisplayChannel *display) -{ - VideoStream *stream; - if (!display->priv->free_streams) { - return NULL; - } - stream = display->priv->free_streams; - display->priv->free_streams = display->priv->free_streams->next; - stream->display = display; - return stream; -} - -static void display_channel_create_video_stream(DisplayChannel *display, Drawable *drawable) -{ - DisplayChannelClient *dcc; - VideoStream *stream; - SpiceRect* src_rect; - - spice_assert(!drawable->stream); - - if (!(stream = display_channel_video_stream_try_new(display))) { - return; - } - - spice_assert(drawable->red_drawable->type == QXL_DRAW_COPY); - src_rect = &drawable->red_drawable->u.copy.src_area; - - ring_add(&display->priv->streams, &stream->link); - stream->current = drawable; - stream->last_time = drawable->creation_time; - stream->width = src_rect->right - src_rect->left; - stream->height = src_rect->bottom - src_rect->top; - stream->dest_area = drawable->red_drawable->bbox; - stream->refs = 1; - SpiceBitmap *bitmap = &drawable->red_drawable->u.copy.src_bitmap->u.bitmap; - stream->top_down = !!(bitmap->flags & SPICE_BITMAP_FLAGS_TOP_DOWN); - drawable->stream = stream; - /* Provide an fps estimate the video encoder can use when initializing - * based on the frames that lead to the creation of the stream. Round to - * the nearest integer, for instance 24 for 23.976. - */ - uint64_t duration = drawable->creation_time - drawable->first_frame_time; - if (duration > NSEC_PER_SEC * drawable->frames_count / MAX_FPS) { - stream->input_fps = (NSEC_PER_SEC * drawable->frames_count + duration / 2) / duration; - } else { - stream->input_fps = MAX_FPS; - } - stream->num_input_frames = 0; - stream->input_fps_start_time = drawable->creation_time; - display->priv->streams_size_total += stream->width * stream->height; - display->priv->stream_count++; - FOREACH_DCC(display, dcc) { - dcc_create_stream(dcc, stream); - } - spice_debug("stream %d %dx%d (%d, %d) (%d, %d) %u fps", - display_channel_get_stream_id(display, stream), stream->width, - stream->height, stream->dest_area.left, stream->dest_area.top, - stream->dest_area.right, stream->dest_area.bottom, - stream->input_fps); -} - // returns whether a stream was created static bool video_stream_add_frame(DisplayChannel *display, Drawable *frame_drawable, -- 2.13.6 _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/spice-devel