/*
 *  Copyright (c) 2017 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.
 */

#ifndef MODULES_DESKTOP_CAPTURE_CAPTURE_RESULT_DESKTOP_CAPTURER_WRAPPER_H_
#define MODULES_DESKTOP_CAPTURE_CAPTURE_RESULT_DESKTOP_CAPTURER_WRAPPER_H_

#include <memory>

#include "modules/desktop_capture/desktop_capturer.h"
#include "modules/desktop_capture/desktop_capturer_wrapper.h"

namespace webrtc {

// A DesktopCapturerWrapper implementation to capture the result of
// |base_capturer|. Derived classes are expected to provide a ResultObserver
// implementation to observe the DesktopFrame returned by |base_capturer_|.
class CaptureResultDesktopCapturerWrapper
    : public DesktopCapturerWrapper,
      public DesktopCapturer::Callback {
 public:
  using Callback = DesktopCapturer::Callback;

  // Provides a way to let derived classes or clients to modify the result
  // returned by |base_capturer_|.
  class ResultObserver {
   public:
    ResultObserver();
    virtual ~ResultObserver();

    virtual void Observe(Result* result,
                         std::unique_ptr<DesktopFrame>* frame) = 0;
  };

  // |observer| must outlive this instance and can be |this|. |observer| is
  // guaranteed to be executed only after the constructor and before the
  // destructor.
  CaptureResultDesktopCapturerWrapper(
      std::unique_ptr<DesktopCapturer> base_capturer,
      ResultObserver* observer);

  ~CaptureResultDesktopCapturerWrapper() override;

  // DesktopCapturer implementations.
  void Start(Callback* callback) final;

 private:
  // DesktopCapturer::Callback implementation.
  void OnCaptureResult(Result result,
                       std::unique_ptr<DesktopFrame> frame) final;

  ResultObserver* const observer_;
  Callback* callback_ = nullptr;
};

}  // namespace webrtc

#endif  // MODULES_DESKTOP_CAPTURE_CAPTURE_RESULT_DESKTOP_CAPTURER_WRAPPER_H_
