From be784969923ed44090f29199c05870578978e570 Mon Sep 17 00:00:00 2001 From: dijunkun Date: Tue, 25 Jun 2024 14:47:54 +0800 Subject: [PATCH] Separate stream window from main window --- src/multiple_windows/remote_peer_window.cpp | 25 +--- src/multiple_windows/render.cpp | 118 ++++++++++-------- src/multiple_windows/render.h | 23 ++-- src/multiple_windows/render_callback_func.cpp | 2 + 4 files changed, 86 insertions(+), 82 deletions(-) diff --git a/src/multiple_windows/remote_peer_window.cpp b/src/multiple_windows/remote_peer_window.cpp index 2e68a4e..e024bc2 100644 --- a/src/multiple_windows/remote_peer_window.cpp +++ b/src/multiple_windows/remote_peer_window.cpp @@ -48,9 +48,7 @@ int Render::RemoteWindow() { if (ImGui::Button(ICON_FA_ARROW_RIGHT_LONG, ImVec2(55, 35)) || rejoin_) { int ret = -1; if ("SignalConnected" == signal_status_str_) { - if (connect_button_label_ == - localization::connect[localization_language_index_] && - !connection_established_ && strlen(remote_id_)) { + if (!connection_established_ && strlen(remote_id_)) { if (remote_id_ == local_id_ && !peer_reserved_) { peer_reserved_ = CreatePeer(¶ms_); if (peer_reserved_) { @@ -72,27 +70,6 @@ int Render::RemoteWindow() { } else { rejoin_ = true; } - - } else if (connect_button_label_ == - localization::disconnect[localization_language_index_] && - connection_established_) { - ret = LeaveConnection(peer_reserved_ ? peer_reserved_ : peer_); - - if (0 == ret) { - rejoin_ = false; - memset(audio_buffer_, 0, 960); - connection_established_ = false; - received_frame_ = false; - is_client_mode_ = false; - } - } - - if (0 == ret) { - connect_button_pressed_ = !connect_button_pressed_; - connect_button_label_ = - connect_button_pressed_ - ? localization::disconnect[localization_language_index_] - : localization::connect[localization_language_index_]; } } } diff --git a/src/multiple_windows/render.cpp b/src/multiple_windows/render.cpp index 2711d6d..2547864 100644 --- a/src/multiple_windows/render.cpp +++ b/src/multiple_windows/render.cpp @@ -166,6 +166,38 @@ int Render::CreateConnectionPeer() { return 0; } +int Render::CreateStreamRenderWindow() { + SDL_WindowFlags window_flags = + (SDL_WindowFlags)(SDL_WINDOW_ALLOW_HIGHDPI | SDL_WINDOW_RESIZABLE); + stream_window_ = SDL_CreateWindow( + "Stream Window", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, + stream_window_width_, stream_window_height_, window_flags); + + stream_renderer_ = SDL_CreateRenderer( + stream_window_, -1, SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_ACCELERATED); + if (stream_renderer_ == nullptr) { + SDL_Log("Error creating SDL_Renderer!"); + return 0; + } + + stream_pixformat_ = SDL_PIXELFORMAT_NV12; + + stream_texture_ = SDL_CreateTexture(stream_renderer_, stream_pixformat_, + SDL_TEXTUREACCESS_STREAMING, + texture_width_, texture_height_); + + // Auto scaling for the render frame + SDL_RenderSetLogicalSize(stream_renderer_, stream_window_width_, + stream_window_height_); + + stream_render_rect_.x = 0; + stream_render_rect_.y = 0; + stream_render_rect_.w = stream_window_width_; + stream_render_rect_.h = stream_window_height_; + + return 0; +} + int Render::Run() { LoadSettingsIntoCacheFile(); @@ -196,28 +228,13 @@ int Render::Run() { screen_width_ = DM.w; screen_height_ = DM.h; - sdl_renderer_ = SDL_CreateRenderer( + main_renderer_ = SDL_CreateRenderer( main_window_, -1, SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_ACCELERATED); - if (sdl_renderer_ == nullptr) { + if (main_renderer_ == nullptr) { SDL_Log("Error creating SDL_Renderer!"); return 0; } - // Auto scaling for the render frame - SDL_RenderSetLogicalSize(sdl_renderer_, main_window_width_, - main_window_height_); - - pixformat_ = SDL_PIXELFORMAT_NV12; - - sdl_texture_ = - SDL_CreateTexture(sdl_renderer_, pixformat_, SDL_TEXTUREACCESS_STREAMING, - texture_width_, texture_height_); - - sdl_rect_.x = 0; - sdl_rect_.y = 0; - sdl_rect_.w = main_window_width_; - sdl_rect_.h = main_window_height_; - // Setup Dear ImGui context IMGUI_CHECKVERSION(); ImGui::CreateContext(); @@ -268,8 +285,8 @@ int Render::Run() { ImGui::StyleColorsLight(); // Setup Platform/Renderer backends - ImGui_ImplSDL2_InitForSDLRenderer(main_window_, sdl_renderer_); - ImGui_ImplSDLRenderer2_Init(sdl_renderer_); + ImGui_ImplSDL2_InitForSDLRenderer(main_window_, main_renderer_); + ImGui_ImplSDLRenderer2_Init(main_renderer_); CreateConnectionPeer(); @@ -337,7 +354,7 @@ int Render::Run() { ImGui_ImplSDL2_NewFrame(); ImGui::NewFrame(); - if (!connection_established_ || !received_frame_) { + if (!connection_established_ || !received_frame_ && !exit_video_window_) { MainWindow(); } @@ -346,30 +363,27 @@ int Render::Run() { ImGui_ImplSDL2_ProcessEvent(&event); if (event.type == SDL_QUIT) { exit_ = true; - } else if (event.window.event == SDL_WINDOWEVENT_SIZE_CHANGED) { - SDL_GetWindowSize(main_window_, &main_window_width_, - &main_window_height_); - - sdl_rect_.x = 0; - sdl_rect_.y = 0; - if (main_window_width_ * 9 / 16 > main_window_height_) { - sdl_rect_.w = main_window_height_ * 16 / 9; - sdl_rect_.h = main_window_height_; - } else { - sdl_rect_.w = main_window_width_; - sdl_rect_.h = main_window_width_ * 9 / 16; - } - - main_window_width_last_ = main_window_width_; - main_window_height_last_ = main_window_height_; - + } else if (event.window.event == SDL_WINDOWEVENT_SIZE_CHANGED && + event.window.windowID == SDL_GetWindowID(stream_window_)) { + SDL_GetWindowSize(stream_window_, &stream_window_width_, + &stream_window_height_); } else if (event.type == SDL_WINDOWEVENT && - event.window.event == SDL_WINDOWEVENT_CLOSE && - event.window.windowID == SDL_GetWindowID(main_window_)) { - exit_ = true; + event.window.event == SDL_WINDOWEVENT_CLOSE) { + if (event.window.windowID == SDL_GetWindowID(main_window_)) { + exit_ = true; + } else if (event.window.windowID == SDL_GetWindowID(stream_window_)) { + SDL_DestroyWindow(stream_window_); + exit_video_window_ = true; + LeaveConnection(peer_); + rejoin_ = false; + memset(audio_buffer_, 0, 960); + connection_established_ = false; + received_frame_ = false; + is_client_mode_ = false; + } } else if (event.type == REFRESH_EVENT) { - if (sdl_texture_) - SDL_UpdateTexture(sdl_texture_, NULL, dst_buffer_, 1280); + if (stream_texture_) + SDL_UpdateTexture(stream_texture_, NULL, dst_buffer_, 1280); } else { if (connection_established_) { ProcessMouseKeyEven(event); @@ -379,16 +393,22 @@ int Render::Run() { // Rendering ImGui::Render(); - SDL_RenderSetScale(sdl_renderer_, io.DisplayFramebufferScale.x, + SDL_RenderSetScale(main_renderer_, io.DisplayFramebufferScale.x, io.DisplayFramebufferScale.y); - SDL_RenderClear(sdl_renderer_); - if (connection_established_ && received_frame_) { - SDL_RenderCopy(sdl_renderer_, sdl_texture_, NULL, &sdl_rect_); - SDL_RenderPresent(sdl_renderer_); + if (connection_established_ && received_frame_ && !exit_video_window_) { + if (!stream_windows_created_) { + CreateStreamRenderWindow(); + stream_windows_created_ = true; + } + + SDL_RenderClear(stream_renderer_); + SDL_RenderCopy(stream_renderer_, stream_texture_, NULL, + &stream_render_rect_); + SDL_RenderPresent(stream_renderer_); } ImGui_ImplSDLRenderer2_RenderDrawData(ImGui::GetDrawData()); - SDL_RenderPresent(sdl_renderer_); + SDL_RenderPresent(main_renderer_); frame_count_++; end_time_ = SDL_GetTicks(); @@ -426,7 +446,7 @@ int Render::Run() { ImGui_ImplSDL2_Shutdown(); ImGui::DestroyContext(); - SDL_DestroyRenderer(sdl_renderer_); + SDL_DestroyRenderer(main_renderer_); SDL_DestroyWindow(main_window_); SDL_CloseAudio(); diff --git a/src/multiple_windows/render.h b/src/multiple_windows/render.h index 132c77b..65dc45b 100644 --- a/src/multiple_windows/render.h +++ b/src/multiple_windows/render.h @@ -30,6 +30,7 @@ class Render { int Run(); private: + int CreateStreamRenderWindow(); int MainWindow(); int MenuWindow(); int LocalWindow(); @@ -110,8 +111,10 @@ class Render { int screen_height_ = 720; int main_window_width_ = 960; int main_window_height_ = 540; - int main_window_width_last_ = 960; - int main_window_height_last_ = 540; + int stream_window_width_ = 1280; + int stream_window_height_ = 720; + int stream_window_width_last_ = 1280; + int stream_window_height_last_ = 720; int main_window_width_before_fullscreen_ = 1280; int main_window_height_before_fullscreen_ = 720; int menu_window_height_ = 40; @@ -121,18 +124,19 @@ class Render { int texture_height_ = 720; SDL_Window *main_window_; - SDL_Renderer *sdl_renderer_ = nullptr; + SDL_Renderer *main_renderer_ = nullptr; SDL_Texture *sdl_texture_ = nullptr; - SDL_Rect sdl_rect_; - uint32_t pixformat_ = 0; // video window - SDL_Window *video_window_; - SDL_Renderer *video_renderer_ = nullptr; - SDL_Texture *video_texture_ = nullptr; + SDL_Window *stream_window_; + SDL_Renderer *stream_renderer_ = nullptr; + SDL_Texture *stream_texture_ = nullptr; + SDL_Rect stream_render_rect_; + uint32_t stream_pixformat_ = 0; bool inited_ = false; bool exit_ = false; + bool exit_video_window_ = false; bool connection_established_ = false; bool subwindow_hovered_ = false; bool connect_button_pressed_ = false; @@ -146,7 +150,8 @@ class Render { bool control_mouse_ = false; bool show_password_ = true; bool regenerate_password_ = false; - bool video_window_created_ = false; + bool stream_windows_created_ = false; + int regenerate_password_frame_count_ = 0; int fps_ = 0; diff --git a/src/multiple_windows/render_callback_func.cpp b/src/multiple_windows/render_callback_func.cpp index beba671..b9e1b94 100644 --- a/src/multiple_windows/render_callback_func.cpp +++ b/src/multiple_windows/render_callback_func.cpp @@ -172,6 +172,7 @@ void Render::OnConnectionStatusCb(ConnectionStatus status, void *user_data) { render->start_screen_capture_ = true; render->start_mouse_control_ = true; } + // SDL_MinimizeWindow(render->main_window_); } else if (ConnectionStatus::Disconnected == status) { render->connection_status_str_ = "Disconnected"; } else if (ConnectionStatus::Failed == status) { @@ -182,6 +183,7 @@ void Render::OnConnectionStatusCb(ConnectionStatus status, void *user_data) { render->start_mouse_control_ = false; render->connection_established_ = false; render->control_mouse_ = false; + render->exit_video_window_ = false; if (render->dst_buffer_) { memset(render->dst_buffer_, 0, 1280 * 720 * 3); SDL_UpdateTexture(render->sdl_texture_, NULL, render->dst_buffer_, 1280);