Index: content/common/gpu/media/vaapi_wrapper.h |
diff --git a/content/common/gpu/media/vaapi_wrapper.h b/content/common/gpu/media/vaapi_wrapper.h |
deleted file mode 100644 |
index 4394bc36b928ebf12d39b8bbb4a22af738bf8537..0000000000000000000000000000000000000000 |
--- a/content/common/gpu/media/vaapi_wrapper.h |
+++ /dev/null |
@@ -1,398 +0,0 @@ |
-// Copyright 2013 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. |
-// |
-// 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 CONTENT_COMMON_GPU_MEDIA_VAAPI_WRAPPER_H_ |
-#define CONTENT_COMMON_GPU_MEDIA_VAAPI_WRAPPER_H_ |
- |
-#include <stddef.h> |
-#include <stdint.h> |
- |
-#include <set> |
-#include <vector> |
- |
-#include "base/files/file.h" |
-#include "base/lazy_instance.h" |
-#include "base/macros.h" |
-#include "base/memory/ref_counted.h" |
-#include "base/synchronization/lock.h" |
-#include "content/common/content_export.h" |
-#include "content/common/gpu/media/va_surface.h" |
-#include "media/base/video_decoder_config.h" |
-#include "media/base/video_frame.h" |
-#include "media/video/jpeg_decode_accelerator.h" |
-#include "media/video/video_decode_accelerator.h" |
-#include "media/video/video_encode_accelerator.h" |
-#include "third_party/libva/va/va.h" |
-#include "third_party/libva/va/va_vpp.h" |
-#include "ui/gfx/geometry/size.h" |
-#if defined(USE_X11) |
-#include "third_party/libva/va/va_x11.h" |
-#endif // USE_X11 |
- |
-#if defined(USE_OZONE) |
-namespace ui { |
-class NativePixmap; |
-} |
-#endif |
- |
-namespace content { |
- |
-// This class handles VA-API calls and ensures proper locking of VA-API calls |
-// to libva, the userspace shim to the HW codec driver. libva is not |
-// thread-safe, so we have to perform locking ourselves. This class is fully |
-// synchronous and its methods can be called from any thread and may wait on |
-// the va_lock_ while other, concurrent calls run. |
-// |
-// 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 CONTENT_EXPORT VaapiWrapper |
- : public base::RefCountedThreadSafe<VaapiWrapper> { |
- public: |
- enum CodecMode { |
- kDecode, |
- kEncode, |
- kCodecModeMax, |
- }; |
- |
- // Return an instance of VaapiWrapper initialized for |va_profile| and |
- // |mode|. |report_error_to_uma_cb| will be called independently from |
- // reporting errors to clients via method return values. |
- static scoped_refptr<VaapiWrapper> Create( |
- CodecMode mode, |
- VAProfile va_profile, |
- const base::Closure& report_error_to_uma_cb); |
- |
- // Create VaapiWrapper for VideoCodecProfile. It maps VideoCodecProfile |
- // |profile| to VAProfile. |
- // |report_error_to_uma_cb| will be called independently from reporting |
- // errors to clients via method return values. |
- static scoped_refptr<VaapiWrapper> CreateForVideoCodec( |
- CodecMode mode, |
- media::VideoCodecProfile profile, |
- const base::Closure& report_error_to_uma_cb); |
- |
- // Return the supported video encode profiles. |
- static media::VideoEncodeAccelerator::SupportedProfiles |
- GetSupportedEncodeProfiles(); |
- |
- // Return the supported video decode profiles. |
- static media::VideoDecodeAccelerator::SupportedProfiles |
- GetSupportedDecodeProfiles(); |
- |
- // Return true when JPEG decode is supported. |
- static bool IsJpegDecodeSupported(); |
- |
- // Create |num_surfaces| backing surfaces in driver for VASurfaces of |
- // |va_format|, each of size |size|. Returns true when successful, with the |
- // created IDs in |va_surfaces| to be managed and later wrapped in |
- // VASurfaces. |
- // The client must DestroySurfaces() each time before calling this method |
- // again to free the allocated surfaces first, but is not required to do so |
- // at destruction time, as this will be done automatically from |
- // the destructor. |
- bool CreateSurfaces(unsigned int va_format, |
- const gfx::Size& size, |
- size_t num_surfaces, |
- std::vector<VASurfaceID>* va_surfaces); |
- |
- // Free all memory allocated in CreateSurfaces. |
- void DestroySurfaces(); |
- |
- // Create a VASurface of |va_format|, |size| and using |va_attribs| |
- // attributes. The ownership of the surface is transferred to the |
- // caller. It differs from surfaces created using CreateSurfaces(), |
- // where VaapiWrapper is the owner of the surfaces. |
- scoped_refptr<VASurface> CreateUnownedSurface( |
- unsigned int va_format, |
- const gfx::Size& size, |
- const std::vector<VASurfaceAttrib>& va_attribs); |
- |
-#if defined(USE_OZONE) |
- // Create a VASurface for |pixmap|. The ownership of the surface is |
- // transferred to the caller. It differs from surfaces created using |
- // CreateSurfaces(), where VaapiWrapper is the owner of the surfaces. |
- scoped_refptr<VASurface> CreateVASurfaceForPixmap( |
- const scoped_refptr<ui::NativePixmap>& pixmap); |
- |
- // Use VPP to process |source_pixmap| to |target_pixmap| with scaling and |
- // color space conversion. |
- bool ProcessPixmap(const scoped_refptr<ui::NativePixmap>& source_pixmap, |
- scoped_refptr<ui::NativePixmap> target_pixmap); |
- |
-#endif |
- |
- // Submit parameters or slice data of |va_buffer_type|, copying them from |
- // |buffer| of size |size|, into HW codec. The data in |buffer| is no |
- // longer needed and can be freed after this method returns. |
- // Data submitted via this method awaits in the HW codec until |
- // ExecuteAndDestroyPendingBuffers() is called to execute or |
- // DestroyPendingBuffers() is used to cancel a pending job. |
- bool SubmitBuffer(VABufferType va_buffer_type, size_t size, void* buffer); |
- |
- // Submit a VAEncMiscParameterBuffer of given |misc_param_type|, copying its |
- // data from |buffer| of size |size|, into HW codec. The data in |buffer| is |
- // no longer needed and can be freed after this method returns. |
- // Data submitted via this method awaits in the HW codec until |
- // ExecuteAndDestroyPendingBuffers() is called to execute or |
- // DestroyPendingBuffers() is used to cancel a pending job. |
- bool SubmitVAEncMiscParamBuffer(VAEncMiscParameterType misc_param_type, |
- size_t size, |
- void* buffer); |
- |
- // Cancel and destroy all buffers queued to the HW codec via SubmitBuffer(). |
- // Useful when a pending job is to be cancelled (on reset or error). |
- void DestroyPendingBuffers(); |
- |
- // Execute job in hardware on target |va_surface_id| and destroy pending |
- // buffers. Return false if Execute() fails. |
- bool ExecuteAndDestroyPendingBuffers(VASurfaceID va_surface_id); |
- |
-#if defined(USE_X11) |
- // Put data from |va_surface_id| into |x_pixmap| of size |
- // |dest_size|, converting/scaling to it. |
- bool PutSurfaceIntoPixmap(VASurfaceID va_surface_id, |
- Pixmap x_pixmap, |
- gfx::Size dest_size); |
-#endif // USE_X11 |
- |
- // Get a VAImage from a VASurface and map it into memory. The size and format |
- // are derived from the surface. Use GetVaImage() instead if |format| or |
- // |size| are different from surface internal representation. The VAImage |
- // should be released using the ReturnVaImage function. Returns true when |
- // successful. |
- bool GetDerivedVaImage(VASurfaceID va_surface_id, VAImage* image, void** mem); |
- |
- // Get a VAImage from a VASurface |va_surface_id| and map it into memory with |
- // given |format| and |size|. The output is |image| and the mapped memory is |
- // |mem|. If |format| doesn't equal to the internal format, the underlying |
- // implementation will do format conversion if supported. |size| should be |
- // smaller than or equal to the surface. If |size| is smaller, the image will |
- // be cropped. The VAImage should be released using the ReturnVaImage |
- // function. Returns true when successful. |
- bool GetVaImage(VASurfaceID va_surface_id, |
- VAImageFormat* format, |
- const gfx::Size& size, |
- VAImage* image, |
- void** mem); |
- |
- // Release the VAImage (and the associated memory mapping) obtained from |
- // GetVaImage() or GetDerivedVaImage(). |
- void ReturnVaImage(VAImage* image); |
- |
- // Upload contents of |frame| into |va_surface_id| for encode. |
- bool UploadVideoFrameToSurface(const scoped_refptr<media::VideoFrame>& frame, |
- VASurfaceID va_surface_id); |
- |
- // Create a buffer of |size| bytes to be used as encode output. |
- bool CreateCodedBuffer(size_t size, VABufferID* buffer_id); |
- |
- // Download the contents of the buffer with given |buffer_id| into a buffer of |
- // size |target_size|, pointed to by |target_ptr|. The number of bytes |
- // downloaded will be returned in |coded_data_size|. |sync_surface_id| will |
- // be used as a sync point, i.e. it will have to become idle before starting |
- // the download. |sync_surface_id| should be the source surface passed |
- // to the encode job. |
- bool DownloadAndDestroyCodedBuffer(VABufferID buffer_id, |
- VASurfaceID sync_surface_id, |
- uint8_t* target_ptr, |
- size_t target_size, |
- size_t* coded_data_size); |
- |
- // Destroy all previously-allocated (and not yet destroyed) coded buffers. |
- void DestroyCodedBuffers(); |
- |
- // Blits a VASurface |va_surface_src| into another VASurface |
- // |va_surface_dest| applying pixel format conversion and scaling |
- // if needed. |
- bool BlitSurface(const scoped_refptr<VASurface>& va_surface_src, |
- const scoped_refptr<VASurface>& va_surface_dest); |
- |
- // Initialize static data before sandbox is enabled. |
- static void PreSandboxInitialization(); |
- |
- // Get the created surfaces format. |
- unsigned int va_surface_format() const { return va_surface_format_; } |
- |
- private: |
- friend class base::RefCountedThreadSafe<VaapiWrapper>; |
- |
- struct ProfileInfo { |
- VAProfile va_profile; |
- gfx::Size max_resolution; |
- }; |
- |
- class LazyProfileInfos { |
- public: |
- LazyProfileInfos(); |
- ~LazyProfileInfos(); |
- std::vector<ProfileInfo> GetSupportedProfileInfosForCodecMode( |
- CodecMode mode); |
- bool IsProfileSupported(CodecMode mode, VAProfile va_profile); |
- |
- private: |
- std::vector<ProfileInfo> supported_profiles_[kCodecModeMax]; |
- }; |
- |
- class VADisplayState { |
- public: |
- VADisplayState(); |
- ~VADisplayState(); |
- |
- // |va_lock_| must be held on entry. |
- bool Initialize(); |
- void Deinitialize(VAStatus* status); |
- |
- base::Lock* va_lock() { return &va_lock_; } |
- VADisplay va_display() const { return va_display_; } |
- |
-#if defined(USE_OZONE) |
- void SetDrmFd(base::PlatformFile fd); |
-#endif // USE_OZONE |
- |
- private: |
- friend class base::LazyInstance<VADisplayState>; |
- |
- // Returns true if the VAAPI version is less than the specified version. |
- bool VAAPIVersionLessThan(int major, int minor); |
- |
- // Protected by |va_lock_|. |
- int refcount_; |
- |
- // Libva is not thread safe, so we have to do locking for it ourselves. |
- // This lock is to be taken for the duration of all VA-API calls and for |
- // the entire job submission sequence in ExecuteAndDestroyPendingBuffers(). |
- base::Lock va_lock_; |
- |
-#if defined(USE_OZONE) |
- // Drm fd used to obtain access to the driver interface by VA. |
- base::ScopedFD drm_fd_; |
-#endif // USE_OZONE |
- |
- // The VADisplay handle. |
- VADisplay va_display_; |
- |
- // The VAAPI version. |
- int major_version_, minor_version_; |
- |
- // True if vaInitialize has been called successfully. |
- bool va_initialized_; |
- }; |
- |
- VaapiWrapper(); |
- ~VaapiWrapper(); |
- |
- bool Initialize(CodecMode mode, VAProfile va_profile); |
- void Deinitialize(); |
- bool VaInitialize(const base::Closure& report_error_to_uma_cb); |
- bool GetSupportedVaProfiles(std::vector<VAProfile>* profiles); |
- |
- // Check if |va_profile| supports |entrypoint| or not. |va_lock_| must be |
- // held on entry. |
- bool IsEntrypointSupported_Locked(VAProfile va_profile, |
- VAEntrypoint entrypoint); |
- |
- // Return true if |va_profile| for |entrypoint| with |required_attribs| is |
- // supported. |va_lock_| must be held on entry. |
- bool AreAttribsSupported_Locked( |
- VAProfile va_profile, |
- VAEntrypoint entrypoint, |
- const std::vector<VAConfigAttrib>& required_attribs); |
- |
- // Get maximum resolution for |va_profile| and |entrypoint| with |
- // |required_attribs|. If return value is true, |resolution| is the maximum |
- // resolution. |va_lock_| must be held on entry. |
- bool GetMaxResolution_Locked( |
- VAProfile va_profile, |
- VAEntrypoint entrypoint, |
- std::vector<VAConfigAttrib>& required_attribs, |
- gfx::Size* resolution); |
- |
- // Destroys a |va_surface| created using CreateUnownedSurface. |
- void DestroyUnownedSurface(VASurfaceID va_surface_id); |
- |
- // Initialize the video post processing context with the |size| of |
- // the input pictures to be processed. |
- bool InitializeVpp_Locked(); |
- |
- // Deinitialize the video post processing context. |
- void DeinitializeVpp(); |
- |
- // Execute pending job in hardware and destroy pending buffers. Return false |
- // if vaapi driver refuses to accept parameter or slice buffers submitted |
- // by client, or if execution fails in hardware. |
- bool Execute(VASurfaceID va_surface_id); |
- |
- // Attempt to set render mode to "render to texture.". Failure is non-fatal. |
- void TryToSetVADisplayAttributeToLocalGPU(); |
- |
- // Get supported profile infos for |mode|. |
- std::vector<ProfileInfo> GetSupportedProfileInfosForCodecModeInternal( |
- CodecMode mode); |
- |
- // Lazily initialize static data after sandbox is enabled. Return false on |
- // init failure. |
- static bool PostSandboxInitialization(); |
- |
- // Map VideoCodecProfile enum values to VaProfile values. This function |
- // includes a workaround for crbug.com/345569. If va_profile is h264 baseline |
- // and it is not supported, we try constrained baseline. |
- static VAProfile ProfileToVAProfile(media::VideoCodecProfile profile, |
- CodecMode mode); |
- |
- // Pointer to VADisplayState's member |va_lock_|. Guaranteed to be valid for |
- // the lifetime of VaapiWrapper. |
- base::Lock* va_lock_; |
- |
- // Allocated ids for VASurfaces. |
- std::vector<VASurfaceID> va_surface_ids_; |
- |
- // VA format of surfaces with va_surface_ids_. |
- unsigned int va_surface_format_; |
- |
- // Singleton instance of VADisplayState. |
- static base::LazyInstance<VADisplayState> va_display_state_; |
- |
- // VA handles. |
- // All valid after successful Initialize() and until Deinitialize(). |
- VADisplay va_display_; |
- VAConfigID va_config_id_; |
- // Created for the current set of va_surface_ids_ in CreateSurfaces() and |
- // valid until DestroySurfaces(). |
- VAContextID va_context_id_; |
- |
- // Data queued up for HW codec, to be committed on next execution. |
- std::vector<VABufferID> pending_slice_bufs_; |
- std::vector<VABufferID> pending_va_bufs_; |
- |
- // Bitstream buffers for encode. |
- std::set<VABufferID> coded_buffers_; |
- |
- // Called to report codec errors to UMA. Errors to clients are reported via |
- // return values from public methods. |
- base::Closure report_error_to_uma_cb_; |
- |
- // VPP (Video Post Processing) context, this is used to convert |
- // pictures used by the decoder to RGBA pictures usable by GL or the |
- // display hardware. |
- VAConfigID va_vpp_config_id_; |
- VAContextID va_vpp_context_id_; |
- VABufferID va_vpp_buffer_id_; |
- |
- // Singleton variable to store supported profile information for encode and |
- // decode. |
- static base::LazyInstance<LazyProfileInfos> profile_infos_; |
- |
- DISALLOW_COPY_AND_ASSIGN(VaapiWrapper); |
-}; |
- |
-} // namespace content |
- |
-#endif // CONTENT_COMMON_GPU_MEDIA_VAAPI_WRAPPER_H_ |