| Index: content/common/gpu/media/vaapi_video_decode_accelerator.h
|
| diff --git a/content/common/gpu/media/vaapi_video_decode_accelerator.h b/content/common/gpu/media/vaapi_video_decode_accelerator.h
|
| index 8c6b71bd9c92d6db7b5bd89fc6049366ed89fdc5..fdbd2d50422c3ef56437df8c27f45553ebcbb5ae 100644
|
| --- a/content/common/gpu/media/vaapi_video_decode_accelerator.h
|
| +++ b/content/common/gpu/media/vaapi_video_decode_accelerator.h
|
| @@ -8,12 +8,13 @@
|
| #ifndef CONTENT_COMMON_GPU_MEDIA_VAAPI_VIDEO_DECODE_ACCELERATOR_H_
|
| #define CONTENT_COMMON_GPU_MEDIA_VAAPI_VIDEO_DECODE_ACCELERATOR_H_
|
|
|
| +#include <map>
|
| #include <queue>
|
| #include <utility>
|
| #include <vector>
|
|
|
| #include "base/logging.h"
|
| -#include "base/memory/ref_counted.h"
|
| +#include "base/memory/linked_ptr.h"
|
| #include "base/memory/weak_ptr.h"
|
| #include "base/message_loop.h"
|
| #include "base/shared_memory.h"
|
| @@ -23,6 +24,7 @@
|
| #include "base/threading/thread.h"
|
| #include "content/common/content_export.h"
|
| #include "content/common/gpu/media/vaapi_h264_decoder.h"
|
| +#include "content/common/gpu/media/vaapi_wrapper.h"
|
| #include "media/base/bitstream_buffer.h"
|
| #include "media/video/picture.h"
|
| #include "media/video/video_decode_accelerator.h"
|
| @@ -57,9 +59,6 @@ class CONTENT_EXPORT VaapiVideoDecodeAccelerator :
|
| virtual void Reset() OVERRIDE;
|
| virtual void Destroy() OVERRIDE;
|
|
|
| - // Do any necessary initialization before the sandbox is enabled.
|
| - static void PreSandboxInitialization();
|
| -
|
| private:
|
| // Notify the client that |output_id| is ready for displaying.
|
| void NotifyPictureReady(int32 input_id, int32 output_id);
|
| @@ -82,21 +81,19 @@ private:
|
| // returned. Will also release the mapping.
|
| void ReturnCurrInputBuffer_Locked();
|
|
|
| - // Get and set up one or more output buffers in the decoder. This will sleep
|
| + // Pass one or more output buffers to the decoder. This will sleep
|
| // if no buffers are available. Return true if buffers have been set up or
|
| // false if an early exit has been requested (due to initiated
|
| // reset/flush/destroy).
|
| - bool GetOutputBuffers_Locked();
|
| + bool FeedDecoderWithOutputSurfaces_Locked();
|
|
|
| - // Initial decode task: get the decoder to the point in the stream from which
|
| - // it can start/continue decoding. Does not require output buffers and does
|
| - // not produce output frames. Called either when starting with a new stream
|
| - // or when playback is to be resumed following a seek.
|
| + // Get the decoder to the point in the stream from which it can start/continue
|
| + // decoding. Called either when starting to decode a new stream or when
|
| + // playback is to be resumed following a seek.
|
| void InitialDecodeTask();
|
|
|
| - // Decoding task. Will continue decoding given input buffers and sleep
|
| - // waiting for input/output as needed. Will exit if a reset/flush/destroy
|
| - // is requested.
|
| + // Continue decoding given input buffers and sleep waiting for input/output
|
| + // as needed. Will exit if a reset/flush/destroy is requested.
|
| void DecodeTask();
|
|
|
| // Scheduled after receiving a flush request and executed after the current
|
| @@ -124,14 +121,38 @@ private:
|
| // Helper for Destroy(), doing all the actual work except for deleting self.
|
| void Cleanup();
|
|
|
| - // Lazily initialize static data after sandbox is enabled. Return false on
|
| - // init failure.
|
| - static bool PostSandboxInitialization();
|
| + // Get a usable framebuffer configuration for use in binding textures
|
| + // or return false on failure.
|
| + bool InitializeFBConfig();
|
| +
|
| + // Callback for the decoder to execute when it wants us to output given
|
| + // |va_surface|.
|
| + void SurfaceReady(int32 input_id, const scoped_refptr<VASurface>& va_surface);
|
| +
|
| + // Represents a texture bound to an X Pixmap for output purposes.
|
| + class TFPPicture;
|
| +
|
| + // Callback to be executed once we have a |va_surface| to be output and
|
| + // an available |tfp_picture| to use for output.
|
| + // Puts contents of |va_surface| into given |tfp_picture|, releases the
|
| + // surface and passes the resulting picture to client for output.
|
| + void OutputPicture(const scoped_refptr<VASurface>& va_surface,
|
| + int32 input_id,
|
| + TFPPicture* tfp_picture);
|
| +
|
| + // Try to OutputPicture() if we have both a ready surface and picture.
|
| + void TryOutputSurface();
|
| +
|
| + // Called when a VASurface is no longer in use by the decoder or is not being
|
| + // synced/waiting to be synced to a picture. Returns it to available surfaces
|
| + // pool.
|
| + void RecycleVASurfaceID(VASurfaceID va_surface_id);
|
|
|
| // Client-provided X/GLX state.
|
| Display* x_display_;
|
| GLXContext glx_context_;
|
| base::Callback<bool(void)> make_context_current_;
|
| + GLXFBConfig fb_config_;
|
|
|
| // VAVDA state.
|
| enum State {
|
| @@ -153,10 +174,9 @@ private:
|
| kDestroying,
|
| };
|
|
|
| - State state_;
|
| -
|
| - // Protects input and output buffer queues and state_.
|
| + // Protects input buffer and surface queues and state_.
|
| base::Lock lock_;
|
| + State state_;
|
|
|
| // An input buffer awaiting consumption, provided by the client.
|
| struct InputBuffer {
|
| @@ -177,11 +197,41 @@ private:
|
| // Current input buffer at decoder.
|
| linked_ptr<InputBuffer> curr_input_buffer_;
|
|
|
| - // Queue for incoming input buffers.
|
| + // Queue for incoming output buffers (texture ids).
|
| typedef std::queue<int32> OutputBuffers;
|
| OutputBuffers output_buffers_;
|
| - // Signalled when output buffers are queued onto the output_buffers_ queue.
|
| - base::ConditionVariable output_ready_;
|
| +
|
| + typedef std::map<int32, linked_ptr<TFPPicture> > TFPPictures;
|
| + // All allocated TFPPictures, regardless of their current state. TFPPictures
|
| + // are allocated once and destroyed at the end of decode.
|
| + TFPPictures tfp_pictures_;
|
| + std::list<TFPPicture*> available_tfp_pictures_;
|
| +
|
| + // Return a TFPPicture associated with given client-provided id.
|
| + TFPPicture* TFPPictureById(int32 picture_buffer_id);
|
| +
|
| + // Number/resolution of output picture buffers.
|
| + size_t num_pics_;
|
| + gfx::Size pic_size_;
|
| +
|
| + // VA Surfaces no longer in use that can be passed back to the decoder for
|
| + // reuse, once it requests them.
|
| + std::list<VASurfaceID> available_va_surfaces_;
|
| + // Signalled when output surfaces are queued onto the available_va_surfaces_
|
| + // queue.
|
| + base::ConditionVariable surfaces_available_;
|
| +
|
| + // Pending output requests from the decoder. When it indicates that we should
|
| + // output a surface and we have an available TFPPicture (i.e. texture) ready
|
| + // to use, we'll execute the callback passing the TFPPicture. The callback
|
| + // will put the contents of the surface into the picture and return it to
|
| + // the client, releasing the surface as well.
|
| + // If we don't have any available TFPPictures at the time when the decoder
|
| + // requests output, we'll store the request on pending_output_cbs_ queue for
|
| + // later and run it once the client gives us more textures
|
| + // via ReusePictureBuffer().
|
| + typedef base::Callback<void(TFPPicture*)> OutputCB;
|
| + std::queue<OutputCB> pending_output_cbs_;
|
|
|
| // ChildThread's message loop
|
| base::MessageLoop* message_loop_;
|
| @@ -199,19 +249,16 @@ private:
|
| base::WeakPtrFactory<Client> client_ptr_factory_;
|
| base::WeakPtr<Client> client_;
|
|
|
| + scoped_ptr<VaapiWrapper> vaapi_wrapper_;
|
| +
|
| + // Comes after vaapi_wrapper_ to ensure its destructor is executed before
|
| + // vaapi_wrapper_ is destroyed.
|
| + scoped_ptr<VaapiH264Decoder> decoder_;
|
| base::Thread decoder_thread_;
|
| - VaapiH264Decoder decoder_;
|
|
|
| int num_frames_at_client_;
|
| int num_stream_bufs_at_decoder_;
|
|
|
| - // Posted onto ChildThread by the decoder to submit a GPU job to decode
|
| - // and put the decoded picture into output buffer. Takes ownership of
|
| - // the queues' memory.
|
| - void SubmitDecode(int32 output_id,
|
| - scoped_ptr<std::queue<VABufferID> > va_bufs,
|
| - scoped_ptr<std::queue<VABufferID> > slice_bufs);
|
| -
|
| DISALLOW_COPY_AND_ASSIGN(VaapiVideoDecodeAccelerator);
|
| };
|
|
|
|
|