The branch, master has been updated
       via  b8256b82f5341d9ae5774f77779507db09f97b96 (commit)
       via  61378d6b911d30ef7ec095bcbb25b243ea07673c (commit)
      from  af35a13f6d269a2400fd36ecc70b74ea2da1f1a8 (commit)


- Log -----------------------------------------------------------------
commit b8256b82f5341d9ae5774f77779507db09f97b96
Author:     Timo Rothenpieler <[email protected]>
AuthorDate: Tue Sep 16 15:32:10 2025 +0200
Commit:     Timo Rothenpieler <[email protected]>
CommitDate: Tue Sep 16 15:52:11 2025 +0000

    avfilter/vsrc_gfxcapture: remove needless use of atomics

diff --git a/libavfilter/vsrc_gfxcapture_winrt.cpp 
b/libavfilter/vsrc_gfxcapture_winrt.cpp
index 0849380b3a..9562863d7f 100644
--- a/libavfilter/vsrc_gfxcapture_winrt.cpp
+++ b/libavfilter/vsrc_gfxcapture_winrt.cpp
@@ -47,7 +47,6 @@ extern "C" {
 #include "vsrc_gfxcapture.h"
 }
 
-#include <atomic>
 #include <cinttypes>
 #include <condition_variable>
 #include <cwchar>
@@ -709,21 +708,19 @@ static int run_on_wgc_thread(AVFilterContext *avctx, F 
&&cb)
     struct CBData {
         std::mutex mutex;
         std::condition_variable cond;
-        std::atomic<bool> done { false };
-        std::atomic<bool> cancel { false };
-        int ret = AVERROR_BUG;
+        bool done { false };
+        bool cancel { false };
+        int ret { AVERROR_BUG };
     };
     auto cbdata = std::make_shared<CBData>();
 
-    std::unique_lock cblock(cbdata->mutex);
-
     boolean res = 0;
     CHECK_HR_RET(wgctx->dispatcher_queue->TryEnqueue(
         create_cb_handler<IDispatcherQueueHandler>(
             [cb = std::forward<F>(cb), cbdata]() {
                 {
                     std::lock_guard lock(cbdata->mutex);
-                    if (cbdata->cancel.load(std::memory_order_acquire))
+                    if (cbdata->cancel)
                         return S_OK;
 
                     try {
@@ -734,7 +731,7 @@ static int run_on_wgc_thread(AVFilterContext *avctx, F &&cb)
                         cbdata->ret = AVERROR_BUG;
                     }
 
-                    cbdata->done.store(true, std::memory_order_release);
+                    cbdata->done = true;
                 }
 
                 cbdata->cond.notify_one();
@@ -745,8 +742,9 @@ static int run_on_wgc_thread(AVFilterContext *avctx, F &&cb)
         return AVERROR_EXTERNAL;
     }
 
-    if (!cbdata->cond.wait_for(cblock, std::chrono::seconds(1), [&]() { return 
cbdata->done.load(std::memory_order_acquire); })) {
-        cbdata->cancel.store(true, std::memory_order_release);
+    std::unique_lock cblock(cbdata->mutex);
+    if (!cbdata->cond.wait_for(cblock, std::chrono::seconds(1), [&]() { return 
cbdata->done; })) {
+        cbdata->cancel = true;
         av_log(avctx, AV_LOG_ERROR, "WGC thread callback timed out\n");
         return AVERROR(ETIMEDOUT);
     }

commit 61378d6b911d30ef7ec095bcbb25b243ea07673c
Author:     Timo Rothenpieler <[email protected]>
AuthorDate: Tue Sep 16 00:13:46 2025 +0200
Commit:     Timo Rothenpieler <[email protected]>
CommitDate: Tue Sep 16 15:52:11 2025 +0000

    avfilter/vsrc_gfxcapture: fix possible missed wakeup race in capture loop

diff --git a/libavfilter/vsrc_gfxcapture_winrt.cpp 
b/libavfilter/vsrc_gfxcapture_winrt.cpp
index 6477e56918..0849380b3a 100644
--- a/libavfilter/vsrc_gfxcapture_winrt.cpp
+++ b/libavfilter/vsrc_gfxcapture_winrt.cpp
@@ -123,8 +123,8 @@ struct GfxCaptureContextWgc {
 
     std::mutex frame_arrived_mutex;
     std::condition_variable frame_arrived_cond;
-    std::atomic<bool> window_closed { false };
-    std::atomic<uint64_t> frame_seq { 0 };
+    bool window_closed { false };
+    uint64_t frame_seq { 0 };
 
     SizeInt32 cap_size { 0, 0 };
     RECT client_area_offsets { 0, 0, 0, 0 };
@@ -196,12 +196,18 @@ static HRESULT 
get_activation_factory(GfxCaptureContextCpp *ctx, PCWSTR clsid, T
  ****************************************************/
 
 static void wgc_frame_arrived_handler(const 
std::unique_ptr<GfxCaptureContextWgc> &wgctx) {
-    wgctx->frame_seq.fetch_add(1, std::memory_order_release);
+    {
+        std::lock_guard lock(wgctx->frame_arrived_mutex);
+        wgctx->frame_seq += 1;
+    }
     wgctx->frame_arrived_cond.notify_one();
 }
 
 static void wgc_closed_handler(const std::unique_ptr<GfxCaptureContextWgc> 
&wgctx) {
-    wgctx->window_closed.store(true, std::memory_order_release);
+    {
+        std::lock_guard lock(wgctx->frame_arrived_mutex);
+        wgctx->window_closed = true;
+    }
     wgctx->frame_arrived_cond.notify_one();
 }
 
@@ -1455,23 +1461,22 @@ static int gfxcapture_activate(AVFilterContext *avctx)
     if (!ff_outlink_frame_wanted(outlink))
         return FFERROR_NOT_READY;
 
-    std::unique_lock frame_lock(wgctx->frame_arrived_mutex);
-
     for (;;) {
-        uint64_t last_seq = wgctx->frame_seq.load(std::memory_order_acquire);
+        uint64_t last_seq = wgctx->frame_seq;
 
         int ret = process_frame_if_exists(outlink);
         if (ret != AVERROR(EAGAIN))
             return ret;
 
-        if (wgctx->window_closed.load(std::memory_order_acquire)) {
+        std::unique_lock frame_lock(wgctx->frame_arrived_mutex);
+
+        if (wgctx->window_closed && wgctx->frame_seq == last_seq) {
             ff_outlink_set_status(outlink, AVERROR_EOF, ctx->last_pts - 
ctx->first_pts + 1);
             break;
         }
 
         if (!wgctx->frame_arrived_cond.wait_for(frame_lock, 
std::chrono::seconds(1), [&]() {
-            return wgctx->frame_seq.load(std::memory_order_acquire) != 
last_seq ||
-                   wgctx->window_closed.load(std::memory_order_acquire);
+            return wgctx->frame_seq != last_seq || wgctx->window_closed;
         }))
             break;
     }

-----------------------------------------------------------------------

Summary of changes:
 libavfilter/vsrc_gfxcapture_winrt.cpp | 43 +++++++++++++++++++----------------
 1 file changed, 23 insertions(+), 20 deletions(-)


hooks/post-receive
-- 

_______________________________________________
ffmpeg-cvslog mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to