diff --git a/src/headset/remote_headset.cpp b/src/headset/remote_headset.cpp index 03fdc9bd6dfb651a14830e3322100e6387d867cc..ac7d972d91ff49d90ddde559d6d1f0fccf19835a 100644 --- a/src/headset/remote_headset.cpp +++ b/src/headset/remote_headset.cpp @@ -129,6 +129,8 @@ bool RemoteHeadset::on_interface() } } + ImGui::SliderInt("Input-Rate (Fps)", (int32_t*) &this->encoder_input_rate, 1, 90); + if (ImGui::SliderInt("Key-Rate (Kps)", (int32_t*)&this->encoder_key_rate, 90, 900)) { for (Encoder::Ptr encoder : this->encoders) @@ -174,10 +176,10 @@ bool RemoteHeadset::on_interface() return false; } - if (ImGui::SliderFloat("Send-Rate Limit (Mbps)", &this->send_bit_rate_limit, 1.0, 20.0)) + /*if (ImGui::SliderFloat("Send-Rate Limit (Mbps)", &this->send_bit_rate_limit, 1.0, 20.0)) { this->transport->set_max_bitrate_send(this->send_bit_rate_limit); - } + }*/ if (ImGui::SliderInt("Send-Queue Limit (KBytes)", (int32_t*)&this->send_queue_size_limit, 1, 1000)) { @@ -207,10 +209,18 @@ bool RemoteHeadset::on_update(lava::delta delta_time) } this->update_values(); - this->update_bitrates(delta_time); + this->update_bitrates(); this->update_stage(delta_time); this->frame_number++; + this->encoder_last_submit += delta_time; + this->encoder_enable_submit = false; + + if (this->encoder_last_submit > (1.0 / (float)this->encoder_input_rate)) + { + this->encoder_enable_submit = true; + this->encoder_last_submit = 0.0f; + } return true; } @@ -224,6 +234,11 @@ void RemoteHeadset::submit_frame(VkCommandBuffer command_buffer, VkImageLayout f return; } + if (!this->encoder_enable_submit) + { + return; + } + lava::renderer& renderer = this->get_application()->get_renderer(); lava::image::ptr framebuffer = this->framebuffers[frame_id]; @@ -357,7 +372,7 @@ bool RemoteHeadset::create_transport() this->on_transport_error(); }); - this->transport->set_max_bitrate_send(this->send_bit_rate_limit); + //this->transport->set_max_bitrate_send(this->send_bit_rate_limit); this->transport->set_max_send_queue_size(this->send_queue_size_limit * 1000); if (!this->transport->create(this->server_port)) @@ -463,7 +478,7 @@ void RemoteHeadset::update_values() this->controller_states = this->transport_controller_states; } -void RemoteHeadset::update_bitrates(lava::delta delta_time) +void RemoteHeadset::update_bitrates() { this->statistic_send_bitrate->add_sample(this->transport->get_bitrate_send()); this->statistic_receive_bitrate->add_sample(this->transport->get_bitrate_received()); diff --git a/src/headset/remote_headset.hpp b/src/headset/remote_headset.hpp index 7c4cd5190cf6d368a22007e0589c7c27bae14ca3..a3ee731d2a2e4e820cd08238d6d5544d2f184059 100644 --- a/src/headset/remote_headset.hpp +++ b/src/headset/remote_headset.hpp @@ -5,6 +5,7 @@ #include <vector> #include <array> #include <memory> +#include <chrono> #include "headset.hpp" #include "strategy/stereo_strategy.hpp" @@ -60,7 +61,7 @@ private: void destroy_encoders(); void update_values(); - void update_bitrates(lava::delta delta_time); + void update_bitrates(); void update_stage(lava::delta delta_time); void on_setup(const glm::u32vec2& resolution); @@ -109,13 +110,18 @@ private: lava::image::ptr framebuffer_array; std::vector<lava::image::ptr> framebuffers; + std::vector<Encoder::Ptr> encoders; uint32_t encoder_mode = ENCODER_MODE_CONSTANT_QUALITY; + uint32_t encoder_input_rate = 90; uint32_t encoder_key_rate = 120; uint32_t encoder_frame_rate = 90; uint32_t encoder_quality = 51; float encoder_bit_rate = 6.0; //NOTE: Bitrate in Mbit per seconds - float send_bit_rate_limit = 15.0; //NOTE: Bitrate in Mbit per seconds + float encoder_last_submit = 0.0f; + bool encoder_enable_submit = true; + + //float send_bit_rate_limit = 15.0; //NOTE: Bitrate in Mbit per seconds uint32_t send_queue_size_limit = 100; //NOTE: Size in KBytes Statistic::Ptr statistic_send_bitrate; diff --git a/src/stream/transport.cpp b/src/stream/transport.cpp index 45c76f3d71909538cfd66cffb98a12778803016b..48b84ca2caa10c8724a9ee4ca6232ef0802f3dc5 100644 --- a/src/stream/transport.cpp +++ b/src/stream/transport.cpp @@ -294,11 +294,11 @@ void Transport::set_on_transport_error(OnTransportError function) this->on_transport_error = std::move(function); } -void Transport::set_max_bitrate_send(double bitrate) +/*void Transport::set_max_bitrate_send(double bitrate) { std::unique_lock<std::mutex> lock(this->worker_mutex); this->max_bitrate_send = bitrate; -} +}*/ void Transport::set_max_send_queue_size(uint32_t size) { @@ -338,14 +338,14 @@ double Transport::get_bitrate_received() return value; } -double Transport::get_max_bitrate_send() +/*double Transport::get_max_bitrate_send() { std::unique_lock<std::mutex> lock(this->worker_mutex); double value = this->max_bitrate_send; lock.unlock(); return value; -} +}*/ uint32_t Transport::get_max_send_queue_size() { @@ -607,10 +607,10 @@ void Transport::process_send_queue() this->send_queue.erase(this->send_queue.begin()); this->datagram_pool.release_datagram(datagram); - if (this->bits_send < (this->max_bitrate_send * (TRANSPORT_STATE_CHECK_INTERVAL / 1000.0)) * (1000.0 * 1000.0)) - { + //if (this->bits_send < (this->max_bitrate_send * (TRANSPORT_STATE_CHECK_INTERVAL / 1000.0)) * (1000.0 * 1000.0)) + //{ this->process_send_queue(); - } + //} lock.unlock(); }); diff --git a/src/stream/transport.hpp b/src/stream/transport.hpp index 511de8b3d7cbf94fbdcab1202bde5bea7c6f397d..1fd57a1994c1073cd6f1997007cca95ed0a5bde4 100644 --- a/src/stream/transport.hpp +++ b/src/stream/transport.hpp @@ -62,7 +62,7 @@ public: void set_on_transport_error(OnTransportError function); //NOTE: The following functions should be thread safe - void set_max_bitrate_send(double bitrate); //NOTE: The bitrate is given in MBits/s + //void set_max_bitrate_send(double bitrate); //NOTE: The bitrate is given in MBits/s void set_max_send_queue_size(uint32_t size); //NOTE: The size is given in Bytes //NOTE: The following function should be thread safe @@ -70,7 +70,7 @@ public: TransportState get_state(); double get_bitrate_send(); //NOTE: The bitrate is given in MBits/s double get_bitrate_received(); //NOTE: The bitrate is given in MBits/s - double get_max_bitrate_send(); //NOTE: The bitrate is given in MBits/s + //double get_max_bitrate_send(); //NOTE: The bitrate is given in MBits/s uint32_t get_max_send_queue_size(); //NOTE: The size is given in Bytes uint32_t get_send_queue_size(); //NOTE: In Bytes @@ -117,7 +117,7 @@ private: uint32_t bits_received = 0; //NOTE: Owned by worker_thread double bitrate_send = 0.0; //NOTE: Protected by worker_mutex double bitrate_received = 0.0; //NOTE: Protected by worker_mutex - double max_bitrate_send = 1.0; //NOTE: Protected by worker_mutex + //double max_bitrate_send = 1.0; //NOTE: Protected by worker_mutex uint32_t max_send_queue_size = DATAGRAM_SIZE * 128; //NOTE: Protected by worker_mutex bool send_active = false; //NOTE: Protected by worker_mutex double inactive_time = 0.0; //NOTE: Owned by worker_thread