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]