// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef MEDIA_GPU_ANDROID_PROMOTION_HINT_AGGREGATOR_H_
#define MEDIA_GPU_ANDROID_PROMOTION_HINT_AGGREGATOR_H_

#include "base/bind.h"
#include "base/callback.h"
#include "base/macros.h"
#include "media/gpu/media_gpu_export.h"
#include "ui/gfx/geometry/rect.h"

namespace media {

// Receive lots of promotion hints, and aggregate them into a single signal.  A
// promotion hint is feedback from the compositor about whether a quad could be
// promoted to an overlay, or whether the compositor would refuse to do so.
// For example, the compositor won't promote a quad that's rotated, since an
// overlay can't do that.
class MEDIA_GPU_EXPORT PromotionHintAggregator {
 public:
  struct Hint {
    Hint(const gfx::Rect& _screen_rect, bool _is_promotable)
        : screen_rect(_screen_rect), is_promotable(_is_promotable) {}
    gfx::Rect screen_rect;
    bool is_promotable = false;

    bool operator==(const Hint& other) const {
      return other.screen_rect == screen_rect &&
             other.is_promotable == is_promotable;
    }
  };

  // Pass the hint by value to permit thread-hopping callbacks.
  using NotifyPromotionHintCB = base::RepeatingCallback<void(Hint hint)>;

  virtual ~PromotionHintAggregator() = default;

  // Notify us that an image has / would be drawn with the given hint.
  virtual void NotifyPromotionHint(const Hint& hint) = 0;

  // Returns true if and only if it's probably okay to promote the video.
  virtual bool IsSafeToPromote() = 0;
};

}  // namespace media

#endif  // MEDIA_GPU_ANDROID_PROMOTION_HINT_AGGREGATOR_H_
