diff --git a/config/config.ini b/config/config.ini index 79ad05f..0dd66bc 100644 --- a/config/config.ini +++ b/config/config.ini @@ -1,16 +1,19 @@ [signal server] -ip = 120.77.216.215 +ip = 150.158.81.30 port = 9099 [stun server] -ip = 120.77.216.215 +ip = 150.158.81.30 port = 3478 [turn server] -ip = 120.77.216.215 +ip = 150.158.81.30 port = 3478 username = dijunkun password = dijunkunpw [hardware acceleration] +turn_on = false + +[av1 encoding] turn_on = true \ No newline at end of file diff --git a/src/gui/main.cpp b/src/gui/main.cpp index 482c6cb..af7dfac 100644 --- a/src/gui/main.cpp +++ b/src/gui/main.cpp @@ -440,268 +440,336 @@ int initResampler() { fprintf(stderr, "Could not allocate destination samples\n"); return -1; } + + return 0; } -int main() { +int main(int argc, char *argv[]) { LOG_INFO("Remote desk"); - last_ts = static_cast( - std::chrono::duration_cast( - std::chrono::high_resolution_clock::now().time_since_epoch()) - .count()); + last_ts = static_cast( + std::chrono::duration_cast( + std::chrono::high_resolution_clock::now().time_since_epoch()) + .count()); - initResampler(); + initResampler(); - cd_cache_file = fopen("cache.cd", "r+"); - if (cd_cache_file) { - fseek(cd_cache_file, 0, SEEK_SET); - fread(&cd_cache.password, sizeof(cd_cache.password), 1, cd_cache_file); - fclose(cd_cache_file); - strncpy(input_password, cd_cache.password, sizeof(cd_cache.password)); - } - - // Setup SDL - if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER | - SDL_INIT_GAMECONTROLLER) != 0) { - printf("Error: %s\n", SDL_GetError()); - return -1; - } - - // From 2.0.18: Enable native IME. -#ifdef SDL_HINT_IME_SHOW_UI - SDL_SetHint(SDL_HINT_IME_SHOW_UI, "1"); -#endif - - // Create window with SDL_Renderer graphics context - SDL_WindowFlags window_flags = - (SDL_WindowFlags)(SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI); - window = SDL_CreateWindow("Remote Desk", SDL_WINDOWPOS_CENTERED, - SDL_WINDOWPOS_CENTERED, window_w, window_h, - window_flags); - - SDL_DisplayMode DM; - SDL_GetCurrentDisplayMode(0, &DM); - screen_w = DM.w; - screen_h = DM.h; - - sdlRenderer = SDL_CreateRenderer( - window, -1, SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_ACCELERATED); - if (sdlRenderer == nullptr) { - SDL_Log("Error creating SDL_Renderer!"); - return 0; - } - - Uint32 pixformat = 0; - pixformat = SDL_PIXELFORMAT_NV12; - - sdlTexture = SDL_CreateTexture(sdlRenderer, pixformat, - SDL_TEXTUREACCESS_STREAMING, pixel_w, pixel_h); - - // Audio - SDL_AudioSpec want_in, have_in, want_out, have_out; - SDL_zero(want_in); - want_in.freq = 48000; - want_in.format = AUDIO_S16LSB; - want_in.channels = 1; - want_in.samples = 480; - want_in.callback = SdlCaptureAudioIn; - - input_dev = SDL_OpenAudioDevice(NULL, 1, &want_in, &have_in, 0); - if (input_dev == 0) { - SDL_Log("Failed to open input: %s", SDL_GetError()); - return 1; - } - - SDL_zero(want_out); - want_out.freq = 48000; - want_out.format = AUDIO_S16LSB; - want_out.channels = 1; - // want_out.silence = 0; - want_out.samples = 480; - want_out.callback = NULL; - - output_dev = SDL_OpenAudioDevice(NULL, 0, &want_out, &have_out, 0); - if (output_dev == 0) { - SDL_Log("Failed to open input: %s", SDL_GetError()); - return 1; - } - - SDL_PauseAudioDevice(input_dev, 0); - SDL_PauseAudioDevice(output_dev, 0); - - // Setup Dear ImGui context - IMGUI_CHECKVERSION(); - ImGui::CreateContext(); - ImGuiIO &io = ImGui::GetIO(); - - io.ConfigFlags |= - ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls - io.ConfigFlags |= - ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls - - // Setup Dear ImGui style - ImGui::StyleColorsDark(); - // ImGui::StyleColorsLight(); - - // Setup Platform/Renderer backends - ImGui_ImplSDL2_InitForSDLRenderer(window, sdlRenderer); - ImGui_ImplSDLRenderer2_Init(sdlRenderer); - - // Our state - bool show_demo_window = true; - bool show_another_window = false; - ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f); - - std::string mac_addr_str = GetMac(); - - std::thread rtc_thread( - [](int screen_width, int screen_height) { - std::string default_cfg_path = "../../../../config/config.ini"; - std::ifstream f(default_cfg_path.c_str()); - - std::string mac_addr_str = GetMac(); - - Params server_params; - server_params.cfg_path = - f.good() ? "../../../../config/config.ini" : "config.ini"; - server_params.on_receive_video_buffer = ServerReceiveVideoBuffer; - server_params.on_receive_audio_buffer = ServerReceiveAudioBuffer; - server_params.on_receive_data_buffer = ServerReceiveDataBuffer; - server_params.on_signal_status = ServerSignalStatus; - server_params.on_connection_status = ServerConnectionStatus; - - Params client_params; - client_params.cfg_path = - f.good() ? "../../../../config/config.ini" : "config.ini"; - client_params.on_receive_video_buffer = ClientReceiveVideoBuffer; - client_params.on_receive_audio_buffer = ClientReceiveAudioBuffer; - client_params.on_receive_data_buffer = ClientReceiveDataBuffer; - client_params.on_signal_status = ClientSignalStatus; - client_params.on_connection_status = ClientConnectionStatus; - - std::string transmission_id = "000001"; - - peer_server = CreatePeer(&server_params); - LOG_INFO("Create peer_server"); - std::string server_user_id = "S-" + mac_addr_str; - Init(peer_server, server_user_id.c_str()); - LOG_INFO("peer_server init finish"); - - peer_client = CreatePeer(&client_params); - LOG_INFO("Create peer_client"); - std::string client_user_id = "C-" + mac_addr_str; - Init(peer_client, client_user_id.c_str()); - LOG_INFO("peer_client init finish"); - - { - while (SignalStatus::SignalConnected != server_signal_status && - !done) { - std::this_thread::sleep_for(std::chrono::seconds(1)); - } - - if (done) { - return; - } - - std::string user_id = "S-" + mac_addr_str; - is_create_connection = - CreateConnection(peer_server, mac_addr_str.c_str(), - input_password) - ? false - : true; - - nv12_buffer = new char[NV12_BUFFER_SIZE]; - - // Screen capture - screen_capturer_factory = new ScreenCapturerFactory(); - screen_capturer = (ScreenCapturer *)screen_capturer_factory->Create(); - - last_frame_time_ = std::chrono::high_resolution_clock::now(); - ScreenCapturer::RECORD_DESKTOP_RECT rect; - rect.left = 0; - rect.top = 0; - rect.right = screen_w; - rect.bottom = screen_h; - - screen_capturer->Init( - rect, 60, - [](unsigned char *data, int size, int width, int height) -> void { - auto now_time = std::chrono::high_resolution_clock::now(); - std::chrono::duration duration = - now_time - last_frame_time_; - auto tc = duration.count() * 1000; - - if (tc >= 0) { - SendData(peer_server, DATA_TYPE::VIDEO, (const char *)data, - NV12_BUFFER_SIZE); - last_frame_time_ = now_time; - } - }); - - screen_capturer->Start(); - - // Mouse control - device_controller_factory = new DeviceControllerFactory(); - mouse_controller = - (MouseController *)device_controller_factory->Create( - DeviceControllerFactory::Device::Mouse); - mouse_controller->Init(screen_w, screen_h); - } - }, - screen_w, screen_h); - - // Main loop - while (!done) { - // Start the Dear ImGui frame - ImGui_ImplSDLRenderer2_NewFrame(); - ImGui_ImplSDL2_NewFrame(); - ImGui::NewFrame(); - - if (joined && !menu_hovered) { - ImGui::SetMouseCursor(ImGuiMouseCursor_None); + cd_cache_file = fopen("cache.cd", "r+"); + if (cd_cache_file) { + fseek(cd_cache_file, 0, SEEK_SET); + fread(&cd_cache.password, sizeof(cd_cache.password), 1, cd_cache_file); + fclose(cd_cache_file); + strncpy(input_password, cd_cache.password, sizeof(cd_cache.password)); } - { - static float f = 0.0f; - static int counter = 0; + // Setup SDL + if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER | + SDL_INIT_GAMECONTROLLER) != 0) { + printf("Error: %s\n", SDL_GetError()); + return -1; + } - const ImGuiViewport *main_viewport = ImGui::GetMainViewport(); - ImGui::SetNextWindowPos(ImVec2(0, 0), ImGuiCond_Once); - ImGui::SetNextWindowSize(ImVec2(190, 200)); + // From 2.0.18: Enable native IME. + #ifdef SDL_HINT_IME_SHOW_UI + SDL_SetHint(SDL_HINT_IME_SHOW_UI, "1"); + #endif - ImGui::Begin("Menu", nullptr, ImGuiWindowFlags_NoResize); + // Create window with SDL_Renderer graphics context + SDL_WindowFlags window_flags = + (SDL_WindowFlags)(SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI); + window = SDL_CreateWindow("Remote Desk", SDL_WINDOWPOS_CENTERED, + SDL_WINDOWPOS_CENTERED, window_w, window_h, + window_flags); + + SDL_DisplayMode DM; + SDL_GetCurrentDisplayMode(0, &DM); + screen_w = DM.w; + screen_h = DM.h; + + sdlRenderer = SDL_CreateRenderer( + window, -1, SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_ACCELERATED); + if (sdlRenderer == nullptr) { + SDL_Log("Error creating SDL_Renderer!"); + return 0; + } + + Uint32 pixformat = 0; + pixformat = SDL_PIXELFORMAT_NV12; + + sdlTexture = SDL_CreateTexture(sdlRenderer, pixformat, + SDL_TEXTUREACCESS_STREAMING, pixel_w, + pixel_h); + + // Audio + SDL_AudioSpec want_in, have_in, want_out, have_out; + SDL_zero(want_in); + want_in.freq = 48000; + want_in.format = AUDIO_S16LSB; + want_in.channels = 1; + want_in.samples = 480; + want_in.callback = SdlCaptureAudioIn; + + input_dev = SDL_OpenAudioDevice(NULL, 1, &want_in, &have_in, 0); + if (input_dev == 0) { + SDL_Log("Failed to open input: %s", SDL_GetError()); + // return 1; + } + + SDL_zero(want_out); + want_out.freq = 48000; + want_out.format = AUDIO_S16LSB; + want_out.channels = 1; + // want_out.silence = 0; + want_out.samples = 480; + want_out.callback = NULL; + + output_dev = SDL_OpenAudioDevice(NULL, 0, &want_out, &have_out, 0); + if (output_dev == 0) { + SDL_Log("Failed to open input: %s", SDL_GetError()); + // return 1; + } + + SDL_PauseAudioDevice(input_dev, 0); + SDL_PauseAudioDevice(output_dev, 0); + + // Setup Dear ImGui context + IMGUI_CHECKVERSION(); + ImGui::CreateContext(); + ImGuiIO &io = ImGui::GetIO(); + + io.ConfigFlags |= + ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls + io.ConfigFlags |= + ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls + + // Setup Dear ImGui style + ImGui::StyleColorsDark(); + // ImGui::StyleColorsLight(); + + // Setup Platform/Renderer backends + ImGui_ImplSDL2_InitForSDLRenderer(window, sdlRenderer); + ImGui_ImplSDLRenderer2_Init(sdlRenderer); + + // Our state + bool show_demo_window = true; + bool show_another_window = false; + ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f); + + std::string mac_addr_str = GetMac(); + + std::thread rtc_thread( + [](int screen_width, int screen_height) { + std::string default_cfg_path = "../../../../config/config.ini"; + std::ifstream f(default_cfg_path.c_str()); + + std::string mac_addr_str = GetMac(); + + Params server_params; + server_params.cfg_path = + f.good() ? "../../../../config/config.ini" : "config.ini"; + server_params.on_receive_video_buffer = ServerReceiveVideoBuffer; + server_params.on_receive_audio_buffer = ServerReceiveAudioBuffer; + server_params.on_receive_data_buffer = ServerReceiveDataBuffer; + server_params.on_signal_status = ServerSignalStatus; + server_params.on_connection_status = ServerConnectionStatus; + + Params client_params; + client_params.cfg_path = + f.good() ? "../../../../config/config.ini" : "config.ini"; + client_params.on_receive_video_buffer = ClientReceiveVideoBuffer; + client_params.on_receive_audio_buffer = ClientReceiveAudioBuffer; + client_params.on_receive_data_buffer = ClientReceiveDataBuffer; + client_params.on_signal_status = ClientSignalStatus; + client_params.on_connection_status = ClientConnectionStatus; + + std::string transmission_id = "000001"; + + peer_server = CreatePeer(&server_params); + LOG_INFO("Create peer_server"); + std::string server_user_id = "S-" + mac_addr_str; + Init(peer_server, server_user_id.c_str()); + LOG_INFO("peer_server init finish"); + + peer_client = CreatePeer(&client_params); + LOG_INFO("Create peer_client"); + std::string client_user_id = "C-" + mac_addr_str; + Init(peer_client, client_user_id.c_str()); + LOG_INFO("peer_client init finish"); + + { + while (SignalStatus::SignalConnected != server_signal_status && + !done) { + std::this_thread::sleep_for(std::chrono::seconds(1)); + } + + if (done) { + return; + } + + std::string user_id = "S-" + mac_addr_str; + is_create_connection = + CreateConnection(peer_server, mac_addr_str.c_str(), + input_password) + ? false + : true; + + nv12_buffer = new char[NV12_BUFFER_SIZE]; + + // Screen capture + screen_capturer_factory = new ScreenCapturerFactory(); + screen_capturer = (ScreenCapturer + *)screen_capturer_factory->Create(); + + last_frame_time_ = std::chrono::high_resolution_clock::now(); + ScreenCapturer::RECORD_DESKTOP_RECT rect; + rect.left = 0; + rect.top = 0; + rect.right = screen_w; + rect.bottom = screen_h; + + screen_capturer->Init( + rect, 60, + [](unsigned char *data, int size, int width, int height) -> + void { + auto now_time = std::chrono::high_resolution_clock::now(); + std::chrono::duration duration = + now_time - last_frame_time_; + auto tc = duration.count() * 1000; + + if (tc >= 0) { + SendData(peer_server, DATA_TYPE::VIDEO, (const char + *)data, + NV12_BUFFER_SIZE); + last_frame_time_ = now_time; + } + }); + + screen_capturer->Start(); + + // Mouse control + device_controller_factory = new DeviceControllerFactory(); + mouse_controller = + (MouseController *)device_controller_factory->Create( + DeviceControllerFactory::Device::Mouse); + mouse_controller->Init(screen_w, screen_h); + } + }, + screen_w, screen_h); + + // Main loop + while (!done) { + // Start the Dear ImGui frame + ImGui_ImplSDLRenderer2_NewFrame(); + ImGui_ImplSDL2_NewFrame(); + ImGui::NewFrame(); + + if (joined && !menu_hovered) { + ImGui::SetMouseCursor(ImGuiMouseCursor_None); + } { - menu_hovered = ImGui::IsWindowHovered(); - ImGui::Text(" LOCAL ID:"); - ImGui::SameLine(); - ImGui::SetNextItemWidth(95); - ImGui::InputText( - "##local_id", (char *)mac_addr_str.c_str(), - mac_addr_str.length() + 1, - ImGuiInputTextFlags_CharsUppercase | ImGuiInputTextFlags_ReadOnly); + static float f = 0.0f; + static int counter = 0; - ImGui::Text(" PASSWORD:"); - ImGui::SameLine(); - ImGui::SetNextItemWidth(95); + const ImGuiViewport *main_viewport = ImGui::GetMainViewport(); + ImGui::SetNextWindowPos(ImVec2(0, 0), ImGuiCond_Once); + ImGui::SetNextWindowSize(ImVec2(190, 200)); - char input_password_tmp[7] = ""; - strncpy(input_password_tmp, input_password, sizeof(input_password)); + ImGui::Begin("Menu", nullptr, ImGuiWindowFlags_NoResize); - ImGui::InputTextWithHint("##server_pwd", "max 6 chars", input_password, - IM_ARRAYSIZE(input_password), - ImGuiInputTextFlags_CharsNoBlank); - if (strcmp(input_password_tmp, input_password)) { - cd_cache_file = fopen("cache.cd", "w+"); - if (cd_cache_file) { - fseek(cd_cache_file, 0, SEEK_SET); - strncpy(cd_cache.password, input_password, sizeof(input_password)); - fwrite(&cd_cache.password, sizeof(cd_cache.password), 1, - cd_cache_file); - fclose(cd_cache_file); + { + menu_hovered = ImGui::IsWindowHovered(); + ImGui::Text(" LOCAL ID:"); + ImGui::SameLine(); + ImGui::SetNextItemWidth(95); + ImGui::InputText( + "##local_id", (char *)mac_addr_str.c_str(), + mac_addr_str.length() + 1, + ImGuiInputTextFlags_CharsUppercase | + ImGuiInputTextFlags_ReadOnly); + + ImGui::Text(" PASSWORD:"); + ImGui::SameLine(); + ImGui::SetNextItemWidth(95); + + char input_password_tmp[7] = ""; + strncpy(input_password_tmp, input_password, + sizeof(input_password)); + + ImGui::InputTextWithHint("##server_pwd", "max 6 chars", + input_password, + IM_ARRAYSIZE(input_password), + ImGuiInputTextFlags_CharsNoBlank); + if (strcmp(input_password_tmp, input_password)) { + cd_cache_file = fopen("cache.cd", "w+"); + if (cd_cache_file) { + fseek(cd_cache_file, 0, SEEK_SET); + strncpy(cd_cache.password, input_password, + sizeof(input_password)); fwrite(&cd_cache.password, + sizeof(cd_cache.password), 1, + cd_cache_file); + fclose(cd_cache_file); + } + LeaveConnection(peer_server); + CreateConnection(peer_server, mac_addr_str.c_str(), + input_password); + } + + ImGui::Spacing(); + + ImGui::Separator(); + + ImGui::Spacing(); + { + { + static char remote_id[20] = ""; + ImGui::Text("REMOTE ID:"); + ImGui::SameLine(); + ImGui::SetNextItemWidth(95); + ImGui::InputTextWithHint("##remote_id", mac_addr_str.c_str(), + remote_id, IM_ARRAYSIZE(remote_id), + ImGuiInputTextFlags_CharsUppercase | + ImGuiInputTextFlags_CharsNoBlank); + + ImGui::Spacing(); + + ImGui::Text(" PASSWORD:"); + ImGui::SameLine(); + ImGui::SetNextItemWidth(95); + static char client_password[20] = ""; + ImGui::InputTextWithHint("##client_pwd", "max 6 chars", + client_password, + IM_ARRAYSIZE(client_password), + ImGuiInputTextFlags_CharsNoBlank); + + if (ImGui::Button(connect_label)) { + int ret = -1; + if ("ClientSignalConnected" == client_signal_status_str) { + if (strcmp(connect_label, "Connect") == 0 && !joined) { + std::string user_id = "C-" + mac_addr_str; + ret = JoinConnection(peer_client, remote_id, + client_password); if (0 == ret) { + // joined = true; + } + } else if (strcmp(connect_label, "Disconnect") == 0 && + joined) { + ret = LeaveConnection(peer_client); + memset(audio_buffer, 0, 960); + if (0 == ret) { + joined = false; + received_frame = false; + } + } + + if (0 == ret) { + connect_button_pressed = !connect_button_pressed; + connect_label = + connect_button_pressed ? "Disconnect" : "Connect"; + } + } + } + } } - LeaveConnection(peer_server); - CreateConnection(peer_server, mac_addr_str.c_str(), input_password); } ImGui::Spacing(); @@ -709,164 +777,108 @@ int main() { ImGui::Separator(); ImGui::Spacing(); + { - { - static char remote_id[20] = ""; - ImGui::Text("REMOTE ID:"); - ImGui::SameLine(); - ImGui::SetNextItemWidth(95); - ImGui::InputTextWithHint("##remote_id", mac_addr_str.c_str(), - remote_id, IM_ARRAYSIZE(remote_id), - ImGuiInputTextFlags_CharsUppercase | - ImGuiInputTextFlags_CharsNoBlank); + if (ImGui::Button("Resize Window")) { + SDL_GetWindowSize(window, &window_w, &window_h); - ImGui::Spacing(); - - ImGui::Text(" PASSWORD:"); - ImGui::SameLine(); - ImGui::SetNextItemWidth(95); - static char client_password[20] = ""; - ImGui::InputTextWithHint("##client_pwd", "max 6 chars", - client_password, - IM_ARRAYSIZE(client_password), - ImGuiInputTextFlags_CharsNoBlank); - - if (ImGui::Button(connect_label)) { - int ret = -1; - if ("ClientSignalConnected" == client_signal_status_str) { - if (strcmp(connect_label, "Connect") == 0 && !joined) { - std::string user_id = "C-" + mac_addr_str; - ret = JoinConnection(peer_client, remote_id, client_password); - if (0 == ret) { - // joined = true; - } - } else if (strcmp(connect_label, "Disconnect") == 0 && joined) { - ret = LeaveConnection(peer_client); - memset(audio_buffer, 0, 960); - if (0 == ret) { - joined = false; - received_frame = false; - } - } - - if (0 == ret) { - connect_button_pressed = !connect_button_pressed; - connect_label = - connect_button_pressed ? "Disconnect" : "Connect"; - } - } + if (window_h != window_w * 9 / 16) { + window_w = window_h * 16 / 9; } + + SDL_SetWindowSize(window, window_w, window_h); } } + + ImGui::End(); } - ImGui::Spacing(); + // Rendering + ImGui::Render(); + SDL_RenderSetScale(sdlRenderer, io.DisplayFramebufferScale.x, + io.DisplayFramebufferScale.y); - ImGui::Separator(); - - ImGui::Spacing(); - - { - if (ImGui::Button("Resize Window")) { + SDL_Event event; + while (SDL_PollEvent(&event)) { + ImGui_ImplSDL2_ProcessEvent(&event); + if (event.type == SDL_QUIT) { + done = true; + } else if (event.type == SDL_WINDOWEVENT && + event.window.event == SDL_WINDOWEVENT_RESIZED) { SDL_GetWindowSize(window, &window_w, &window_h); + } else if (event.type == SDL_WINDOWEVENT && + event.window.event == SDL_WINDOWEVENT_CLOSE && + event.window.windowID == SDL_GetWindowID(window)) { + done = true; + } else if (event.type == REFRESH_EVENT) { + sdlRect.x = 0; + sdlRect.y = 0; + sdlRect.w = window_w; + sdlRect.h = window_h; - if (window_h != window_w * 9 / 16) { - window_w = window_h * 16 / 9; + SDL_UpdateTexture(sdlTexture, NULL, dst_buffer, pixel_w); + } else { + if (joined) { + ProcessMouseKeyEven(event); } - - SDL_SetWindowSize(window, window_w, window_h); } } - ImGui::End(); - } - - // Rendering - ImGui::Render(); - SDL_RenderSetScale(sdlRenderer, io.DisplayFramebufferScale.x, - io.DisplayFramebufferScale.y); - - SDL_Event event; - while (SDL_PollEvent(&event)) { - ImGui_ImplSDL2_ProcessEvent(&event); - if (event.type == SDL_QUIT) { - done = true; - } else if (event.type == SDL_WINDOWEVENT && - event.window.event == SDL_WINDOWEVENT_RESIZED) { - SDL_GetWindowSize(window, &window_w, &window_h); - } else if (event.type == SDL_WINDOWEVENT && - event.window.event == SDL_WINDOWEVENT_CLOSE && - event.window.windowID == SDL_GetWindowID(window)) { - done = true; - } else if (event.type == REFRESH_EVENT) { - sdlRect.x = 0; - sdlRect.y = 0; - sdlRect.w = window_w; - sdlRect.h = window_h; - - SDL_UpdateTexture(sdlTexture, NULL, dst_buffer, pixel_w); - } else { - if (joined) { - ProcessMouseKeyEven(event); - } - } - } - - SDL_RenderClear(sdlRenderer); - SDL_RenderCopy(sdlRenderer, sdlTexture, NULL, &sdlRect); - - if (!joined || !received_frame) { SDL_RenderClear(sdlRenderer); - SDL_SetRenderDrawColor( - sdlRenderer, (Uint8)(clear_color.x * 0), (Uint8)(clear_color.y * 0), - (Uint8)(clear_color.z * 0), (Uint8)(clear_color.w * 0)); + SDL_RenderCopy(sdlRenderer, sdlTexture, NULL, &sdlRect); + + if (!joined || !received_frame) { + SDL_RenderClear(sdlRenderer); + SDL_SetRenderDrawColor( + sdlRenderer, (Uint8)(clear_color.x * 0), (Uint8)(clear_color.y * + 0), (Uint8)(clear_color.z * 0), (Uint8)(clear_color.w * 0)); + } + + ImGui_ImplSDLRenderer2_RenderDrawData(ImGui::GetDrawData()); + SDL_RenderPresent(sdlRenderer); + + frame_count++; + end_time = SDL_GetTicks(); + elapsed_time = end_time - start_time; + if (elapsed_time >= 1000) { + fps = frame_count / (elapsed_time / 1000); + frame_count = 0; + window_title = "Remote Desk Client FPS [" + std::to_string(fps) + + "] status [" + server_signal_status_str + "|" + + client_signal_status_str + "|" + + server_connection_status_str + "|" + + client_connection_status_str + "]"; + // For MacOS, UI frameworks can only be called from the main thread + SDL_SetWindowTitle(window, window_title.c_str()); + start_time = end_time; + } } - ImGui_ImplSDLRenderer2_RenderDrawData(ImGui::GetDrawData()); - SDL_RenderPresent(sdlRenderer); + // Cleanup - frame_count++; - end_time = SDL_GetTicks(); - elapsed_time = end_time - start_time; - if (elapsed_time >= 1000) { - fps = frame_count / (elapsed_time / 1000); - frame_count = 0; - window_title = "Remote Desk Client FPS [" + std::to_string(fps) + - "] status [" + server_signal_status_str + "|" + - client_signal_status_str + "|" + - server_connection_status_str + "|" + - client_connection_status_str + "]"; - // For MacOS, UI frameworks can only be called from the main thread - SDL_SetWindowTitle(window, window_title.c_str()); - start_time = end_time; + if (is_create_connection) { + LeaveConnection(peer_server); } - } - // Cleanup + if (joined) { + LeaveConnection(peer_client); + } - if (is_create_connection) { - LeaveConnection(peer_server); - } + rtc_thread.join(); + SDL_CloseAudioDevice(output_dev); + SDL_CloseAudioDevice(input_dev); - if (joined) { - LeaveConnection(peer_client); - } + mouse_controller->Destroy(); - rtc_thread.join(); - SDL_CloseAudioDevice(output_dev); - SDL_CloseAudioDevice(input_dev); + ImGui_ImplSDLRenderer2_Shutdown(); + ImGui_ImplSDL2_Shutdown(); + ImGui::DestroyContext(); - mouse_controller->Destroy(); + SDL_DestroyRenderer(sdlRenderer); + SDL_DestroyWindow(window); - ImGui_ImplSDLRenderer2_Shutdown(); - ImGui_ImplSDL2_Shutdown(); - ImGui::DestroyContext(); - - SDL_DestroyRenderer(sdlRenderer); - SDL_DestroyWindow(window); - - SDL_CloseAudio(); - SDL_Quit(); + SDL_CloseAudio(); + SDL_Quit(); return 0; } \ No newline at end of file diff --git a/src/screen_capturer/windows/screen_capturer_wgc.cpp b/src/screen_capturer/windows/screen_capturer_wgc.cpp index 79a9960..994b82c 100644 --- a/src/screen_capturer/windows/screen_capturer_wgc.cpp +++ b/src/screen_capturer/windows/screen_capturer_wgc.cpp @@ -167,7 +167,7 @@ void ScreenCapturerWgc::OnFrame(const WgcSession::wgc_session_frame &frame) { if (_on_data) BGRAToNV12FFmpeg((unsigned char *)frame.data, frame.width, frame.height, nv12_frame_); - _on_data(nv12_frame_, frame.width * frame.height * 4, frame.width, + _on_data(nv12_frame_, frame.width * frame.height * 3 / 2, frame.width, frame.height); } diff --git a/thirdparty/projectx b/thirdparty/projectx index a309627..f5586a7 160000 --- a/thirdparty/projectx +++ b/thirdparty/projectx @@ -1 +1 @@ -Subproject commit a309627ca3325e650d2c207e8c546ed98d68bdea +Subproject commit f5586a7922838c38acc83f87670f7325c0514c3d diff --git a/xmake.lua b/xmake.lua index 708e40a..c2d470b 100644 --- a/xmake.lua +++ b/xmake.lua @@ -13,7 +13,7 @@ if is_mode("debug") then add_defines("REMOTE_DESK_DEBUG") end -add_requires("sdl2", {system = false}) +add_requires("sdl2 2.28.3", {system = false}) add_requires("spdlog 1.11.0", {system = false}) add_requires("imgui 1.89.9", {configs = {sdl2 = true, sdl2_renderer = true}}) @@ -157,7 +157,7 @@ target("remote_desk") -- "-lxcb-shm", "-lXext", "-lX11", "-lXv", "-lpthread", "-lSDL2", "-lopenh264", -- "-ldl", {force = true}) -target("mouse_control") - set_kind("binary") - add_files("test/linux_mouse_control/mouse_control.cpp") - add_includedirs("test/linux_mouse_control") \ No newline at end of file +-- target("mouse_control") +-- set_kind("binary") +-- add_files("test/linux_mouse_control/mouse_control.cpp") +-- add_includedirs("test/linux_mouse_control") \ No newline at end of file