| // 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_SURFACE_CHOOSER_HELPER_H_ |
| #define MEDIA_GPU_ANDROID_SURFACE_CHOOSER_HELPER_H_ |
| |
| #include <memory> |
| |
| #include "base/macros.h" |
| #include "base/time/time.h" |
| #include "media/base/video_transformation.h" |
| #include "media/gpu/android/android_video_surface_chooser.h" |
| #include "media/gpu/android/promotion_hint_aggregator.h" |
| #include "media/gpu/media_gpu_export.h" |
| #include "third_party/abseil-cpp/absl/types/optional.h" |
| |
| namespace base { |
| class TickClock; |
| } |
| |
| namespace media { |
| |
| // Helper class to manage state transitions for SurfaceChooser::State. It's |
| // complicated and standalone enough not to be part of SurfaceChooser itself. |
| class MEDIA_GPU_EXPORT SurfaceChooserHelper { |
| public: |
| // |promotion_hint_aggregator| and |tick_clock| are for tests. Normally, we |
| // create the correct default implementations ourself. |
| // |is_overlay_required| tells us to require overlays(!). |
| // |promote_secure_only| causes us to use overlays only if required for secure |
| // video playback. |
| // |always_use_texture_owner| forces us to always use a texture owner, |
| // completely ignoring all other conditions. |
| SurfaceChooserHelper( |
| std::unique_ptr<AndroidVideoSurfaceChooser> surface_chooser, |
| bool is_overlay_required, |
| bool promote_secure_only, |
| bool always_use_texture_owner, |
| std::unique_ptr<PromotionHintAggregator> promotion_hint_aggregator = |
| nullptr, |
| const base::TickClock* tick_clock = nullptr); |
| |
| SurfaceChooserHelper(const SurfaceChooserHelper&) = delete; |
| SurfaceChooserHelper& operator=(const SurfaceChooserHelper&) = delete; |
| |
| ~SurfaceChooserHelper(); |
| |
| enum class SecureSurfaceMode { |
| // The surface should not be secure. This allows both overlays and |
| // TextureOwner surfaces. |
| kInsecure, |
| |
| // It is preferable to have a secure surface, but insecure |
| // (TextureOwner) is better than failing. |
| kRequested, |
| |
| // The surface must be a secure surface, and should fail otherwise. |
| kRequired, |
| }; |
| |
| // Must match AVDAFrameInformation UMA enum. Please do not remove or re-order |
| // values, only append new ones. |
| enum class FrameInformation { |
| NON_OVERLAY_INSECURE = 0, |
| NON_OVERLAY_L3 = 1, |
| OVERLAY_L3 = 2, |
| OVERLAY_L1 = 3, |
| OVERLAY_INSECURE_PLAYER_ELEMENT_FULLSCREEN = 4, |
| OVERLAY_INSECURE_NON_PLAYER_ELEMENT_FULLSCREEN = 5, |
| |
| // Max enum value. |
| FRAME_INFORMATION_MAX = OVERLAY_INSECURE_NON_PLAYER_ELEMENT_FULLSCREEN |
| }; |
| |
| // The setters do not update the chooser state, since pre-M requires us to be |
| // careful about the first update, since we can't change it later. |
| |
| // Notify us about the desired surface security. Does not update the chooser |
| // state. |
| void SetSecureSurfaceMode(SecureSurfaceMode mode); |
| |
| // Notify us about the fullscreen state. Does not update the chooser state. |
| void SetIsFullscreen(bool is_fullscreen); |
| |
| // Notify us about the default rotation for the video. |
| void SetVideoRotation(VideoRotation video_rotation); |
| |
| // Notify us about PIP state. |
| void SetIsPersistentVideo(bool is_persistent_video); |
| |
| // Update the chooser state using the given factory. |
| void UpdateChooserState(absl::optional<AndroidOverlayFactoryCB> new_factory); |
| |
| // Notify us about a promotion hint. This will update the chooser state |
| // if needed. |
| void NotifyPromotionHintAndUpdateChooser( |
| const PromotionHintAggregator::Hint& hint, |
| bool is_using_overlay); |
| |
| AndroidVideoSurfaceChooser* chooser() const { return surface_chooser_.get(); } |
| |
| // Return the FrameInformation bucket number that the config reflects, given |
| // that |is_using_overlay| reflects whether we're currently using an overlay |
| // or not. |
| FrameInformation ComputeFrameInformation(bool is_using_overlay); |
| |
| private: |
| AndroidVideoSurfaceChooser::State surface_chooser_state_; |
| std::unique_ptr<AndroidVideoSurfaceChooser> surface_chooser_; |
| |
| // Are overlays required by command-line options? |
| bool is_overlay_required_ = false; |
| |
| // Do we require an overlay due to the surface mode? |
| bool requires_secure_video_surface_ = false; |
| |
| std::unique_ptr<PromotionHintAggregator> promotion_hint_aggregator_; |
| |
| // Time since we last updated the chooser state. |
| base::TimeTicks most_recent_chooser_retry_; |
| |
| const base::TickClock* tick_clock_; |
| |
| // Number of promotion hints that we need to receive before clearing the |
| // "delay overlay promotion" flag in |surface_chooser_state_|. We do this so |
| // that the transition looks better, since it gives blink time to stabilize. |
| // Since overlay positioning isn't synchronous, it's good to make sure that |
| // blink isn't moving the quad around too. |
| int hints_until_clear_relayout_flag_ = 0; |
| }; |
| |
| } // namespace media |
| |
| #endif // MEDIA_GPU_ANDROID_SURFACE_CHOOSER_HELPER_H_ |