blob: 5325c31aa97ae33823157538cf803bc5d000d19c [file] [log] [blame]
// 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_