From 3c91b31162b88a3b38f227a0c681115f2a20a1dd Mon Sep 17 00:00:00 2001 From: Artem Titov Date: Thu, 5 Mar 2020 11:11:08 +0100 Subject: [PATCH] Fix potential deadlock during release of quality analyzing codecs Bug: webrtc:11407 Change-Id: I45637e39a03a385e0544d4de06786b9508b25ce8 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/169728 Reviewed-by: Ilya Nikolaevskiy Commit-Queue: Artem Titov Cr-Commit-Position: refs/heads/master@{#30690} --- .../e2e/analyzer/video/quality_analyzing_video_decoder.cc | 6 +++++- .../e2e/analyzer/video/quality_analyzing_video_encoder.cc | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/test/pc/e2e/analyzer/video/quality_analyzing_video_decoder.cc b/test/pc/e2e/analyzer/video/quality_analyzing_video_decoder.cc index f490cc4094..d4d961153a 100644 --- a/test/pc/e2e/analyzer/video/quality_analyzing_video_decoder.cc +++ b/test/pc/e2e/analyzer/video/quality_analyzing_video_decoder.cc @@ -109,11 +109,15 @@ int32_t QualityAnalyzingVideoDecoder::RegisterDecodeCompleteCallback( } int32_t QualityAnalyzingVideoDecoder::Release() { + // Release decoder first. During release process it can still decode some + // frames, so we don't take a lock to prevent deadlock. + int32_t result = delegate_->Release(); + rtc::CritScope crit(&lock_); analyzing_callback_->SetDelegateCallback(nullptr); timestamp_to_frame_id_.clear(); decoding_images_.clear(); - return delegate_->Release(); + return result; } bool QualityAnalyzingVideoDecoder::PrefersLateDecoding() const { diff --git a/test/pc/e2e/analyzer/video/quality_analyzing_video_encoder.cc b/test/pc/e2e/analyzer/video/quality_analyzing_video_encoder.cc index af95790028..96b23b408e 100644 --- a/test/pc/e2e/analyzer/video/quality_analyzing_video_encoder.cc +++ b/test/pc/e2e/analyzer/video/quality_analyzing_video_encoder.cc @@ -114,9 +114,13 @@ int32_t QualityAnalyzingVideoEncoder::RegisterEncodeCompleteCallback( } int32_t QualityAnalyzingVideoEncoder::Release() { + // Release encoder first. During release process it can still encode some + // frames, so we don't take a lock to prevent deadlock. + int32_t result = delegate_->Release(); + rtc::CritScope crit(&lock_); delegate_callback_ = nullptr; - return delegate_->Release(); + return result; } int32_t QualityAnalyzingVideoEncoder::Encode(