| // 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_ |