[Spice-devel] [PATCH spice-server] red_worker: don't get bit_rate from main_channel_client, if it wasn't initialized

Yonit Halperin yhalperi at redhat.com
Wed May 8 10:27:04 PDT 2013


When setting an initial video stream bit rate, if the bit rate
wasn't calculated by main_channel_client, and we don't have
estimation from previos streams, use some default values.
---
 server/red_worker.c | 42 ++++++++++++++++++++++++++++++------------
 1 file changed, 30 insertions(+), 12 deletions(-)

diff --git a/server/red_worker.c b/server/red_worker.c
index f12d8f8..fb736b5 100644
--- a/server/red_worker.c
+++ b/server/red_worker.c
@@ -121,6 +121,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
@@ -2929,11 +2931,9 @@ static inline Stream *red_alloc_stream(RedWorker *worker)
 static uint64_t red_stream_get_initial_bit_rate(DisplayChannelClient *dcc,
                                                 Stream *stream)
 {
-    MainChannelClient *mcc;
     char *env_bit_rate_str;
     uint64_t bit_rate = 0;
 
-    mcc = red_client_get_main(dcc->common.base.client);
     env_bit_rate_str = getenv("SPICE_BIT_RATE");
     if (env_bit_rate_str != NULL) {
         double env_bit_rate;
@@ -2948,16 +2948,28 @@ static uint64_t red_stream_get_initial_bit_rate(DisplayChannelClient *dcc,
     }
 
     if (!bit_rate) {
-        bit_rate = main_channel_client_get_bitrate_per_sec(mcc);
-
-        if (bit_rate > dcc->streams_max_bit_rate) {
-            dcc->streams_max_bit_rate = bit_rate;
-        } else {
-            bit_rate = dcc->streams_max_bit_rate;
-        }
-    }
-
-    spice_debug("base-bit-rate %.2f (Mbps)", bit_rate / 1024.0 /1024.0);
+        MainChannelClient *mcc;
+        uint64_t net_test_bit_rate;
+
+        mcc = red_client_get_main(dcc->common.base.client);
+        net_test_bit_rate = main_channel_client_is_network_info_initialized(mcc) ?
+                                main_channel_client_get_bitrate_per_sec(mcc) :
+                                0;
+        bit_rate = MAX(dcc->streams_max_bit_rate, net_test_bit_rate);
+        if (bit_rate == 0) {
+            /*
+             * In case we are after a spice session migration,
+             * the low_bandwidth flag is retrieved from migration data.
+             * If the network info is not initialized due to another reason,
+             * the low_bandwidth flag is FALSE.
+             */
+            bit_rate = dcc->common.is_low_bandwidth ?
+                RED_STREAM_DEFAULT_LOW_START_BIT_RATE :
+                RED_STREAM_DEFAULT_HIGH_START_BIT_RATE;
+        }
+    }
+
+    spice_debug("base-bit-rate %.2f (Mbps)", bit_rate / 1024.0 / 1024.0);
     /* 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 * bit_rate *
@@ -2973,6 +2985,12 @@ static uint32_t red_stream_mjpeg_encoder_get_roundtrip(void *opaque)
     roundtrip = red_channel_client_get_roundtrip_ms(&agent->dcc->common.base);
     if (roundtrip < 0) {
         MainChannelClient *mcc = red_client_get_main(agent->dcc->common.base.client);
+
+        /*
+         * the main channel client roundtrip might not have been
+         * calculated (e.g., after migration). In such case,
+         * main_channel_client_get_roundtrip_ms returns 0.
+         */
         roundtrip = main_channel_client_get_roundtrip_ms(mcc);
     }
 
-- 
1.8.1.4



More information about the Spice-devel mailing list