> > On Tue, Nov 10, 2015 at 3:16 PM, Frediano Ziglio <fziglio@xxxxxxxxxx> wrote: > > From: Marc-André Lureau <marcandre.lureau@xxxxxxxxx> > > > > Signed-off-by: Marc-André Lureau <marcandre.lureau@xxxxxxxxx> > > Signed-off-by: Frediano Ziglio <fziglio@xxxxxxxxxx> > > --- > > server/Makefile.am | 1 + > > server/display-channel.h | 60 +-------------------- > > server/red_worker.c | 45 +--------------- > > server/stream.h | 132 > > +++++++++++++++++++++++++++++++++++++++++++++++ > > 4 files changed, 135 insertions(+), 103 deletions(-) > > create mode 100644 server/stream.h > > > > diff --git a/server/Makefile.am b/server/Makefile.am > > index 7216ab0..8ccf614 100644 > > --- a/server/Makefile.am > > +++ b/server/Makefile.am > > @@ -136,6 +136,7 @@ libspice_server_la_SOURCES = \ > > spice-bitmap-utils.h \ > > spice-bitmap-utils.c \ > > utils.h \ > > + stream.h \ > > $(NULL) > > > > if HAVE_GL > > diff --git a/server/display-channel.h b/server/display-channel.h > > index 055c2a7..7173c6e 100644 > > --- a/server/display-channel.h > > +++ b/server/display-channel.h > > @@ -54,6 +54,7 @@ > > #include "spice_image_cache.h" > > #include "utils.h" > > #include "tree.h" > > +#include "stream.h" > > > > typedef struct DisplayChannel DisplayChannel; > > typedef struct DisplayChannelClient DisplayChannelClient; > > @@ -128,23 +129,6 @@ typedef struct { > > EncoderData data; > > } GlzData; > > > > -typedef struct Stream Stream; > > -struct Stream { > > - uint8_t refs; > > - Drawable *current; > > - red_time_t last_time; > > - int width; > > - int height; > > - SpiceRect dest_area; > > - int top_down; > > - Stream *next; > > - RingItem link; > > - > > - uint32_t num_input_frames; > > - uint64_t input_fps_start_time; > > - uint32_t input_fps; > > -}; > > - > > typedef struct DependItem { > > Drawable *drawable; > > RingItem ring_item; > > @@ -179,48 +163,6 @@ struct Drawable { > > uint32_t process_commands_generation; > > }; > > > > -#define STREAM_STATS > > -#ifdef STREAM_STATS > > -typedef struct StreamStats { > > - uint64_t num_drops_pipe; > > - uint64_t num_drops_fps; > > - uint64_t num_frames_sent; > > - uint64_t num_input_frames; > > - uint64_t size_sent; > > - > > - uint64_t start; > > - uint64_t end; > > -} StreamStats; > > -#endif > > - > > -typedef struct StreamAgent { > > - QRegion vis_region; /* the part of the surface area that is currently > > occupied by video > > - fragments */ > > - QRegion clip; /* the current video clipping. It can be different > > from vis_region: > > - for example, let c1 be the clip area at time > > t1, and c2 > > - be the clip area at time t2, where t1 < t2. If > > c1 contains c2, and > > - at least part of c1/c2, hasn't been covered by > > a non-video images, > > - vis_region will contain c2 and also the part of > > c1/c2 that still > > - displays fragments of the video */ > > - > > - PipeItem create_item; > > - PipeItem destroy_item; > > - Stream *stream; > > - uint64_t last_send_time; > > - MJpegEncoder *mjpeg_encoder; > > - DisplayChannelClient *dcc; > > - > > - int frames; > > - int drops; > > - int fps; > > - > > - uint32_t report_id; > > - uint32_t client_required_latency; > > -#ifdef STREAM_STATS > > - StreamStats stats; > > -#endif > > -} StreamAgent; > > - > > struct DisplayChannelClient { > > CommonChannelClient common; > > > > diff --git a/server/red_worker.c b/server/red_worker.c > > index d73d616..d68a009 100644 > > --- a/server/red_worker.c > > +++ b/server/red_worker.c > > @@ -58,6 +58,7 @@ > > #include "common/generated_server_marshallers.h" > > > > #include "display-channel.h" > > +#include "stream.h" > > > > #include "spice.h" > > #include "red_worker.h" > > @@ -80,21 +81,6 @@ > > > > #define DISPLAY_FREE_LIST_DEFAULT_SIZE 128 > > > > -#define RED_STREAM_DETACTION_MAX_DELTA ((1000 * 1000 * 1000) / 5) // 1/5 > > sec > > -#define RED_STREAM_CONTINUS_MAX_DELTA (1000 * 1000 * 1000) > > -#define RED_STREAM_TIMEOUT (1000 * 1000 * 1000) > > -#define RED_STREAM_FRAMES_START_CONDITION 20 > > -#define RED_STREAM_GRADUAL_FRAMES_START_CONDITION 0.2 > > -#define RED_STREAM_FRAMES_RESET_CONDITION 100 > > -#define RED_STREAM_MIN_SIZE (96 * 96) > > -#define RED_STREAM_INPUT_FPS_TIMEOUT ((uint64_t)5 * 1000 * 1000 * 1000) // > > 5 sec > > -#define RED_STREAM_CHANNEL_CAPACITY 0.8 > > -/* the client's stream report frequency is the minimum of the 2 values > > below */ > > -#define RED_STREAM_CLIENT_REPORT_WINDOW 5 // #frames > > -#define RED_STREAM_CLIENT_REPORT_TIMEOUT 1000 // milliseconds > > -#define RED_STREAM_DEFAULT_HIGH_START_BIT_RATE (10 * 1024 * 1024) // > > 10Mbps > > -#define RED_STREAM_DEFAULT_LOW_START_BIT_RATE (2.5 * 1024 * 1024) // > > 2.5Mbps > > - > > #define FPS_TEST_INTERVAL 1 > > #define MAX_FPS 30 > > > > @@ -241,11 +227,6 @@ typedef struct SurfaceDestroyItem { > > PipeItem pipe_item; > > } SurfaceDestroyItem; > > > > -typedef struct StreamActivateReportItem { > > - PipeItem pipe_item; > > - uint32_t stream_id; > > -} StreamActivateReportItem; > > - > > #define MAX_PIPE_SIZE 50 > > > > #define WIDE_CLIENT_ACK_WINDOW 40 > > @@ -266,20 +247,6 @@ typedef struct ImageItem { > > uint8_t data[0]; > > } ImageItem; > > > > -enum { > > - STREAM_FRAME_NONE, > > - STREAM_FRAME_NATIVE, > > - STREAM_FRAME_CONTAINER, > > -}; > > - > > -typedef struct StreamClipItem { > > - PipeItem base; > > - int refs; > > - StreamAgent *stream_agent; > > - int clip_type; > > - SpiceClipRects *rects; > > -} StreamClipItem; > > - > > typedef struct { > > QuicUsrContext usr; > > EncoderData data; > > @@ -382,16 +349,6 @@ typedef struct RedSurface { > > QXLReleaseInfoExt create, destroy; > > } RedSurface; > > > > -typedef struct ItemTrace { > > - red_time_t time; > > - int frames_count; > > - int gradual_frames_count; > > - int last_gradual_frame; > > - int width; > > - int height; > > - SpiceRect dest_area; > > -} ItemTrace; > > Item trace is just used here (red_worker.c), I would prefer to keep it here. > > > - > > #define TRACE_ITEMS_SHIFT 3 > > #define NUM_TRACE_ITEMS (1 << TRACE_ITEMS_SHIFT) > > #define ITEMS_TRACE_MASK (NUM_TRACE_ITEMS - 1) > > diff --git a/server/stream.h b/server/stream.h > > new file mode 100644 > > index 0000000..210abd7 > > --- /dev/null > > +++ b/server/stream.h > > @@ -0,0 +1,132 @@ > > +/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */ > > +/* > > + Copyright (C) 2009-2015 Red Hat, Inc. > > + > > + This library is free software; you can redistribute it and/or > > + modify it under the terms of the GNU Lesser General Public > > + License as published by the Free Software Foundation; either > > + version 2.1 of the License, or (at your option) any later version. > > + > > + This library is distributed in the hope that it will be useful, > > + but WITHOUT ANY WARRANTY; without even the implied warranty of > > + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > > + Lesser General Public License for more details. > > + > > + You should have received a copy of the GNU Lesser General Public > > + License along with this library; if not, see > > <http://www.gnu.org/licenses/>. > > +*/ > > +#ifndef STREAM_H_ > > +#define STREAM_H_ > > + > > +#include <glib.h> > > +#include "utils.h" > > +#include "mjpeg_encoder.h" > > +#include "common/region.h" > > +#include "red_channel.h" > > +#include "spice_image_cache.h" > > + > > +#define RED_STREAM_DETACTION_MAX_DELTA ((1000 * 1000 * 1000) / 5) // 1/5 > > sec > > +#define RED_STREAM_CONTINUS_MAX_DELTA (1000 * 1000 * 1000) > > +#define RED_STREAM_TIMEOUT (1000 * 1000 * 1000) > > +#define RED_STREAM_FRAMES_START_CONDITION 20 > > +#define RED_STREAM_GRADUAL_FRAMES_START_CONDITION 0.2 > > +#define RED_STREAM_FRAMES_RESET_CONDITION 100 > > +#define RED_STREAM_MIN_SIZE (96 * 96) > > +#define RED_STREAM_INPUT_FPS_TIMEOUT ((uint64_t)5 * 1000 * 1000 * 1000) // > > 5 sec > > +#define RED_STREAM_CHANNEL_CAPACITY 0.8 > > +/* the client's stream report frequency is the minimum of the 2 values > > below */ > > +#define RED_STREAM_CLIENT_REPORT_WINDOW 5 // #frames > > +#define RED_STREAM_CLIENT_REPORT_TIMEOUT 1000 // milliseconds > > +#define RED_STREAM_DEFAULT_HIGH_START_BIT_RATE (10 * 1024 * 1024) // > > 10Mbps > > +#define RED_STREAM_DEFAULT_LOW_START_BIT_RATE (2.5 * 1024 * 1024) // > > 2.5Mbps > > + > > +typedef struct Stream Stream; > > + > > +typedef struct StreamActivateReportItem { > > + PipeItem pipe_item; > > + uint32_t stream_id; > > +} StreamActivateReportItem; > > + > > +enum { > > + STREAM_FRAME_NONE, > > + STREAM_FRAME_NATIVE, > > + STREAM_FRAME_CONTAINER, > > +}; > > + > > +#define STREAM_STATS > > +#ifdef STREAM_STATS > > +typedef struct StreamStats { > > + uint64_t num_drops_pipe; > > + uint64_t num_drops_fps; > > + uint64_t num_frames_sent; > > + uint64_t num_input_frames; > > + uint64_t size_sent; > > + > > + uint64_t start; > > + uint64_t end; > > +} StreamStats; > > +#endif > > + > > +typedef struct StreamAgent { > > + QRegion vis_region; /* the part of the surface area that is currently > > occupied by video > > + fragments */ > > + QRegion clip; /* the current video clipping. It can be different > > from vis_region: > > + for example, let c1 be the clip area at time > > t1, and c2 > > + be the clip area at time t2, where t1 < t2. If > > c1 contains c2, and > > + at least part of c1/c2, hasn't been covered by > > a non-video images, > > + vis_region will contain c2 and also the part of > > c1/c2 that still > > + displays fragments of the video */ > > + > > + PipeItem create_item; > > + PipeItem destroy_item; > > + Stream *stream; > > + uint64_t last_send_time; > > + MJpegEncoder *mjpeg_encoder; > > + DisplayChannelClient *dcc; > > + > > + int frames; > > + int drops; > > + int fps; > > + > > + uint32_t report_id; > > + uint32_t client_required_latency; > > +#ifdef STREAM_STATS > > + StreamStats stats; > > +#endif > > +} StreamAgent; > > + > > +typedef struct StreamClipItem { > > + PipeItem base; > > + int refs; > > + StreamAgent *stream_agent; > > + int clip_type; > > + SpiceClipRects *rects; > > +} StreamClipItem; > > + > > +typedef struct ItemTrace { > > + red_time_t time; > > + int frames_count; > > + int gradual_frames_count; > > + int last_gradual_frame; > > + int width; > > + int height; > > + SpiceRect dest_area; > > +} ItemTrace; > > + > > +struct Stream { > > + uint8_t refs; > > + Drawable *current; > > + red_time_t last_time; > > + int width; > > + int height; > > + SpiceRect dest_area; > > + int top_down; > > + Stream *next; > > + RingItem link; > > + > > + uint32_t num_input_frames; > > + uint64_t input_fps_start_time; > > + uint32_t input_fps; > > +}; > > + > > +#endif /* STREAM_H */ > > -- > > 2.4.3 > > > > _______________________________________________ > > Spice-devel mailing list > > Spice-devel@xxxxxxxxxxxxxxxxxxxxx > > http://lists.freedesktop.org/mailman/listinfo/spice-devel > > ACK! > Merged with the change you suggested Frediano _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/spice-devel