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. --- 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