Chromium Code Reviews| 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 |
| index d21f3f1ee5ec52ece294ce53594c01e4f7252846..d96ba487e0223b70a4a236d8b78beb9a4a174f6e 100644 |
| --- a/content/common/gpu/media/vaapi_wrapper.h |
| +++ b/content/common/gpu/media/vaapi_wrapper.h |
| @@ -13,12 +13,14 @@ |
| #include <set> |
| #include <vector> |
| +#include "base/lazy_instance.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/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" |
| @@ -43,14 +45,15 @@ class CONTENT_EXPORT VaapiWrapper { |
| enum CodecMode { |
| kDecode, |
| kEncode, |
| + kCodecModeMax, |
| }; |
| - // Create VaapiWrapper for VAProfile. |
| - // |report_error_to_uma_cb| will be called independently from reporting |
| - // errors to clients via method return values. |
| + // 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_ptr<VaapiWrapper> Create( |
| CodecMode mode, |
| - VAProfile profile, |
| + VAProfile va_profile, |
| const base::Closure& report_error_to_uma_cb); |
| // Create VaapiWrapper for VideoCodecProfile. It maps VideoCodecProfile |
| @@ -63,8 +66,8 @@ class CONTENT_EXPORT VaapiWrapper { |
| const base::Closure& report_error_to_uma_cb); |
| // Return the supported encode profiles. |
| - static std::vector<media::VideoCodecProfile> GetSupportedEncodeProfiles( |
| - const base::Closure& report_error_to_uma_cb); |
| + static std::vector<media::VideoEncodeAccelerator::SupportedProfile> |
| + GetSupportedEncodeProfiles(); |
| ~VaapiWrapper(); |
| @@ -183,16 +186,49 @@ class CONTENT_EXPORT VaapiWrapper { |
| const gfx::Size& dest_size); |
| private: |
| + 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]; |
| + }; |
| + |
| 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); |
| - bool IsEntrypointSupported(VAProfile va_profile, VAEntrypoint entrypoint); |
| - bool AreAttribsSupported(VAProfile va_profile, |
| - VAEntrypoint entrypoint, |
| - const std::vector<VAConfigAttrib>& required_attribs); |
| + |
| + // Check if |va_profile| supports |entrypoint| or not. |va_lock_| must be |
| + // held on entry. |
| + bool IsEntrypointSupported_Locked(VAProfile va_profile, |
| + VAEntrypoint entrypoint); |
| + |
| + // Check if |va_profile| supports |required_attribs| or not. |va_lock_| must |
|
Pawel Osciak
2015/03/10 03:41:14
Return true if |va_profile| for |entrypoint| with
henryhsu
2015/03/10 05:36:53
Done.
|
| + // be held on entry. |
| + bool AreAttribsSupported_Locked( |
| + VAProfile va_profile, |
| + VAEntrypoint entrypoint, |
| + const std::vector<VAConfigAttrib>& required_attribs); |
| + |
| + // Get maximum resolution of |va_profile|. If return value is true, |
|
Pawel Osciak
2015/03/10 03:41:14
s/of |va_profile|/for |va_profile| and |entrypoint
henryhsu
2015/03/10 05:36:53
Done.
|
| + // |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, |
|
wuchengli
2015/03/09 11:14:53
add const
henryhsu
2015/03/10 05:36:53
Done.
wuchengli
2015/03/10 05:55:26
Discussed with Henry. vaCreateConfig needs non-con
|
| + gfx::Size* resolution); |
| // Destroys a |va_surface| created using CreateUnownedSurface. |
| void DestroyUnownedSurface(VASurfaceID va_surface_id); |
| @@ -212,10 +248,20 @@ class CONTENT_EXPORT VaapiWrapper { |
| // 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); |
| + |
| // 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(). |
| @@ -255,6 +301,10 @@ class CONTENT_EXPORT VaapiWrapper { |
| 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); |
| }; |