From f3fcd4bfda5bb930ae5dc84702d17a76e0362c87 Mon Sep 17 00:00:00 2001 From: wiiiii123 Date: Fri, 8 May 2026 23:27:35 +0700 Subject: [PATCH] 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 be08a2b3..896af05e 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 2c433b3b..d037fa75 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 30969e39..1a89b21e 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 21f49032..48fdeaad 100644 --- a/electron/native/wgc-capture/src/mf_encoder.h +++ b/electron/native/wgc-capture/src/mf_encoder.h @@ -30,6 +30,8 @@ private: 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 987c649b..c9fb0040 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 5ca6be34..1755f4b1 100644 --- a/electron/native/wgc-capture/src/wgc_session.h +++ b/electron/native/wgc-capture/src/wgc_session.h @@ -28,6 +28,7 @@ public: 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 @@ private: 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 @@ private: 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);