blob: d1fa138a00480e8cfb7800497013a9044c81be82 [file] [log] [blame]
// 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_ANDROID_VIDEO_SURFACE_CHOOSER_IMPL_H_
#define MEDIA_GPU_ANDROID_ANDROID_VIDEO_SURFACE_CHOOSER_IMPL_H_
#include "base/bind.h"
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
#include "base/time/tick_clock.h"
#include "base/time/time.h"
#include "media/base/android/android_overlay.h"
#include "media/gpu/android/android_video_surface_chooser.h"
#include "media/gpu/media_gpu_export.h"
namespace media {
// Implementation of AndroidVideoSurfaceChooser.
class MEDIA_GPU_EXPORT AndroidVideoSurfaceChooserImpl
: public AndroidVideoSurfaceChooser {
public:
// |allow_dynamic| should be true if and only if we are allowed to change the
// surface selection after the initial callback. |tick_clock|, if provided,
// will be used as our time source. Otherwise, we'll use wall clock. If
// provided, then it must outlast |this|.
AndroidVideoSurfaceChooserImpl(bool allow_dynamic,
const base::TickClock* tick_clock = nullptr);
AndroidVideoSurfaceChooserImpl(const AndroidVideoSurfaceChooserImpl&) =
delete;
AndroidVideoSurfaceChooserImpl& operator=(
const AndroidVideoSurfaceChooserImpl&) = delete;
~AndroidVideoSurfaceChooserImpl() override;
// AndroidVideoSurfaceChooser
void SetClientCallbacks(UseOverlayCB use_overlay_cb,
UseTextureOwnerCB use_texture_owner_cb) override;
void UpdateState(absl::optional<AndroidOverlayFactoryCB> new_factory,
const State& new_state) override;
private:
// Choose whether we should be using a TextureOwner or overlay, and issue
// the right callbacks if we're changing between them. This should only be
// called if |allow_dynamic_|.
void Choose();
// Start switching to TextureOwner or overlay, as needed. These will call
// the client callbacks if we're changing state, though those callbacks might
// happen after this returns.
void SwitchToTextureOwner();
// If |overlay_| has an in-flight request, then this will do nothing. If
// |power_efficient|, then we will require a power-efficient overlay, and
// cancel it if it becomes not power efficient.
void SwitchToOverlay(bool power_efficient);
// AndroidOverlay callbacks.
void OnOverlayReady(AndroidOverlay*);
void OnOverlayFailed(AndroidOverlay*);
void OnOverlayDeleted(AndroidOverlay*);
void OnPowerEfficientState(AndroidOverlay* overlay, bool is_power_efficient);
// Client callbacks.
UseOverlayCB use_overlay_cb_;
UseTextureOwnerCB use_texture_owner_cb_;
// Current overlay that we've constructed but haven't received ready / failed
// callbacks yet. Will be nullptr if we haven't constructed one, or if we
// sent it to the client already once it became ready to use.
std::unique_ptr<AndroidOverlay> overlay_;
AndroidOverlayFactoryCB overlay_factory_;
// Do we allow dynamic surface switches. Usually this means "Are we running
// on M or later?".
bool allow_dynamic_;
enum OverlayState {
kUnknown,
kUsingTextureOwner,
kUsingOverlay,
};
// What was the last signal that the client received?
OverlayState client_overlay_state_ = kUnknown;
State current_state_;
bool initial_state_received_ = false;
// Not owned by us.
const base::TickClock* tick_clock_;
// Time at which we most recently got a failed overlay request.
base::TimeTicks most_recent_overlay_failure_;
base::WeakPtrFactory<AndroidVideoSurfaceChooserImpl> weak_factory_{this};
};
} // namespace media
#endif // MEDIA_GPU_ANDROID_ANDROID_VIDEO_SURFACE_CHOOSER_IMPL_H_