| // 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_H_ |
| #define MEDIA_GPU_ANDROID_ANDROID_VIDEO_SURFACE_CHOOSER_H_ |
| |
| #include "base/bind.h" |
| #include "base/macros.h" |
| #include "base/memory/weak_ptr.h" |
| #include "media/base/android/android_overlay.h" |
| #include "media/base/video_transformation.h" |
| #include "media/gpu/media_gpu_export.h" |
| #include "third_party/abseil-cpp/absl/types/optional.h" |
| #include "ui/gfx/geometry/rect.h" |
| |
| namespace media { |
| |
| // Manage details of which surface to use for video playback. |
| class MEDIA_GPU_EXPORT AndroidVideoSurfaceChooser { |
| public: |
| // Input state used for choosing the surface type. |
| struct State { |
| State(); |
| ~State(); |
| |
| // Is an overlay required? |
| bool is_required = false; |
| |
| // Is the player currently in fullscreen? |
| bool is_fullscreen = false; |
| |
| // Should the overlay be marked as secure? |
| bool is_secure = false; |
| |
| // Is the player's frame hidden / closed? |
| bool is_frame_hidden = false; |
| |
| // Is the compositor willing to promote this? |
| bool is_compositor_promotable = false; |
| |
| // Are we expecting a relayout soon? |
| bool is_expecting_relayout = false; |
| |
| // If true, then we will promote to overlay only if it's required for secure |
| // video playback. |
| bool promote_secure_only = false; |
| |
| // Default orientation for the video. |
| VideoRotation video_rotation = VIDEO_ROTATION_0; |
| |
| // Hint to use for the initial position when transitioning to an overlay. |
| gfx::Rect initial_position; |
| |
| // Indicates that we should always use a TextureOwner. This is used with |
| // SurfaceControl where the TextureOwner can be promoted to an overlay |
| // dynamically by the compositor. |
| bool always_use_texture_owner = false; |
| |
| // Is the video persistent (PIP)? |
| bool is_persistent_video = false; |
| }; |
| |
| // Notify the client that |overlay| is ready for use. The client may get |
| // the surface immediately. |
| using UseOverlayCB = |
| base::RepeatingCallback<void(std::unique_ptr<AndroidOverlay> overlay)>; |
| |
| // Notify the client that the most recently provided overlay should be |
| // discarded. The overlay is still valid, but we recommend against |
| // using it soon, in favor of a TextureOwner. |
| using UseTextureOwnerCB = base::RepeatingCallback<void(void)>; |
| |
| AndroidVideoSurfaceChooser() {} |
| |
| AndroidVideoSurfaceChooser(const AndroidVideoSurfaceChooser&) = delete; |
| AndroidVideoSurfaceChooser& operator=(const AndroidVideoSurfaceChooser&) = |
| delete; |
| |
| virtual ~AndroidVideoSurfaceChooser() {} |
| |
| // Sets the client callbacks to be called when a new surface choice is made. |
| // Must be called before UpdateState(); |
| virtual void SetClientCallbacks(UseOverlayCB use_overlay_cb, |
| UseTextureOwnerCB use_texture_owner_cb) = 0; |
| |
| // Updates the current state and makes a new surface choice with the new |
| // state. If |new_factory| is empty, the factory is left as-is. Otherwise, |
| // the factory is updated to |*new_factory|. |
| virtual void UpdateState(absl::optional<AndroidOverlayFactoryCB> new_factory, |
| const State& new_state) = 0; |
| }; |
| |
| } // namespace media |
| |
| #endif // MEDIA_GPU_ANDROID_ANDROID_VIDEO_SURFACE_CHOOSER_H_ |