FrameForwarder: remove lock recursions.

This change removes lock recursions and adds thread annotations.

Bug: webrtc:11567
Change-Id: I5416cfc8e482bd966eec87c3790abbebc37a84d8
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/176224
Reviewed-by: Magnus Flodman <mflodman@webrtc.org>
Commit-Queue: Markus Handell <handellm@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#31403}
This commit is contained in:
Markus Handell
2020-05-28 08:37:30 +02:00
committed by Commit Bot
parent 5cc28b0c6a
commit 16038abb90
3 changed files with 25 additions and 7 deletions

View File

@ -26,6 +26,12 @@ void FrameForwarder::IncomingCapturedFrame(const VideoFrame& video_frame) {
void FrameForwarder::AddOrUpdateSink(rtc::VideoSinkInterface<VideoFrame>* sink, void FrameForwarder::AddOrUpdateSink(rtc::VideoSinkInterface<VideoFrame>* sink,
const rtc::VideoSinkWants& wants) { const rtc::VideoSinkWants& wants) {
rtc::CritScope lock(&crit_); rtc::CritScope lock(&crit_);
AddOrUpdateSinkLocked(sink, wants);
}
void FrameForwarder::AddOrUpdateSinkLocked(
rtc::VideoSinkInterface<VideoFrame>* sink,
const rtc::VideoSinkWants& wants) {
RTC_DCHECK(!sink_ || sink_ == sink); RTC_DCHECK(!sink_ || sink_ == sink);
sink_ = sink; sink_ = sink;
sink_wants_ = wants; sink_wants_ = wants;
@ -42,6 +48,10 @@ rtc::VideoSinkWants FrameForwarder::sink_wants() const {
return sink_wants_; return sink_wants_;
} }
rtc::VideoSinkWants FrameForwarder::sink_wants_locked() const {
return sink_wants_;
}
bool FrameForwarder::has_sinks() const { bool FrameForwarder::has_sinks() const {
rtc::CritScope lock(&crit_); rtc::CritScope lock(&crit_);
return sink_ != nullptr; return sink_ != nullptr;

View File

@ -26,14 +26,22 @@ class FrameForwarder : public rtc::VideoSourceInterface<VideoFrame> {
FrameForwarder(); FrameForwarder();
~FrameForwarder() override; ~FrameForwarder() override;
// Forwards |video_frame| to the registered |sink_|. // Forwards |video_frame| to the registered |sink_|.
virtual void IncomingCapturedFrame(const VideoFrame& video_frame); virtual void IncomingCapturedFrame(const VideoFrame& video_frame)
rtc::VideoSinkWants sink_wants() const; RTC_LOCKS_EXCLUDED(crit_);
bool has_sinks() const; rtc::VideoSinkWants sink_wants() const RTC_LOCKS_EXCLUDED(crit_);
bool has_sinks() const RTC_LOCKS_EXCLUDED(crit_);
protected: protected:
rtc::VideoSinkWants sink_wants_locked() const
RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_);
void AddOrUpdateSink(rtc::VideoSinkInterface<VideoFrame>* sink, void AddOrUpdateSink(rtc::VideoSinkInterface<VideoFrame>* sink,
const rtc::VideoSinkWants& wants) override; const rtc::VideoSinkWants& wants)
void RemoveSink(rtc::VideoSinkInterface<VideoFrame>* sink) override; RTC_LOCKS_EXCLUDED(crit_) override;
void AddOrUpdateSinkLocked(rtc::VideoSinkInterface<VideoFrame>* sink,
const rtc::VideoSinkWants& wants)
RTC_EXCLUSIVE_LOCKS_REQUIRED(crit_);
void RemoveSink(rtc::VideoSinkInterface<VideoFrame>* sink)
RTC_LOCKS_EXCLUDED(crit_) override;
rtc::CriticalSection crit_; rtc::CriticalSection crit_;
rtc::VideoSinkInterface<VideoFrame>* sink_ RTC_GUARDED_BY(crit_); rtc::VideoSinkInterface<VideoFrame>* sink_ RTC_GUARDED_BY(crit_);

View File

@ -554,9 +554,9 @@ class AdaptingFrameForwarder : public test::FrameForwarder {
void AddOrUpdateSink(rtc::VideoSinkInterface<VideoFrame>* sink, void AddOrUpdateSink(rtc::VideoSinkInterface<VideoFrame>* sink,
const rtc::VideoSinkWants& wants) override { const rtc::VideoSinkWants& wants) override {
rtc::CritScope cs(&crit_); rtc::CritScope cs(&crit_);
last_wants_ = sink_wants(); last_wants_ = sink_wants_locked();
adapter_.OnSinkWants(wants); adapter_.OnSinkWants(wants);
test::FrameForwarder::AddOrUpdateSink(sink, wants); test::FrameForwarder::AddOrUpdateSinkLocked(sink, wants);
} }
cricket::VideoAdapter adapter_; cricket::VideoAdapter adapter_;
bool adaptation_enabled_ RTC_GUARDED_BY(crit_); bool adaptation_enabled_ RTC_GUARDED_BY(crit_);