Index: chrome/renderer/gpu_video_decoder_host.h |
diff --git a/chrome/renderer/gpu_video_decoder_host.h b/chrome/renderer/gpu_video_decoder_host.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..2bd2f5b4daa2aaa5ade9e19f56658ae80bf1505e |
--- /dev/null |
+++ b/chrome/renderer/gpu_video_decoder_host.h |
@@ -0,0 +1,126 @@ |
+// Copyright (c) 2010 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#ifndef CHROME_RENDERER_GPU_VIDEO_DECODER_HOST_H_ |
+#define CHROME_RENDERER_GPU_VIDEO_DECODER_HOST_H_ |
+ |
+#include <deque> |
+ |
+#include "base/singleton.h" |
+#include "chrome/common/gpu_video_common.h" |
+#include "chrome/renderer/gpu_channel_host.h" |
+#include "ipc/ipc_channel_proxy.h" |
+#include "media/base/buffers.h" |
+#include "media/base/video_frame.h" |
+ |
+using media::VideoFrame; |
+using media::Buffer; |
+ |
+class GpuVideoServiceHost; |
+ |
+class GpuVideoDecoderHost |
+ : public base::RefCountedThreadSafe<GpuVideoDecoderHost>, |
+ public IPC::Channel::Listener { |
+ public: |
+ class EventHandler { |
+ public: |
+ virtual void OnInitializeDone( |
+ bool success, |
+ const GpuVideoDecoderInitDoneParam& param) = 0; |
+ virtual void OnUninitializeDone() = 0; |
+ virtual void OnFlushDone() = 0; |
+ virtual void OnEmptyBufferDone(scoped_refptr<Buffer> buffer) = 0; |
+ virtual void OnFillBufferDone(scoped_refptr<VideoFrame> frame) = 0; |
+ virtual void OnDeviceError() = 0; |
+ }; |
+ |
+ typedef enum { |
+ kStateUninitialized, |
+ kStateNormal, |
+ kStateError, |
+ kStateFlushing, |
+ } GpuVideoDecoderHostState; |
+ |
+ // IPC::Channel::Listener. |
+ virtual void OnChannelConnected(int32 peer_pid) {} |
+ virtual void OnChannelError(); |
+ virtual void OnMessageReceived(const IPC::Message& message); |
+ |
+ bool Initialize(const GpuVideoDecoderInitParam& param); |
+ bool Uninitialize(); |
+ void EmptyThisBuffer(scoped_refptr<Buffer> buffer); |
+ void FillThisBuffer(scoped_refptr<VideoFrame> frame); |
+ bool Flush(); |
+ |
+ int32 decoder_id() { return decoder_info_.decoder_id_; } |
+ int32 route_id() { return decoder_info_.decoder_route_id_; } |
+ int32 my_route_id() { return decoder_info_.decoder_host_route_id_; } |
+ |
+ virtual ~GpuVideoDecoderHost() {} |
+ |
+ private: |
+ GpuVideoDecoderHost(GpuVideoServiceHost* service_host, |
+ GpuChannelHost* channel_host, |
+ EventHandler* event_handler, |
+ GpuVideoDecoderInfoParam decoder_info) |
+ : gpu_video_service_host_(service_host), |
+ channel_host_(channel_host), |
+ event_handler_(event_handler), |
+ decoder_info_(decoder_info), |
+ buffer_id_serial_(0), |
+ state_(kStateUninitialized), |
+ input_buffer_busy_(false) {} |
+ friend class GpuVideoServiceHost; |
+ |
+ // Input message handler. |
+ void OnInitializeDone(const GpuVideoDecoderInitDoneParam& param); |
+ void OnUninitializeDone(); |
+ void OnFlushDone(); |
+ void OnEmptyThisBufferDone(); |
+ void OnFillThisBufferDone(const GpuVideoDecoderOutputBufferParam& param); |
+ void OnEmptyThisBufferACK(); |
+ |
+ // Helper function. |
+ void SendInputBufferToGpu(); |
+ |
+ // We expect that GpuVideoServiceHost's always available during our life span. |
+ GpuVideoServiceHost* gpu_video_service_host_; |
+ |
+ scoped_refptr<GpuChannelHost> channel_host_; |
+ |
+ // We expect that the client of us will always available during our life span. |
+ EventHandler* event_handler_; |
+ |
+ // Globally identify this decoder in the GPU process. |
+ GpuVideoDecoderInfoParam decoder_info_; |
+ |
+ // Input buffer id serial number generator. |
+ int32 buffer_id_serial_; |
+ |
+ // Hold information about GpuVideoDecoder configuration. |
+ GpuVideoDecoderInitParam init_param_; |
+ |
+ // Hold information about output surface format, etc. |
+ GpuVideoDecoderInitDoneParam done_param_; |
+ |
+ // Current state of video decoder. |
+ GpuVideoDecoderHostState state_; |
+ |
+ // We are not able to push all received buffer to gpu process at once. |
+ std::deque<scoped_refptr<Buffer> > input_buffer_queue_; |
+ |
+ // Currently we do not use ring buffer in input buffer, therefore before |
+ // GPU process had finished access it, we should not touch it. |
+ bool input_buffer_busy_; |
+ |
+ // Transfer buffers for both input and output. |
+ // TODO(jiesun): remove output buffer when hardware composition is ready. |
+ scoped_ptr<base::SharedMemory> input_transfer_buffer_; |
+ scoped_ptr<base::SharedMemory> output_transfer_buffer_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(GpuVideoDecoderHost); |
+}; |
+ |
+#endif // CHROME_RENDERER_GPU_VIDEO_DECODER_HOST_H_ |
+ |