From 818dab764f7b959b93d6491ea9fd787c06b5d0aa Mon Sep 17 00:00:00 2001 From: dijunkun Date: Wed, 28 May 2025 19:15:02 +0800 Subject: [PATCH] [fix] do not recreate screen capturer when reload configuration file --- src/single_window/render.cpp | 25 +++++++++++++++++----- src/single_window/render.h | 4 ++-- src/single_window/render_callback_func.cpp | 1 + thirdparty/projectx | 2 +- 4 files changed, 24 insertions(+), 8 deletions(-) diff --git a/src/single_window/render.cpp b/src/single_window/render.cpp index 3053c46..7e85d84 100644 --- a/src/single_window/render.cpp +++ b/src/single_window/render.cpp @@ -232,6 +232,7 @@ int Render::LoadSettingsFromCacheFile() { config_center_.SetHardwareVideoCodec(enable_hardware_video_codec_); config_center_.SetTurn(enable_turn_); + thumbnail_.reset(); thumbnail_ = std::make_unique(); thumbnail_->GetKeyAndIv(aes128_key_, aes128_iv_); thumbnail_->DeleteAllFilesInDirectory(); @@ -255,6 +256,7 @@ int Render::LoadSettingsFromCacheFile() { memcpy(aes128_key_, cd_cache_.key, sizeof(cd_cache_.key)); memcpy(aes128_iv_, cd_cache_.iv, sizeof(cd_cache_.iv)); + thumbnail_.reset(); thumbnail_ = std::make_unique(aes128_key_, aes128_iv_); language_button_value_ = cd_cache_.language; @@ -283,6 +285,11 @@ int Render::LoadSettingsFromCacheFile() { } int Render::ScreenCapturerInit() { + if (screen_capturer_) { + LOG_INFO("Screen capturer already initialized"); + return 0; + } + screen_capturer_ = (ScreenCapturer*)screen_capturer_factory_->Create(); last_frame_time_ = std::chrono::duration_cast( std::chrono::steady_clock::now().time_since_epoch()) @@ -870,7 +877,6 @@ int Render::Run() { const int scaled_video_width_ = 160; const int scaled_video_height_ = 90; - argb_buffer_ = new char[scaled_video_width_ * scaled_video_height_ * 40]; MainLoop(); @@ -1041,8 +1047,6 @@ void Render::HandleStreamWindow() { } void Render::Cleanup() { - delete[] argb_buffer_; - if (screen_capturer_) { screen_capturer_->Destroy(); delete screen_capturer_; @@ -1119,6 +1123,19 @@ void Render::CleanupPeers() { client_properties_.clear(); } +void Render::CleanSubStreamWindowProperties( + std::shared_ptr props) { + if (props->stream_texture_) { + SDL_DestroyTexture(props->stream_texture_); + props->stream_texture_ = nullptr; + } + + if (props->dst_buffer_) { + delete[] props->dst_buffer_; + props->dst_buffer_ = nullptr; + } +} + void Render::UpdateRenderRect() { for (auto& [_, props] : client_properties_) { if (!props->reset_control_bar_pos_) { @@ -1220,8 +1237,6 @@ void Render::ProcessSdlEvent() { memset(&props->net_traffic_stats_, 0, sizeof(props->net_traffic_stats_)); SDL_SetWindowFullscreen(main_window_, SDL_FALSE); - SDL_DestroyTexture(props->stream_texture_); - props->stream_texture_ = nullptr; SDL_FlushEvents(STREAM_FRASH, STREAM_FRASH); memset(audio_buffer_, 0, 720); } diff --git a/src/single_window/render.h b/src/single_window/render.h index 9bb5fee..b949222 100644 --- a/src/single_window/render.h +++ b/src/single_window/render.h @@ -130,6 +130,8 @@ class Render { void CleanupFactories(); void CleanupPeer(std::shared_ptr props); void CleanupPeers(); + void CleanSubStreamWindowProperties( + std::shared_ptr props); void UpdateRenderRect(); void ProcessSdlEvent(); @@ -276,7 +278,6 @@ class Render { SDL_Renderer *main_renderer_ = nullptr; ImGuiContext *main_ctx_ = nullptr; bool exit_ = false; - char *argb_buffer_ = nullptr; // main window properties bool start_mouse_controller_ = false; @@ -337,7 +338,6 @@ class Render { // stream window render SDL_Window *stream_window_ = nullptr; SDL_Renderer *stream_renderer_ = nullptr; - SDL_Texture *stream_texture_ = nullptr; ImGuiContext *stream_ctx_ = nullptr; // stream window properties diff --git a/src/single_window/render_callback_func.cpp b/src/single_window/render_callback_func.cpp index 5e19a36..dff38a5 100644 --- a/src/single_window/render_callback_func.cpp +++ b/src/single_window/render_callback_func.cpp @@ -432,6 +432,7 @@ void Render::OnConnectionStatusCb(ConnectionStatus status, const char *user_id, SDL_UpdateTexture(props->stream_texture_, NULL, props->dst_buffer_, props->texture_width_); } + render->CleanSubStreamWindowProperties(props); break; case ConnectionStatus::IncorrectPassword: render->password_validating_ = false; diff --git a/thirdparty/projectx b/thirdparty/projectx index 1621ab0..c4607be 160000 --- a/thirdparty/projectx +++ b/thirdparty/projectx @@ -1 +1 @@ -Subproject commit 1621ab04ed3e91591a0dafc443e5103e2f59a7f0 +Subproject commit c4607bef9f35c7e61541c7980c2daccef0c67112