diff --git a/src/transport/webrtc_transport.cpp b/src/transport/webrtc_transport.cpp index 8d275eceb4ee437c8a59084053cf46ff555a99f0..39a538ad23e2dc22006a59764c43767b92a46eb1 100644 --- a/src/transport/webrtc_transport.cpp +++ b/src/transport/webrtc_transport.cpp @@ -21,8 +21,12 @@ rtc::Configuration* config; std::ofstream logFile; rtc::binary* msg_frame_buffer; unsigned long long maxMessageSize = 64000; //262144; //65536; -std::map<TransformId, unsigned long long> left_frame_start_times, right_frame_start_times; -std::map<TransformId, unsigned long long> left_frame_generation_times, right_frame_generation_times; + +TransformId transformsCount = 0; +unsigned long long frameStarts[30000]; +TransformId transformMaps[30000]; +int LeftFrameGenerationTimes[30000]; +int RightFrameGenerationTimes[30000]; bool WebRTCTransport::create(uint32_t port_number) { this->last_update_time = std::chrono::high_resolution_clock::now(); @@ -265,45 +269,45 @@ shared_ptr<rtc::PeerConnection> createPeerConnection(weak_ptr<rtc::WebSocket> ww TransformId transform_id = (std::to_integer<long long>(msg[1]) | std::to_integer<long long>(msg[2]) << 8 | std::to_integer<long long>(msg[3]) << 16 | std::to_integer<long long>(msg[4]) << 24 | std::to_integer<long long>(msg[5]) << 32 | std::to_integer<long long>(msg[6]) << 40 | std::to_integer<long long>(msg[7]) << 48 | std::to_integer<long long>(msg[8]) << 56); float htr[16]; //memcpy(&htr, &msg[9], 64); + + //texting only: auto time = std::chrono::system_clock::now(); // get the current time auto since_epoch = time.time_since_epoch(); // get the duration since epoch auto millis = std::chrono::duration_cast<std::chrono::milliseconds>(since_epoch); auto now = millis.count(); // just like java (new Date()).getTime(); - left_frame_start_times.insert(std::pair<TransformId, unsigned long long>(transform_id, now)); - right_frame_start_times.insert(std::pair<TransformId, unsigned long long>(transform_id, now)); - int r = now % 1000; - float angle = r / 1000.0 * 2 * 3.141592; - float sine = std::sin(angle); - float cosine = std::cos(angle); + frameStarts[transformsCount] = now; + transformMaps[transformsCount] = transform_id; + //int r = now % 1000; + //float angle = r / 1000.0 * 2 * 3.141592; + //float sine = std::sin(angle); + //float cosine = std::cos(angle); //htr[0] = cosine; //htr[10] = cosine; //htr[2] = sine; //htr[8] = -sine; - tr->parse_head_transform(transform_id, htr); + + tr->parse_head_transform(transformsCount, htr); + transformsCount++; } break; case 'g': //logging message if (tr->get_state() == TRANSPORT_STATE_CONNECTED) { - float val_1, val_2, val_3, val_4, val_5; + float val_1, val_2, val_3, val_4, val_5, val_6; memcpy(&val_1, &msg[1], 4); + memcpy(&val_6, &msg[13], 4); memcpy(&val_2, &msg[5], 4); memcpy(&val_3, &msg[9], 4); - memcpy(&val_4, &msg[13], 4); - memcpy(&val_5, &msg[17], 4); - unsigned long long generation_time = 300; + memcpy(&val_4, &msg[17], 4); + memcpy(&val_5, &msg[21], 4); + int generation_time = -1; if ((int)val_1 % 2 == 0) { - if(left_frame_start_times.contains((TransformId)val_4) && left_frame_generation_times.contains((TransformId)val_4)) { - generation_time = left_frame_generation_times[(TransformId)val_4] - left_frame_start_times[(TransformId)val_4]; - } + generation_time = LeftFrameGenerationTimes[(FrameNumber) val_6]; } else { - if(right_frame_start_times.contains((TransformId)val_4) && right_frame_generation_times.contains((TransformId)val_4)) { - generation_time = right_frame_generation_times[(TransformId)val_4] - right_frame_start_times[(TransformId)val_4]; - } + generation_time = RightFrameGenerationTimes[(FrameNumber) val_6]; } - //frame id, Generation time, RTT no decoding, RTT with decoding, packets sent, packets received bytes sent, + //frame id, transform_id, Generation time, RTT no decoding, RTT with decoding, packets sent, packets received bytes sent, logFile << std::to_string(val_1) + "; " + std::to_string(val_4) + "; " + std::to_string(generation_time) + "; " + std::to_string(val_3 - val_4) + "; " + std::to_string(val_2 - val_4) + "; " + std::to_string(tr->packets_send) + "; " + std::to_string(val_5) + "; " + std::to_string(tr->bytes_send_total) + "; \n"; //logFile << std::to_string(val_1) + "; " + std::to_string(val_2) + "; " + std::to_string(val_3) + "; " + std::to_string(val_4) + "; \n"; - tr->latency_counter += generation_time; tr->frame_counter++; } break; @@ -413,26 +417,13 @@ bool WebRTCTransport::send_frame_nal(FrameNumber frame_number, FrameId frame_id, auto since_epoch = time.time_since_epoch(); // get the duration since epoch auto millis = std::chrono::duration_cast<std::chrono::milliseconds>(since_epoch); auto now = millis.count(); // just like java (new Date()).getTime(); + + TransformId realTransformId = transformMaps[transform_id]; + if (frame_id == 0) { - std::erase_if(left_frame_start_times, [transform_id](const auto& item) { - auto const& [key, value] = item; - return key < transform_id - 300; - }); - std::erase_if(left_frame_generation_times, [transform_id](const auto& item) { - auto const& [key, value] = item; - return key < transform_id - 300; - }); - left_frame_generation_times.insert(std::pair<TransformId, unsigned long long>(transform_id, now)); + LeftFrameGenerationTimes[frame_number] = now - frameStarts[transform_id]; } else { - std::erase_if(right_frame_start_times, [transform_id](const auto& item) { - auto const& [key, value] = item; - return key < transform_id - 300; - }); - std::erase_if(right_frame_generation_times, [transform_id](const auto& item) { - auto const& [key, value] = item; - return key < transform_id - 300; - }); - right_frame_generation_times.insert(std::pair<TransformId, unsigned long long>(transform_id, now)); + RightFrameGenerationTimes[frame_number] = now - frameStarts[transform_id]; } if (msg_frame_buffer == nullptr) { @@ -448,10 +439,10 @@ bool WebRTCTransport::send_frame_nal(FrameNumber frame_number, FrameId frame_id, } else { (*msg_frame_buffer)[1] = std::byte('r'); } - (*msg_frame_buffer)[2] = std::byte(transform_id & 0x000000ff); - (*msg_frame_buffer)[3] = std::byte((transform_id & 0x0000ff00) >> 8); - (*msg_frame_buffer)[4] = std::byte((transform_id & 0x00ff0000) >> 16); - (*msg_frame_buffer)[5] = std::byte((transform_id & 0xff000000) >> 24); + (*msg_frame_buffer)[2] = std::byte(realTransformId & 0x000000ff); + (*msg_frame_buffer)[3] = std::byte((realTransformId & 0x0000ff00) >> 8); + (*msg_frame_buffer)[4] = std::byte((realTransformId & 0x00ff0000) >> 16); + (*msg_frame_buffer)[5] = std::byte((realTransformId & 0xff000000) >> 24); //time at start transmission //auto time = std::chrono::system_clock::now(); @@ -681,12 +672,6 @@ void WebRTCTransport::process_send_queue() { this->bitrate_receive = ((double) this->bits_received / (double) delta_time) / 1000.0; this->bits_send = 0; this->bits_received = 0; - if ((latency_counter / (double) frame_counter) > GOAL_LATENCY) { - - } else { - - } - this->latency_counter = 0; this->frame_counter = 0; this->last_update_time = cur_time; } diff --git a/src/transport/webrtc_transport.hpp b/src/transport/webrtc_transport.hpp index ec0b3ac8c947db46052617a2d083dbba355b0a13..d04429fa245246eacf058be411cf09c7e27cce94 100644 --- a/src/transport/webrtc_transport.hpp +++ b/src/transport/webrtc_transport.hpp @@ -24,7 +24,7 @@ #include <unordered_map> -#define WEBRTC_TRANSPORT_STATE_CHECK_INTERVAL 200 //NOTE: In milliseconds +#define WEBRTC_TRANSPORT_STATE_CHECK_INTERVAL 20 //NOTE: In milliseconds #define TRANSPORT_CLIENT_CONNECT_TIMEOUT 60 //NOTE: In seconds #define WEBRTC_TRANSPORT_CLIENT_TIMEOUT 20 //NOTE: In seconds #define GOAL_LATENCY 50 @@ -93,7 +93,6 @@ public: uint32_t bits_received = 0; //NOTE: Owned by worker_thread double bytes_send_total = 0.0; double packets_send = 0.0; - double latency_counter = 0.0; uint32_t frame_counter = 0; private: