Implement IsOccluded() in each DesktopCapturer implementation

This change implements IsOccluded() function in each DesktopCapturer
implementation.

This change was reviewed at
https://chromium-review.googlesource.com/c/external/webrtc/+/660817.

Bug: webrtc:7950
Change-Id: Ie4d49b2bfcf5f0da1576f47b752a51ec494442ad
TBR: jamiewalch@chromium.org
Reviewed-on: https://webrtc-review.googlesource.com/1400
Reviewed-by: Zijie He <zijiehe@google.com>
Commit-Queue: Zijie He <zijiehe@google.com>
Cr-Original-Commit-Position: refs/heads/master@{#19840}
Cr-Mirrored-From: https://webrtc.googlesource.com/src
Cr-Mirrored-Commit: 9cad5016a3e1b2e09dfe05ea24c50fa4327a4384
diff --git a/modules/desktop_capture/cropping_window_capturer.cc b/modules/desktop_capture/cropping_window_capturer.cc
index a0f89f6..494047d 100644
--- a/modules/desktop_capture/cropping_window_capturer.cc
+++ b/modules/desktop_capture/cropping_window_capturer.cc
@@ -100,6 +100,17 @@
       CreateCroppedDesktopFrame(std::move(screen_frame), window_rect));
 }
 
+bool CroppingWindowCapturer::IsOccluded(const DesktopVector& pos) {
+  // Returns true if either capturer returns true.
+  if (window_capturer_->IsOccluded(pos)) {
+    return true;
+  }
+  if (screen_capturer_ != nullptr && screen_capturer_->IsOccluded(pos)) {
+    return true;
+  }
+  return false;
+}
+
 #if !defined(WEBRTC_WIN)
 // CroppingWindowCapturer is implemented only for windows. On other platforms
 // the regular window capturer is used.
diff --git a/modules/desktop_capture/cropping_window_capturer.h b/modules/desktop_capture/cropping_window_capturer.h
index b8b2751..3542fbd 100644
--- a/modules/desktop_capture/cropping_window_capturer.h
+++ b/modules/desktop_capture/cropping_window_capturer.h
@@ -38,6 +38,7 @@
   bool GetSourceList(SourceList* sources) override;
   bool SelectSource(SourceId id) override;
   bool FocusOnSelectedSource() override;
+  bool IsOccluded(const DesktopVector& pos) override;
 
   // DesktopCapturer::Callback implementation, passed to |screen_capturer_| to
   // intercept the capture result.
diff --git a/modules/desktop_capture/desktop_capturer_differ_wrapper.cc b/modules/desktop_capture/desktop_capturer_differ_wrapper.cc
index 8a93bc1..3bf4c53 100644
--- a/modules/desktop_capture/desktop_capturer_differ_wrapper.cc
+++ b/modules/desktop_capture/desktop_capturer_differ_wrapper.cc
@@ -181,6 +181,10 @@
   return base_capturer_->FocusOnSelectedSource();
 }
 
+bool DesktopCapturerDifferWrapper::IsOccluded(const DesktopVector& pos) {
+  return base_capturer_->IsOccluded(pos);
+}
+
 void DesktopCapturerDifferWrapper::OnCaptureResult(
     Result result,
     std::unique_ptr<DesktopFrame> input_frame) {
diff --git a/modules/desktop_capture/desktop_capturer_differ_wrapper.h b/modules/desktop_capture/desktop_capturer_differ_wrapper.h
index 0747a4e..1d037a1 100644
--- a/modules/desktop_capture/desktop_capturer_differ_wrapper.h
+++ b/modules/desktop_capture/desktop_capturer_differ_wrapper.h
@@ -45,6 +45,7 @@
   bool GetSourceList(SourceList* screens) override;
   bool SelectSource(SourceId id) override;
   bool FocusOnSelectedSource() override;
+  bool IsOccluded(const DesktopVector& pos) override;
 
  private:
   // DesktopCapturer::Callback interface.
diff --git a/modules/desktop_capture/fallback_desktop_capturer_wrapper.cc b/modules/desktop_capture/fallback_desktop_capturer_wrapper.cc
index e6fa9d5..6ae046e 100644
--- a/modules/desktop_capture/fallback_desktop_capturer_wrapper.cc
+++ b/modules/desktop_capture/fallback_desktop_capturer_wrapper.cc
@@ -149,6 +149,15 @@
          secondary_capturer_->FocusOnSelectedSource();
 }
 
+bool FallbackDesktopCapturerWrapper::IsOccluded(const DesktopVector& pos) {
+  // Returns true if either capturer returns true.
+  if (main_capturer_permanent_error_) {
+    return secondary_capturer_->IsOccluded(pos);
+  }
+  return main_capturer_->IsOccluded(pos) ||
+         secondary_capturer_->IsOccluded(pos);
+}
+
 void FallbackDesktopCapturerWrapper::OnCaptureResult(
     Result result,
     std::unique_ptr<DesktopFrame> frame) {
diff --git a/modules/desktop_capture/fallback_desktop_capturer_wrapper.h b/modules/desktop_capture/fallback_desktop_capturer_wrapper.h
index b6436ce..8e79026 100644
--- a/modules/desktop_capture/fallback_desktop_capturer_wrapper.h
+++ b/modules/desktop_capture/fallback_desktop_capturer_wrapper.h
@@ -44,6 +44,7 @@
   bool GetSourceList(SourceList* sources) override;
   bool SelectSource(SourceId id) override;
   bool FocusOnSelectedSource() override;
+  bool IsOccluded(const DesktopVector& pos) override;
 
  private:
   // DesktopCapturer::Callback interface.