| // Copyright 2019 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_FRAME_INFO_HELPER_H_ |
| #define MEDIA_GPU_ANDROID_FRAME_INFO_HELPER_H_ |
| |
| #include "media/gpu/android/shared_image_video_provider.h" |
| #include "media/gpu/media_gpu_export.h" |
| #include "third_party/abseil-cpp/absl/types/optional.h" |
| |
| namespace media { |
| class CodecOutputBufferRenderer; |
| |
| // Helper class to fetch YCbCrInfo for Vulkan from a CodecImage. |
| class MEDIA_GPU_EXPORT FrameInfoHelper { |
| public: |
| struct FrameInfo { |
| FrameInfo(); |
| ~FrameInfo(); |
| |
| FrameInfo(FrameInfo&&); |
| FrameInfo(const FrameInfo&); |
| FrameInfo& operator=(const FrameInfo&); |
| |
| gfx::Size coded_size; |
| gfx::Rect visible_rect; |
| absl::optional<gpu::VulkanYCbCrInfo> ycbcr_info; |
| }; |
| |
| using FrameInfoReadyCB = |
| base::OnceCallback<void(std::unique_ptr<CodecOutputBufferRenderer>, |
| FrameInfo)>; |
| |
| static std::unique_ptr<FrameInfoHelper> Create( |
| scoped_refptr<base::SequencedTaskRunner> gpu_task_runner, |
| SharedImageVideoProvider::GetStubCB get_stub_cb, |
| scoped_refptr<gpu::RefCountedLock> drdc_lock); |
| |
| virtual ~FrameInfoHelper() = default; |
| |
| // Call |cb| with the FrameInfo. Will render |buffer_renderer| to the front |
| // buffer if we don't have frame info cached. For Vulkan this also will |
| // attempt to get YCbCrInfo and cache it. If all necessary info is cached the |
| // call will leave buffer_renderer intact and it can be rendered later. |
| // Rendering can fail for reasons. This function will make best efforts to |
| // fill FrameInfo which can be used to create VideoFrame. |
| // |
| // Callbacks will be executed and on callers sequence and guaranteed to be |
| // called in order of GetFrameInfo calls. Callback can be called before this |
| // function returns if all necessary info is available right away. |
| // |
| // While this API might seem to be out of its Vulkan mind, it's this |
| // complicated to (a) prevent rendering frames out of order to the front |
| // buffer, and (b) make it easy to handle the fact that sometimes, we just |
| // can't get a YCbCrInfo from a CodecImage due to timeouts. |
| virtual void GetFrameInfo( |
| std::unique_ptr<CodecOutputBufferRenderer> buffer_renderer, |
| FrameInfoReadyCB callback) = 0; |
| |
| protected: |
| FrameInfoHelper() = default; |
| }; |
| |
| } // namespace media |
| |
| #endif // MEDIA_GPU_ANDROID_FRAME_INFO_HELPER_H_ |