From 86a7969a6d30d1b62e04bb2799cc1ee258c67685 Mon Sep 17 00:00:00 2001 From: Sergey Silkin Date: Tue, 1 Aug 2023 09:26:11 +0200 Subject: [PATCH] Synchronize access to callbacks map MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bug: webrtc:14852 Change-Id: I65a608976056865849f4175411febc8093402de1 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/314481 Reviewed-by: Åsa Persson Commit-Queue: Sergey Silkin Cr-Commit-Position: refs/heads/main@{#40500} --- .../codecs/test/video_codec_test.cc | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/modules/video_coding/codecs/test/video_codec_test.cc b/modules/video_coding/codecs/test/video_codec_test.cc index 9be2d377eb..826202489c 100644 --- a/modules/video_coding/codecs/test/video_codec_test.cc +++ b/modules/video_coding/codecs/test/video_codec_test.cc @@ -224,7 +224,10 @@ class TestEncoder : public VideoCodecTester::Encoder, } void Encode(const VideoFrame& frame, EncodeCallback callback) override { - callbacks_[frame.timestamp()] = std::move(callback); + { + MutexLock lock(&mutex_); + callbacks_[frame.timestamp()] = std::move(callback); + } if (auto fs = frame_settings_.find(frame_num_); fs != frame_settings_.begin() && fs != frame_settings_.end()) { @@ -251,6 +254,7 @@ class TestEncoder : public VideoCodecTester::Encoder, protected: Result OnEncodedImage(const EncodedImage& encoded_image, const CodecSpecificInfo* codec_specific_info) override { + MutexLock lock(&mutex_); auto cb = callbacks_.find(encoded_image.Timestamp()); RTC_CHECK(cb != callbacks_.end()); cb->second(encoded_image); @@ -322,7 +326,8 @@ class TestEncoder : public VideoCodecTester::Encoder, const std::string codec_type_; const std::map& frame_settings_; int frame_num_; - std::map callbacks_; + std::map callbacks_ RTC_GUARDED_BY(mutex_); + Mutex mutex_; }; class TestDecoder : public VideoCodecTester::Decoder, @@ -345,7 +350,11 @@ class TestDecoder : public VideoCodecTester::Decoder, } void Decode(const EncodedImage& frame, DecodeCallback callback) override { - callbacks_[frame.Timestamp()] = std::move(callback); + { + MutexLock lock(&mutex_); + callbacks_[frame.Timestamp()] = std::move(callback); + } + decoder_->Decode(frame, /*missing_frames=*/false, /*render_time_ms=*/0); } @@ -361,6 +370,7 @@ class TestDecoder : public VideoCodecTester::Decoder, protected: int Decoded(VideoFrame& decoded_frame) override { + MutexLock lock(&mutex_); auto cb = callbacks_.find(decoded_frame.timestamp()); RTC_CHECK(cb != callbacks_.end()); cb->second(decoded_frame); @@ -371,7 +381,8 @@ class TestDecoder : public VideoCodecTester::Decoder, std::unique_ptr decoder_; const std::string codec_type_; - std::map callbacks_; + std::map callbacks_ RTC_GUARDED_BY(mutex_); + Mutex mutex_; }; std::unique_ptr CreateVideoSource(