From: Byron Campen Date: Thu, 20 Jul 2023 14:24:00 +0000 Subject: Bug 1838080: Ensure that last ref to transformation_queue_ is not released on itself. r=pehrsons,webrtc-reviewers Differential Revision: https://phabricator.services.mozilla.com/D181699 Mercurial Revision: https://hg.mozilla.org/mozilla-central/rev/91d9e8b6a5c430a73561ffd2330865f04fcb1a6d --- .../rtp_sender_video_frame_transformer_delegate.cc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/modules/rtp_rtcp/source/rtp_sender_video_frame_transformer_delegate.cc b/modules/rtp_rtcp/source/rtp_sender_video_frame_transformer_delegate.cc index 86c69f7861..fd76cde157 100644 --- a/modules/rtp_rtcp/source/rtp_sender_video_frame_transformer_delegate.cc +++ b/modules/rtp_rtcp/source/rtp_sender_video_frame_transformer_delegate.cc @@ -34,6 +34,7 @@ #include "api/video_codecs/video_codec.h" #include "modules/rtp_rtcp/source/rtp_video_header.h" #include "rtc_base/checks.h" +#include "rtc_base/event.h" #include "rtc_base/synchronization/mutex.h" namespace webrtc { @@ -287,6 +288,14 @@ void RTPSenderVideoFrameTransformerDelegate::Reset() { MutexLock lock(&sender_lock_); sender_ = nullptr; } + // Wait until all pending tasks are executed, to ensure that the last ref + // standing is not on the transformation queue. + rtc::Event flush; + transformation_queue_->PostTask([this, &flush]() { + RTC_DCHECK_RUN_ON(transformation_queue_.get()); + flush.Set(); + }); + flush.Wait(rtc::Event::kForever); } std::unique_ptr CloneSenderVideoFrame(