/*
 *  Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#include <memory>
#include <utility>

#include "modules/desktop_capture/desktop_capture_options.h"
#include "modules/desktop_capture/desktop_capturer.h"
#include "modules/desktop_capture/rgba_color.h"
#include "modules/desktop_capture/win/window_capturer_win_gdi.h"
#include "rtc_base/logging.h"

#if defined(RTC_ENABLE_WIN_WGC)
#include "modules/desktop_capture/blank_detector_desktop_capturer_wrapper.h"
#include "modules/desktop_capture/fallback_desktop_capturer_wrapper.h"
#include "modules/desktop_capture/win/wgc_capturer_win.h"
#include "rtc_base/win/windows_version.h"
#endif  // defined(RTC_ENABLE_WIN_WGC)

namespace webrtc {

// static
std::unique_ptr<DesktopCapturer> DesktopCapturer::CreateRawWindowCapturer(
    const DesktopCaptureOptions& options) {
  RTC_LOG(LS_INFO) << "DesktopCapturer::CreateRawWindowCapturer "
                      "creates DesktopCapturer of type WindowCapturerWinGdi";
  std::unique_ptr<DesktopCapturer> capturer(
      WindowCapturerWinGdi::CreateRawWindowCapturer(options));
#if defined(RTC_ENABLE_WIN_WGC)
  if (options.allow_wgc_capturer_fallback() &&
      rtc_win::GetVersion() >= rtc_win::Version::VERSION_WIN11) {
    // BlankDectector capturer will send an error when it detects a failed
    // GDI rendering, then Fallback capturer will try to capture it again with
    // WGC.
    RTC_LOG(LS_INFO)
        << "DesktopCapturer::CreateRawWindowCapturer creates "
           "DesktopCapturer of type FallbackDesktopCapturerWrapper which has a "
           "fallback capturer of type WgcCapturerWin";
    capturer = std::make_unique<BlankDetectorDesktopCapturerWrapper>(
        std::move(capturer), RgbaColor(0, 0, 0, 0),
        /*check_per_capture*/ true);

    capturer = std::make_unique<FallbackDesktopCapturerWrapper>(
        std::move(capturer),
        WgcCapturerWin::CreateRawWindowCapturer(
            options, /*allow_delayed_capturable_check*/ true));
  }
#endif  // defined(RTC_ENABLE_WIN_WGC)
  return capturer;
}

}  // namespace webrtc
