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 5570360ecd16e8eeac56219b7aa5b407a7cb314a..a0e6aee47108b3097dd26857d64a9283eda11511 100644 |
--- a/content/common/gpu/media/vaapi_wrapper.h |
+++ b/content/common/gpu/media/vaapi_wrapper.h |
@@ -3,12 +3,16 @@ |
// found in the LICENSE file. |
// |
// This file contains an implementation of VaapiWrapper, used by |
-// VaapiVideoDecodeAccelerator and VaapiH264Decoder to interface |
-// with libva (VA-API library for hardware video decode). |
+// 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 <set> |
+#include <vector> |
+ |
#include "base/callback.h" |
#include "base/memory/ref_counted.h" |
#include "base/synchronization/lock.h" |
@@ -22,20 +26,26 @@ |
namespace content { |
// This class handles VA-API calls and ensures proper locking of VA-API calls |
-// to libva, the userspace shim to the HW decoder driver. libva is not |
+// 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 decode parameters and slice data to the HW decoder, |
+// 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: |
+ enum CodecMode { |
+ kDecode, |
+ kEncode, |
+ }; |
+ |
// |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); |
@@ -57,20 +67,30 @@ class CONTENT_EXPORT VaapiWrapper { |
void DestroySurfaces(); |
// Submit parameters or slice data of |va_buffer_type|, copying them from |
- // |buffer| of size |size|, into HW decoder. The data in |buffer| is no |
+ // |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 decoder until |
- // DecodeAndDestroyPendingBuffers is called to execute or |
- // DestroyPendingBuffers is used to cancel a pending decode. |
+ // 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); |
- // Cancel and destroy all buffers queued to the HW decoder via SubmitBuffer. |
- // Useful when a pending decode is to be cancelled (on reset or error). |
+ // 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 decode in hardware into |va_surface_id} and destroy pending |
- // buffers. Return false if SubmitDecode() fails. |
- bool DecodeAndDestroyPendingBuffers(VASurfaceID va_surface_id); |
+ // Execute job in hardware on target |va_surface_id} and destroy pending |
wuchengli
2014/06/17 14:33:13
|va_surface_id} => |va_surface_id|
Pawel Osciak
2014/06/18 07:05:09
Done.
|
+ // 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. |
@@ -92,18 +112,40 @@ class CONTENT_EXPORT VaapiWrapper { |
// GetVaImage(). This is intended for testing only. |
void ReturnVaImageForTesting(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 |buffer| 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, |
wuchengli
2014/06/17 14:33:13
buffer_id for consistency
Pawel Osciak
2014/06/18 07:05:09
Done.
|
+ VASurfaceID sync_surface_id, |
+ uint8* target_ptr, |
+ size_t target_size, |
+ size_t* coded_data_size); |
+ |
+ // Destroy all previously-allocated (and not yet destroyed) coded buffers. |
+ void DestroyCodedBuffers(); |
+ |
private: |
VaapiWrapper(); |
- bool Initialize(media::VideoCodecProfile profile, |
+ bool Initialize(CodecMode mode, |
+ media::VideoCodecProfile profile, |
Display* x_display, |
const base::Closure& report_error__to_uma_cb); |
void Deinitialize(); |
- // Execute decode in hardware and destroy pending buffers. Return false if |
- // vaapi driver refuses to accept parameter or slice buffers submitted |
- // by client or if decode fails in hardware. |
- bool SubmitDecode(VASurfaceID va_surface_id); |
+ // 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(); |
@@ -114,7 +156,7 @@ class CONTENT_EXPORT VaapiWrapper { |
// 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 decode execution sequence in DecodeAndDestroyPendingBuffers(). |
+ // the entire job submission sequence in ExecuteAndDestroyPendingBuffers(). |
base::Lock va_lock_; |
// Allocated ids for VASurfaces. |
@@ -131,11 +173,14 @@ class CONTENT_EXPORT VaapiWrapper { |
// valid until DestroySurfaces(). |
VAContextID va_context_id_; |
- // Data queued up for HW decoder, to be committed on next HW decode. |
+ // Data queued up for HW codec, to be committed on next execution. |
std::vector<VABufferID> pending_slice_bufs_; |
std::vector<VABufferID> pending_va_bufs_; |
- // Called to report decoding errors to UMA. Errors to clients are reported via |
+ // 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_; |