// Copyright 2013 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // // This file contains an implementation of VaapiWrapper, used by // VaapiVideoDecodeAccelerator and VaapiH264Decoder for decode, // and VaapiVideoEncodeAccelerator for encode, to interface // with libva (VA-API library for hardware video codec). #ifndef MEDIA_GPU_VAAPI_VAAPI_WRAPPER_H_ #define MEDIA_GPU_VAAPI_VAAPI_WRAPPER_H_ #include <stddef.h> #include <stdint.h> #include <va/va.h> #include <map> #include <memory> #include <optional> #include <set> #include <vector> #include "base/atomic_ref_count.h" #include "base/files/file.h" #include "base/gtest_prod_util.h" #include "base/memory/raw_ptr.h" #include "base/memory/ref_counted.h" #include "base/memory/scoped_refptr.h" #include "base/synchronization/lock.h" #include "base/thread_annotations.h" #include "base/types/expected.h" #include "build/chromeos_buildflags.h" #include "media/gpu/chromeos/fourcc.h" #include "media/gpu/media_gpu_export.h" #include "media/gpu/vaapi/vaapi_utils.h" #include "media/video/video_decode_accelerator.h" #include "media/video/video_encode_accelerator.h" #include "ui/gfx/geometry/size.h" namespace gfx { enum class BufferFormat : uint8_t; class NativePixmap; class NativePixmapDmaBuf; class Rect; } #define MAYBE_ASSERT_ACQUIRED(lock) … #if DCHECK_IS_ON() #define VAAPI_CHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker) … #else #define VAAPI_CHECK_CALLED_ON_VALID_SEQUENCE … #endif namespace media { constexpr unsigned int kInvalidVaRtFormat = …; class VADisplayStateSingleton; class VideoFrame; class FrameResource; // Enum, function and callback type to allow VaapiWrapper to log errors in VA // function calls executed on behalf of its owner. |histogram_name| is prebound // to allow for disinguishing such owners. enum class VaapiFunctions; void ReportVaapiErrorToUMA(const std::string& histogram_name, VaapiFunctions value); ReportErrorToUMACB; // This struct holds a NativePixmapDmaBuf, usually the result of exporting a VA // surface, and some associated size information needed to tell clients about // the underlying buffer. struct NativePixmapAndSizeInfo { … }; enum class VAImplementation { … }; // A VADisplayStateHandle is somewhat like a scoped_refptr for a // VADisplayStateSingleton (an internal class used to keep track of a singleton // VADisplay). As long as a non-null VADisplayStateHandle exists, the underlying // VADisplay is initialized and can be used. When the last non-null // VADisplayStateHandle is destroyed, the underlying VADisplay is cleaned up. // // Unlike a scoped_refptr, a VADisplayStateHandle is move-only. // // Note: a VADisplayStateHandle instance is thread- and sequence-safe, but the // underlying VADisplay may need protection. See the comments for the // VADisplayStateSingleton documentation. class VADisplayStateHandle { … }; // This class handles VA-API calls and ensures proper locking of VA-API calls // to libva, the userspace shim to the HW codec driver. The thread safety of // libva depends on the backend. If the backend is not thread-safe, we need to // maintain a global lock that guards all libva calls. This class is fully // synchronous and its constructor, all of its methods, and its destructor must // be called on the same sequence. These methods may wait on the |va_lock_| // which guards libva calls across all VaapiWrapper instances and other libva // call sites. If the backend is known to be thread safe and the // |kGlobalVaapiLock| flag is disabled, |va_lock_| will be null and won't guard // any libva calls. // // This class is responsible for managing VAAPI connection, contexts and state. // It is also responsible for managing and freeing VABuffers (not VASurfaces), // which are used to queue parameters and slice data to the HW codec, // as well as underlying memory for VASurfaces themselves. class MEDIA_GPU_EXPORT VaapiWrapper : public base::RefCountedThreadSafe<VaapiWrapper> { … }; } // namespace media #endif // MEDIA_GPU_VAAPI_VAAPI_WRAPPER_H_