From f3fcd4bfda5bb930ae5dc84702d17a76e0362c87 Mon Sep 17 00:00:00 2001 From: wiiiii123 Date: Fri, 8 May 2026 23:27:35 +0700 Subject: [PATCH 1/2] fix(recording): stabilize WGC resize frames --- .../bin/win32-x64/helpers-manifest.json | 6 +- electron/native/bin/win32-x64/wgc-capture.exe | Bin 105984 -> 108032 bytes electron/native/wgc-capture/src/main.cpp | 9 ++- .../native/wgc-capture/src/mf_encoder.cpp | 62 +++++++++++++++++- electron/native/wgc-capture/src/mf_encoder.h | 2 + .../native/wgc-capture/src/wgc_session.cpp | 48 ++++++++++++++ electron/native/wgc-capture/src/wgc_session.h | 6 ++ 7 files changed, 128 insertions(+), 5 deletions(-) diff --git a/electron/native/bin/win32-x64/helpers-manifest.json b/electron/native/bin/win32-x64/helpers-manifest.json index be08a2b3d..896af05e4 100644 --- a/electron/native/bin/win32-x64/helpers-manifest.json +++ b/electron/native/bin/win32-x64/helpers-manifest.json @@ -5,10 +5,10 @@ "helpers": { "wgc-capture": { "binaryName": "wgc-capture.exe", - "binarySha256": "88226bd499c820081a27264b40f37875d0949d9f921920738e05b7eaeb1a9e7d", + "binarySha256": "ee24c7ce2fcd86eb513663416ad0aca673ac2a9b90b73532bc457e021b7b78a6", "sourceDir": "electron/native/wgc-capture", - "sourceFingerprint": "7190e148ede1fb1c573cc1866405d6345b0c35378a7e32499580bffacf1cc6d2", - "updatedAt": "2026-05-07T15:21:44.354Z" + "sourceFingerprint": "c5a28a1999758f5b98dc79c247507eacb672a188d81d19aedc2dd656ee92a737", + "updatedAt": "2026-05-08T16:48:17.850Z" }, "cursor-monitor": { "binaryName": "cursor-monitor.exe", diff --git a/electron/native/bin/win32-x64/wgc-capture.exe b/electron/native/bin/win32-x64/wgc-capture.exe index e55df5063462f4c641ad974cb86fe8c8555882e4..add5c5db741c1477f2fdcdaa0953148e092321f4 100644 GIT binary patch delta 43348 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 delta 41496 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 diff --git a/electron/native/wgc-capture/src/main.cpp b/electron/native/wgc-capture/src/main.cpp index 2c433b3bc..d037fa75c 100644 --- a/electron/native/wgc-capture/src/main.cpp +++ b/electron/native/wgc-capture/src/main.cpp @@ -397,7 +397,7 @@ int main(int argc, char* argv[]) { } // Wait for stop signal while pausing/resuming audio tracks in lockstep. - while (!g_stopRequested) { + while (!g_stopRequested && !session.hasFatalError()) { if (g_pauseRequested) { if (audioActive) loopback.pause(); if (micActive) micCapture.pause(); @@ -416,6 +416,13 @@ int main(int argc, char* argv[]) { if (audioActive) loopback.stop(); if (micActive) micCapture.stop(); + if (session.hasFatalError()) { + std::cerr << "ERROR: WGC capture session failed during recording" << std::endl; + encoder.finalize(); + DeleteFileW(outputPathW.c_str()); + return 1; + } + if (audioActive) { writeCompanionAudioTimingMetadata( config.audioOutputPath, diff --git a/electron/native/wgc-capture/src/mf_encoder.cpp b/electron/native/wgc-capture/src/mf_encoder.cpp index 30969e394..1a89b21e7 100644 --- a/electron/native/wgc-capture/src/mf_encoder.cpp +++ b/electron/native/wgc-capture/src/mf_encoder.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include #include @@ -116,6 +117,31 @@ bool MFEncoder::initialize(const std::wstring& outputPath, int width, int height return false; } + // WGC window captures can change frame size while recording. Keep the muxer + // output dimensions stable by compositing resized frames into this fixed + // BGRA surface before CPU readback. + D3D11_TEXTURE2D_DESC compositeDesc = {}; + compositeDesc.Width = width_; + compositeDesc.Height = height_; + compositeDesc.MipLevels = 1; + compositeDesc.ArraySize = 1; + compositeDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; + compositeDesc.SampleDesc.Count = 1; + compositeDesc.Usage = D3D11_USAGE_DEFAULT; + compositeDesc.BindFlags = D3D11_BIND_RENDER_TARGET; + + hr = device_->CreateTexture2D(&compositeDesc, nullptr, &resizeCompositeTexture_); + if (FAILED(hr)) { + std::cerr << "ERROR: Failed to create resize composite texture: 0x" << std::hex << hr << std::endl; + return false; + } + + hr = device_->CreateRenderTargetView(resizeCompositeTexture_.Get(), nullptr, &resizeCompositeView_); + if (FAILED(hr)) { + std::cerr << "ERROR: Failed to create resize composite view: 0x" << std::hex << hr << std::endl; + return false; + } + // Pre-allocate NV12 buffer const int ySize = width_ * height_; const int uvSize = (width_ / 2) * (height_ / 2) * 2; @@ -132,7 +158,39 @@ bool MFEncoder::writeFrame(ID3D11Texture2D* texture, int64_t timestampHns) { if (!initialized_ || !sinkWriter_) return false; - context_->CopyResource(stagingTexture_.Get(), texture); + D3D11_TEXTURE2D_DESC sourceDesc = {}; + texture->GetDesc(&sourceDesc); + + if (sourceDesc.Width == static_cast(width_) && + sourceDesc.Height == static_cast(height_)) { + context_->CopyResource(stagingTexture_.Get(), texture); + } else { + if (!resizeCompositeTexture_ || !resizeCompositeView_) return false; + + const FLOAT clearColor[4] = {0.0f, 0.0f, 0.0f, 1.0f}; + context_->ClearRenderTargetView(resizeCompositeView_.Get(), clearColor); + + D3D11_BOX sourceBox = {}; + sourceBox.left = 0; + sourceBox.top = 0; + sourceBox.front = 0; + sourceBox.right = (std::min)(sourceDesc.Width, static_cast(width_)); + sourceBox.bottom = (std::min)(sourceDesc.Height, static_cast(height_)); + sourceBox.back = 1; + + if (sourceBox.right == 0 || sourceBox.bottom == 0) return false; + + context_->CopySubresourceRegion( + resizeCompositeTexture_.Get(), + 0, + 0, + 0, + 0, + texture, + 0, + &sourceBox); + context_->CopyResource(stagingTexture_.Get(), resizeCompositeTexture_.Get()); + } D3D11_MAPPED_SUBRESOURCE mapped; HRESULT hr = context_->Map(stagingTexture_.Get(), 0, D3D11_MAP_READ, 0, &mapped); @@ -242,6 +300,8 @@ bool MFEncoder::finalize() { initialized_ = false; sinkWriter_.Reset(); stagingTexture_.Reset(); + resizeCompositeView_.Reset(); + resizeCompositeTexture_.Reset(); nv12Buffer_.clear(); lastFrameBuffer_.clear(); nv12Buffer_.shrink_to_fit(); diff --git a/electron/native/wgc-capture/src/mf_encoder.h b/electron/native/wgc-capture/src/mf_encoder.h index 21f490320..48fdeaadb 100644 --- a/electron/native/wgc-capture/src/mf_encoder.h +++ b/electron/native/wgc-capture/src/mf_encoder.h @@ -30,6 +30,8 @@ class MFEncoder { ID3D11Device* device_ = nullptr; ID3D11DeviceContext* context_ = nullptr; ComPtr stagingTexture_; + ComPtr resizeCompositeTexture_; + ComPtr resizeCompositeView_; std::vector nv12Buffer_; std::vector lastFrameBuffer_; DWORD streamIndex_ = 0; diff --git a/electron/native/wgc-capture/src/wgc_session.cpp b/electron/native/wgc-capture/src/wgc_session.cpp index 987c649b5..c9fb00408 100644 --- a/electron/native/wgc-capture/src/wgc_session.cpp +++ b/electron/native/wgc-capture/src/wgc_session.cpp @@ -24,6 +24,12 @@ extern "C" { IInspectable** graphicsDevice); } +static int normalizeFramePoolExtent(int value) { + int normalized = value < 2 ? 2 : value; + if ((normalized % 2) != 0) ++normalized; + return normalized; +} + WgcSession::WgcSession() {} WgcSession::~WgcSession() { @@ -114,6 +120,8 @@ bool WgcSession::initializeWithItem(int fps) { auto size = captureItem_.Size(); captureWidth_ = size.Width; captureHeight_ = size.Height; + framePoolWidth_ = size.Width; + framePoolHeight_ = size.Height; framePool_ = winrt::Windows::Graphics::Capture::Direct3D11CaptureFramePool::CreateFreeThreaded( winrtDevice_, @@ -134,6 +142,40 @@ bool WgcSession::initializeWithItem(int fps) { return true; } +bool WgcSession::recreateFramePoolIfNeeded( + winrt::Windows::Graphics::SizeInt32 const& contentSize) { + if (!framePool_) return false; + + const int normalizedWidth = normalizeFramePoolExtent(contentSize.Width); + const int normalizedHeight = normalizeFramePoolExtent(contentSize.Height); + if (normalizedWidth == framePoolWidth_ && normalizedHeight == framePoolHeight_) { + return false; + } + + winrt::Windows::Graphics::SizeInt32 normalizedSize{ + normalizedWidth, + normalizedHeight, + }; + + try { + framePool_.Recreate( + winrtDevice_, + winrt::Windows::Graphics::DirectX::DirectXPixelFormat::B8G8R8A8UIntNormalized, + 2, + normalizedSize); + framePoolWidth_ = normalizedWidth; + framePoolHeight_ = normalizedHeight; + std::cerr << "INFO: Recreated WGC frame pool for resized content " + << framePoolWidth_ << "x" << framePoolHeight_ << std::endl; + } catch (winrt::hresult_error const& e) { + fatalError_ = true; + std::cerr << "ERROR: Failed to recreate WGC frame pool after resize: 0x" + << std::hex << e.code() << std::dec << std::endl; + } + + return true; +} + bool WgcSession::initialize(HMONITOR monitor, int fps) { fps_ = fps; frameIntervalHns_ = 10000000LL / fps_; @@ -174,6 +216,7 @@ bool WgcSession::startCapture() { if (!session_ || !framePool_) return false; capturing_ = true; + fatalError_ = false; lastFrameTimeHns_ = 0; frameArrivedRevoker_ = framePool_.FrameArrived( @@ -209,6 +252,11 @@ void WgcSession::onFrameArrived( auto frame = sender.TryGetNextFrame(); if (!frame) return; + auto contentSize = frame.ContentSize(); + if (recreateFramePoolIfNeeded(contentSize)) { + frame.Close(); + return; + } auto timestamp = frame.SystemRelativeTime(); int64_t frameTimeHns = std::chrono::duration_cast>>(timestamp).count(); diff --git a/electron/native/wgc-capture/src/wgc_session.h b/electron/native/wgc-capture/src/wgc_session.h index 5ca6be344..1755f4b16 100644 --- a/electron/native/wgc-capture/src/wgc_session.h +++ b/electron/native/wgc-capture/src/wgc_session.h @@ -28,6 +28,7 @@ class WgcSession { void setFrameCallback(FrameCallback callback); bool startCapture(); void stopCapture(); + bool hasFatalError() const { return fatalError_.load(); } int captureWidth() const { return captureWidth_; } int captureHeight() const { return captureHeight_; } @@ -45,9 +46,12 @@ class WgcSession { FrameCallback frameCallback_; std::atomic capturing_{false}; + std::atomic fatalError_{false}; int fps_ = 60; int captureWidth_ = 0; int captureHeight_ = 0; + int framePoolWidth_ = 0; + int framePoolHeight_ = 0; int64_t frameIntervalHns_ = 0; int64_t lastFrameTimeHns_ = 0; @@ -56,6 +60,8 @@ class WgcSession { winrt::Windows::Graphics::Capture::GraphicsCaptureItem createCaptureItemForMonitor(HMONITOR monitor); winrt::Windows::Graphics::Capture::GraphicsCaptureItem createCaptureItemForWindow(HWND hwnd); bool initializeWithItem(int fps); + bool recreateFramePoolIfNeeded( + winrt::Windows::Graphics::SizeInt32 const& contentSize); void onFrameArrived( winrt::Windows::Graphics::Capture::Direct3D11CaptureFramePool const& sender, winrt::Windows::Foundation::IInspectable const& args); From fe294b71d52c3ac219872ff2c66565904e7c58fc Mon Sep 17 00:00:00 2001 From: wiiiii123 Date: Sat, 9 May 2026 07:49:54 +0700 Subject: [PATCH 2/2] fix(recording): fail cleanly on WGC resize errors --- .../bin/win32-x64/helpers-manifest.json | 6 +++--- electron/native/bin/win32-x64/wgc-capture.exe | Bin 108032 -> 109568 bytes electron/native/wgc-capture/src/main.cpp | 12 ++++++++++++ .../native/wgc-capture/src/wgc_session.cpp | 5 +++-- 4 files changed, 18 insertions(+), 5 deletions(-) diff --git a/electron/native/bin/win32-x64/helpers-manifest.json b/electron/native/bin/win32-x64/helpers-manifest.json index 896af05e4..bbcef557a 100644 --- a/electron/native/bin/win32-x64/helpers-manifest.json +++ b/electron/native/bin/win32-x64/helpers-manifest.json @@ -5,10 +5,10 @@ "helpers": { "wgc-capture": { "binaryName": "wgc-capture.exe", - "binarySha256": "ee24c7ce2fcd86eb513663416ad0aca673ac2a9b90b73532bc457e021b7b78a6", + "binarySha256": "4f8873abbff58add37672114184c154dee838939ee8f2b7df45d658d078af28c", "sourceDir": "electron/native/wgc-capture", - "sourceFingerprint": "c5a28a1999758f5b98dc79c247507eacb672a188d81d19aedc2dd656ee92a737", - "updatedAt": "2026-05-08T16:48:17.850Z" + "sourceFingerprint": "6f725fad6eb515d81b2d553ec45ddbf7c681d2725bba48f0c0722ce00166d967", + "updatedAt": "2026-05-09T00:49:28.306Z" }, "cursor-monitor": { "binaryName": "cursor-monitor.exe", diff --git a/electron/native/bin/win32-x64/wgc-capture.exe b/electron/native/bin/win32-x64/wgc-capture.exe index add5c5db741c1477f2fdcdaa0953148e092321f4..37de4c9c730e3afe13b2ba44f1cdb2302604917a 100644 GIT binary patch delta 31233 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 Wwx65JQ};y{%46kyKI`OrZvPKu1EPrl delta 29909 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 diff --git a/electron/native/wgc-capture/src/main.cpp b/electron/native/wgc-capture/src/main.cpp index d037fa75c..0f007826b 100644 --- a/electron/native/wgc-capture/src/main.cpp +++ b/electron/native/wgc-capture/src/main.cpp @@ -420,6 +420,18 @@ int main(int argc, char* argv[]) { std::cerr << "ERROR: WGC capture session failed during recording" << std::endl; encoder.finalize(); DeleteFileW(outputPathW.c_str()); + if (!config.audioOutputPath.empty()) { + const std::wstring audioPathW = utf8ToWide(config.audioOutputPath); + const std::wstring audioMetadataPathW = utf8ToWide(config.audioOutputPath + ".json"); + DeleteFileW(audioPathW.c_str()); + DeleteFileW(audioMetadataPathW.c_str()); + } + if (!config.micOutputPath.empty()) { + const std::wstring micPathW = utf8ToWide(config.micOutputPath); + const std::wstring micMetadataPathW = utf8ToWide(config.micOutputPath + ".json"); + DeleteFileW(micPathW.c_str()); + DeleteFileW(micMetadataPathW.c_str()); + } return 1; } diff --git a/electron/native/wgc-capture/src/wgc_session.cpp b/electron/native/wgc-capture/src/wgc_session.cpp index c9fb00408..898a9fdc4 100644 --- a/electron/native/wgc-capture/src/wgc_session.cpp +++ b/electron/native/wgc-capture/src/wgc_session.cpp @@ -136,7 +136,7 @@ bool WgcSession::initializeWithItem(int fps) { // IsBorderRequired is only available on Windows 11+ (build 22000). propagating an hresult_error results in Native Windows capture failure try { session_.IsBorderRequired(false); - } catch (winrt::hresult_error const& e) { + } catch (winrt::hresult_error const&) { } return true; @@ -169,6 +169,7 @@ bool WgcSession::recreateFramePoolIfNeeded( << framePoolWidth_ << "x" << framePoolHeight_ << std::endl; } catch (winrt::hresult_error const& e) { fatalError_ = true; + capturing_ = false; std::cerr << "ERROR: Failed to recreate WGC frame pool after resize: 0x" << std::hex << e.code() << std::dec << std::endl; } @@ -248,7 +249,7 @@ void WgcSession::onFrameArrived( winrt::Windows::Graphics::Capture::Direct3D11CaptureFramePool const& sender, winrt::Windows::Foundation::IInspectable const&) { - if (!capturing_) return; + if (!capturing_ || fatalError_) return; auto frame = sender.TryGetNextFrame(); if (!frame) return;