Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(232)

Unified Diff: content/common/gpu/media/vaapi_wrapper.h

Issue 490233002: VaapiVideoAccelerator: make Vaapi accelerator work with ozone (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Remove picture destruction sequence Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 39906a0f405004b98a68bd7a18347041557dc326..7097eb9e90f260aee7b7c0101497ebcba53f8a3f 100644
--- a/content/common/gpu/media/vaapi_wrapper.h
+++ b/content/common/gpu/media/vaapi_wrapper.h
@@ -14,17 +14,29 @@
#include <vector>
#include "base/callback.h"
+#include "base/memory/linked_ptr.h"
#include "base/memory/ref_counted.h"
+#include "base/memory/weak_ptr.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 "third_party/libva/va/va_x11.h"
+#include "third_party/libva/va/va.h"
+#include "third_party/libva/va/va_vpp.h"
#include "ui/gfx/size.h"
+#if defined(USE_X11)
+#include "third_party/libva/va/va_x11.h"
+#endif // USE_X11
+
+namespace gfx {
+class GLContext;
+} // namespace gfx
namespace content {
+class VaapiPicture;
+
// 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
@@ -35,28 +47,26 @@ namespace content {
// 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 {
+class CONTENT_EXPORT VaapiWrapper : public base::SupportsWeakPtr<VaapiWrapper> {
public:
enum CodecMode {
kDecode,
kEncode,
};
+ ~VaapiWrapper();
Pawel Osciak 2014/12/08 10:55:16 Any reason to move this?
llandwerlin-old 2014/12/08 16:42:07 Moving this back.
+
// |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,
media::VideoCodecProfile profile,
- Display* x_display,
const base::Closure& report_error_to_uma_cb);
// Return the supported encode profiles.
static std::vector<media::VideoCodecProfile> GetSupportedEncodeProfiles(
- Display* x_display,
const base::Closure& report_error_to_uma_cb);
- ~VaapiWrapper();
-
// Create |num_surfaces| backing surfaces in driver for VASurfaces, each
// of size |size|. Returns true when successful, with the created IDs in
// |va_surfaces| to be managed and later wrapped in VASurfaces.
@@ -64,13 +74,33 @@ class CONTENT_EXPORT VaapiWrapper {
// 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(gfx::Size size,
+ bool CreateSurfaces(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
+ // |num_va_attribs| attributes from |va_attribs|. The ownership of
+ // the surface is transfered to the call. It differs from surfaces
Pawel Osciak 2014/12/08 10:55:16 s/call/caller/
llandwerlin-old 2014/12/08 16:42:07 Done.
+ // created using CreateSurfaces() where VaapiWrapper is the owner of
+ // the surfaces.
+ scoped_refptr<VASurface> CreateUnownedSurface(unsigned int va_format,
+ const gfx::Size& size,
+ VASurfaceAttrib* va_attribs,
+ size_t num_va_attribs);
+
+ // Create a VaapiPicture of |size| to be associated with
+ // |picture_buffer_id| and bound to |texture_id|. |gl_context| and
+ // |make_context_current| are provided for the GL operations.
+ linked_ptr<VaapiPicture> CreatePicture(
+ gfx::GLContext* gl_context,
+ const base::Callback<bool(void)> make_context_current,
+ int32 picture_buffer_id,
+ uint32 texture_id,
+ const gfx::Size& size);
+
// 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.
@@ -97,12 +127,6 @@ class CONTENT_EXPORT VaapiWrapper {
// buffers. Return false if Execute() fails.
bool ExecuteAndDestroyPendingBuffers(VASurfaceID va_surface_id);
- // Put data from |va_surface_id| into |x_pixmap| of size |size|,
- // converting/scaling to it.
- bool PutSurfaceIntoPixmap(VASurfaceID va_surface_id,
- Pixmap x_pixmap,
- gfx::Size dest_size);
-
// Returns true if the VAAPI version is less than the specified version.
bool VAAPIVersionLessThan(int major, int minor);
@@ -139,22 +163,47 @@ class CONTENT_EXPORT VaapiWrapper {
// Destroy all previously-allocated (and not yet destroyed) coded buffers.
void DestroyCodedBuffers();
+ // Blits a VASurface |va_surface_id_src| into another VASurface
+ // |va_surface_id_dest| applying pixel format conversion and scaling
+ // if needed.
+ bool BlitSurface(VASurfaceID va_surface_id_src,
+ const gfx::Size& src_size,
+ VASurfaceID va_surface_id_dest,
+ const gfx::Size& dest_size);
+
+#if defined(USE_X11)
+ // Put data from |va_surface_id| into |x_pixmap| of size |size|,
Pawel Osciak 2014/12/08 10:55:16 s/size/dest_size/
llandwerlin-old 2014/12/08 16:42:07 Done.
+ // converting/scaling to it.
+ bool PutSurfaceIntoPixmap(VASurfaceID va_surface_id,
+ Pixmap x_pixmap,
+ gfx::Size dest_size);
+#endif // USE_X11
+
private:
VaapiWrapper();
bool Initialize(CodecMode mode,
media::VideoCodecProfile profile,
- Display* x_display,
- const base::Closure& report_error_to_uma_cb);
+ const base::Closure& report_error__to_uma_cb);
void Deinitialize();
- bool VaInitialize(Display* x_display,
- const base::Closure& report_error_to_uma_cb);
+ 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);
+ // Destroys a |va_surface| created using CreateUnownedSurface.
+ void DestroyUnownedSurface(VASurfaceID va_surface);
+
+ // 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();
+ void DeinitializeVpp_Locked();
+
// 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.
@@ -179,7 +228,7 @@ class CONTENT_EXPORT VaapiWrapper {
int major_version_, minor_version_;
// VA handles.
- // Both valid after successful Initialize() and until Deinitialize().
+ // 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
@@ -197,6 +246,11 @@ class CONTENT_EXPORT VaapiWrapper {
// return values from public methods.
base::Closure report_error_to_uma_cb_;
+ // VPP context
+ VAConfigID va_vpp_config_id_;
+ VAContextID va_vpp_context_id_;
+ VABufferID va_vpp_buffer_id_;
+
DISALLOW_COPY_AND_ASSIGN(VaapiWrapper);
};

Powered by Google App Engine
This is Rietveld 408576698