| // Copyright 2020 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_VAAPI_TEST_SHARED_VA_SURFACE_H_ |
| #define MEDIA_GPU_VAAPI_TEST_SHARED_VA_SURFACE_H_ |
| |
| #include <va/va.h> |
| |
| #include "base/memory/ref_counted.h" |
| #include "ui/gfx/geometry/size.h" |
| |
| namespace media { |
| namespace vaapi_test { |
| |
| class VaapiDevice; |
| |
| constexpr unsigned int kInvalidVaRtFormat = 0u; |
| |
| // Provides a wrapper around a VASurface that properly handles creation and |
| // destruction. |
| // The associated VaapiDevice must be guaranteed externally to be alive beyond |
| // the lifetime of the SharedVASurface. |
| class SharedVASurface : public base::RefCounted<SharedVASurface> { |
| public: |
| // How to fetch image data from a SharedVASurface. |
| enum class FetchPolicy { |
| // Fetch the data by attempting all policies in the order listed below. |
| kAny, |
| |
| // Use vaDeriveImage. Deriving to unsupported formats results in failure. |
| // NB: vaDeriveImage may succeed but fetch garbage output in AMD. |
| kDeriveImage, |
| |
| // Use vaCreateImage + vaGetImage. Requires a target format. |
| kGetImage, |
| }; |
| |
| // Constructs a VASurface with given |size| and |attribute|. |
| static scoped_refptr<SharedVASurface> Create(const VaapiDevice& va_device, |
| unsigned int va_rt_format, |
| const gfx::Size& size, |
| VASurfaceAttrib attribute); |
| |
| // Saves this surface into a png at the given |path|, retrieving the image |
| // as specified by |fetch_policy|. |
| void SaveAsPNG(FetchPolicy fetch_policy, const std::string& path) const; |
| |
| // Computes the MD5 sum of this surface and returns it as a human-readable hex |
| // string. |
| std::string GetMD5Sum(FetchPolicy fetch_policy) const; |
| |
| VASurfaceID id() const { return id_; } |
| const gfx::Size& size() const { return size_; } |
| unsigned int va_rt_format() const { return va_rt_format_; } |
| |
| private: |
| friend class base::RefCounted<SharedVASurface>; |
| |
| SharedVASurface(const VaapiDevice& va_device, |
| VASurfaceID id, |
| const gfx::Size& size, |
| unsigned int format); |
| |
| SharedVASurface(const SharedVASurface&) = delete; |
| SharedVASurface& operator=(const SharedVASurface&) = delete; |
| ~SharedVASurface(); |
| |
| // Fetch the image data from this SharedVASurface with |fetch_policy|. |
| // |format| may be ignored if |fetch_policy| specifies derivation which |
| // succeeds to a supported format. |
| void FetchData(FetchPolicy fetch_policy, |
| const VAImageFormat& format, |
| VAImage* image, |
| uint8_t** image_data) const; |
| |
| // Non-owned. |
| const VaapiDevice& va_device_; |
| |
| const VASurfaceID id_; |
| const gfx::Size size_; |
| const unsigned int va_rt_format_; |
| }; |
| |
| } // namespace vaapi_test |
| } // namespace media |
| |
| #endif // MEDIA_GPU_VAAPI_TEST_SHARED_VA_SURFACE_H_ |