| Index: media/gpu/ipc/service/gpu_video_encode_accelerator.h
|
| diff --git a/media/gpu/ipc/service/gpu_video_encode_accelerator.h b/media/gpu/ipc/service/gpu_video_encode_accelerator.h
|
| index d4c23ae2e71077f634ffc060b83297607844f443..08b76fbb64b1d121c7e2711e3340f79695a47716 100644
|
| --- a/media/gpu/ipc/service/gpu_video_encode_accelerator.h
|
| +++ b/media/gpu/ipc/service/gpu_video_encode_accelerator.h
|
| @@ -13,6 +13,8 @@
|
|
|
| #include "base/macros.h"
|
| #include "base/memory/weak_ptr.h"
|
| +#include "base/synchronization/waitable_event.h"
|
| +#include "base/threading/thread.h"
|
| #include "gpu/config/gpu_info.h"
|
| #include "gpu/ipc/service/gpu_command_buffer_stub.h"
|
| #include "ipc/ipc_listener.h"
|
| @@ -36,11 +38,14 @@ namespace media {
|
| // IPC coming in from the renderer and passes it to the underlying VEA.
|
| class GpuVideoEncodeAccelerator
|
| : public IPC::Listener,
|
| + public IPC::Sender,
|
| public VideoEncodeAccelerator::Client,
|
| public gpu::GpuCommandBufferStub::DestructionObserver {
|
| public:
|
| - GpuVideoEncodeAccelerator(int32_t host_route_id,
|
| - gpu::GpuCommandBufferStub* stub);
|
| + GpuVideoEncodeAccelerator(
|
| + int32_t host_route_id,
|
| + gpu::GpuCommandBufferStub* stub,
|
| + const scoped_refptr<base::SingleThreadTaskRunner>& io_task_runner);
|
| ~GpuVideoEncodeAccelerator() override;
|
|
|
| // Initialize this accelerator with the given parameters and send
|
| @@ -53,6 +58,9 @@ class GpuVideoEncodeAccelerator
|
| // IPC::Listener implementation
|
| bool OnMessageReceived(const IPC::Message& message) override;
|
|
|
| + // IPC::Sender implementation
|
| + bool Send(IPC::Message* message) override;
|
| +
|
| // VideoEncodeAccelerator::Client implementation.
|
| void RequireBitstreamBuffers(unsigned int input_count,
|
| const gfx::Size& input_coded_size,
|
| @@ -79,6 +87,11 @@ class GpuVideoEncodeAccelerator
|
| static std::vector<VEAFactoryFunction> GetVEAFactoryFunctions(
|
| const gpu::GpuPreferences& gpu_preferences);
|
|
|
| + class MessageFilter;
|
| +
|
| + // Called on IO thread when |filter_| has been removed.
|
| + void OnFilterRemoved();
|
| +
|
| // IPC handlers, proxying VideoEncodeAccelerator for the renderer
|
| // process.
|
| void OnEncode(const AcceleratedVideoEncoderMsg_Encode_Params& params);
|
| @@ -89,9 +102,24 @@ class GpuVideoEncodeAccelerator
|
|
|
| void OnDestroy();
|
|
|
| - void EncodeFrameFinished(int32_t frame_id,
|
| - std::unique_ptr<base::SharedMemory> shm);
|
| - void Send(IPC::Message* message);
|
| + // Operations that run on encoder worker thread.
|
| + void CreateEncodeFrameOnEncoderWorker(
|
| + const AcceleratedVideoEncoderMsg_Encode_Params& params);
|
| + void DestroyOnEncoderWorker();
|
| +
|
| + // Completes encode tasks with the received |frame|.
|
| + void OnEncodeFrameCreated(int32_t frame_id,
|
| + bool force_keyframe,
|
| + const scoped_refptr<media::VideoFrame>& frame);
|
| +
|
| + // Notifies renderer that |frame_id| can be reused as input for encode is
|
| + // completed.
|
| + void EncodeFrameFinished(int32_t frame_id);
|
| +
|
| + // Checks that function is called on the correct thread. If MessageFilter is
|
| + // used, checks if it is called on |io_task_runner_|. If not, checks if it is
|
| + // called on |main_task_runner_|.
|
| + bool CheckIfCalledOnCorrectThread();
|
|
|
| // Route ID to communicate with the host.
|
| const uint32_t host_route_id_;
|
| @@ -111,7 +139,36 @@ class GpuVideoEncodeAccelerator
|
| gfx::Size input_coded_size_;
|
| size_t output_buffer_size_;
|
|
|
| - // Weak pointer for VideoFrames that refer back to |this|.
|
| + // The message filter to run VEA encode methods on IO thread if VEA supports
|
| + // it.
|
| + scoped_refptr<MessageFilter> filter_;
|
| +
|
| + // Used to wait on for |filter_| to be removed, before we can safely
|
| + // destroy the VEA.
|
| + base::WaitableEvent filter_removed_;
|
| +
|
| + // This thread services the operations necessary for encode so that they
|
| + // wouldn't block |main_task_runner_| or |io_task_runner_|.
|
| + base::Thread encoder_worker_thread_;
|
| + scoped_refptr<base::SingleThreadTaskRunner> encoder_worker_task_runner_;
|
| +
|
| + // GPU main thread task runner.
|
| + const scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_;
|
| +
|
| + // GPU IO thread task runner.
|
| + const scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_;
|
| +
|
| + // Task runner used for posting encode tasks. If
|
| + // TryToSetupEncodeOnSeperateThread() is true, |io_task_runner_| is used,
|
| + // otherwise |main_thread_task_runner_|.
|
| + scoped_refptr<base::SingleThreadTaskRunner> encode_task_runner_;
|
| +
|
| + // Weak pointer for referring back to |this| on |encoder_worker_task_runner_|.
|
| + base::WeakPtrFactory<GpuVideoEncodeAccelerator>
|
| + weak_this_factory_for_encoder_worker_;
|
| +
|
| + // Weak pointer for VideoFrames that refer back to |this| on
|
| + // |main_task_runner| or |io_task_runner_|.
|
| base::WeakPtrFactory<GpuVideoEncodeAccelerator> weak_this_factory_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(GpuVideoEncodeAccelerator);
|
|
|