On Tue, Feb 26, 2013 at 01:04:10PM -0500, Yonit Halperin wrote: > mjpeg_encoder modify the initial bit we supply it, according to the > client feedback. If it reaches a bit rate which is higher than the > initial one, we use the higher bit rate as the new bit rate estimation. ACK to this and the rest. > --- > server/mjpeg_encoder.c | 5 +++++ > server/mjpeg_encoder.h | 2 ++ > server/red_worker.c | 16 +++++++++++++++- > 3 files changed, 22 insertions(+), 1 deletion(-) > > diff --git a/server/mjpeg_encoder.c b/server/mjpeg_encoder.c > index 277794b..7825955 100644 > --- a/server/mjpeg_encoder.c > +++ b/server/mjpeg_encoder.c > @@ -1237,3 +1237,8 @@ static void mjpeg_encoder_process_server_drops(MJpegEncoder *encoder) > server_state->num_frames_encoded = 0; > server_state->num_frames_dropped = 0; > } > + > +uint64_t mjpeg_encoder_get_bit_rate(MJpegEncoder *encoder) > +{ > + return encoder->rate_control.byte_rate * 8; > +} > diff --git a/server/mjpeg_encoder.h b/server/mjpeg_encoder.h > index 0ee2e96..310d289 100644 > --- a/server/mjpeg_encoder.h > +++ b/server/mjpeg_encoder.h > @@ -102,4 +102,6 @@ void mjpeg_encoder_client_stream_report(MJpegEncoder *encoder, > */ > void mjpeg_encoder_notify_server_frame_drop(MJpegEncoder *encoder); > > +uint64_t mjpeg_encoder_get_bit_rate(MJpegEncoder *encoder); > + > #endif > diff --git a/server/red_worker.c b/server/red_worker.c > index acf391d..954b950 100644 > --- a/server/red_worker.c > +++ b/server/red_worker.c > @@ -693,6 +693,7 @@ struct DisplayChannelClient { > StreamAgent stream_agents[NUM_STREAMS]; > int use_mjpeg_encoder_rate_control; > uint32_t streams_max_latency; > + uint64_t streams_max_bit_rate; > }; > > struct DisplayChannel { > @@ -2616,6 +2617,16 @@ static void red_stop_stream(RedWorker *worker, Stream *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(&dcc->common.base, &stream_agent->destroy_item); > } > @@ -2874,10 +2885,13 @@ static uint64_t red_stream_get_initial_bit_rate(DisplayChannelClient *dcc, > mcc = red_client_get_main(dcc->common.base.client); > max_bit_rate = main_channel_client_get_bitrate_per_sec(mcc); > > + if (max_bit_rate > dcc->streams_max_bit_rate) { > + dcc->streams_max_bit_rate = max_bit_rate; > + } > > /* dividing the available bandwidth among the active streams, and saving > * (1-RED_STREAM_CHANNEL_CAPACITY) of it for other messages */ > - return (RED_STREAM_CHANNEL_CAPACITY * max_bit_rate * > + return (RED_STREAM_CHANNEL_CAPACITY * dcc->streams_max_bit_rate * > stream->width * stream->height) / dcc->common.worker->streams_size_total; > } > > -- > 1.8.1 > > _______________________________________________ > Spice-devel mailing list > Spice-devel@xxxxxxxxxxxxxxxxxxxxx > http://lists.freedesktop.org/mailman/listinfo/spice-devel _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/spice-devel