| OLD | NEW |
| (Empty) |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #ifndef CONTENT_RENDERER_GPU_VIDEO_DECODER_HOST_H_ | |
| 6 #define CONTENT_RENDERER_GPU_VIDEO_DECODER_HOST_H_ | |
| 7 | |
| 8 #include <deque> | |
| 9 #include <map> | |
| 10 | |
| 11 #include "base/memory/singleton.h" | |
| 12 #include "base/shared_memory.h" | |
| 13 #include "content/renderer/gpu_channel_host.h" | |
| 14 #include "media/base/buffers.h" | |
| 15 #include "media/base/video_frame.h" | |
| 16 #include "media/video/video_decode_engine.h" | |
| 17 | |
| 18 using media::VideoFrame; | |
| 19 using media::Buffer; | |
| 20 | |
| 21 class MessageRouter; | |
| 22 struct GpuVideoDecoderInitDoneParam; | |
| 23 | |
| 24 // This class is used to talk to GpuVideoDecoder in the GPU process through | |
| 25 // IPC messages. It implements the interface of VideoDecodeEngine so users | |
| 26 // view it as a regular video decode engine, the implementation is a portal | |
| 27 // to the GPU process. | |
| 28 // | |
| 29 // THREAD SEMANTICS | |
| 30 // | |
| 31 // All methods of this class can be accessed on any thread. A message loop | |
| 32 // needs to be provided to class through Initialize() for accessing the | |
| 33 // IPC channel. Event handlers are called on that message loop. | |
| 34 // | |
| 35 // Since this class is not refcounted, it is important to delete this | |
| 36 // object only after OnUninitializeCompelte() is called. | |
| 37 class GpuVideoDecoderHost : public media::VideoDecodeEngine, | |
| 38 public IPC::Channel::Listener { | |
| 39 public: | |
| 40 // |router| is used to dispatch IPC messages to this object. | |
| 41 // |ipc_sender| is used to send IPC messages to GPU process. | |
| 42 // It is important that the above two objects are accessed on the | |
| 43 // |message_loop_|. | |
| 44 GpuVideoDecoderHost(MessageRouter* router, | |
| 45 IPC::Message::Sender* ipc_sender, | |
| 46 int context_route_id, | |
| 47 int32 decoder_host_id); | |
| 48 virtual ~GpuVideoDecoderHost(); | |
| 49 | |
| 50 // IPC::Channel::Listener. | |
| 51 virtual void OnChannelConnected(int32 peer_pid) {} | |
| 52 virtual void OnChannelError(); | |
| 53 virtual bool OnMessageReceived(const IPC::Message& message); | |
| 54 | |
| 55 // media::VideoDecodeEngine implementation. | |
| 56 virtual void Initialize(MessageLoop* message_loop, | |
| 57 VideoDecodeEngine::EventHandler* event_handler, | |
| 58 media::VideoDecodeContext* context, | |
| 59 const media::VideoDecoderConfig& config); | |
| 60 virtual void ConsumeVideoSample(scoped_refptr<Buffer> buffer); | |
| 61 virtual void ProduceVideoFrame(scoped_refptr<VideoFrame> frame); | |
| 62 virtual void Uninitialize(); | |
| 63 virtual void Flush(); | |
| 64 virtual void Seek(); | |
| 65 | |
| 66 private: | |
| 67 typedef std::map<int32, scoped_refptr<media::VideoFrame> > VideoFrameMap; | |
| 68 | |
| 69 // Internal states. | |
| 70 enum GpuVideoDecoderHostState { | |
| 71 kStateUninitialized, | |
| 72 kStateNormal, | |
| 73 kStateError, | |
| 74 kStateFlushing, | |
| 75 }; | |
| 76 | |
| 77 // Takes care of sending IPC message to create a video decoder. | |
| 78 void CreateVideoDecoder(); | |
| 79 | |
| 80 // Handlers for messages received from the GPU process. | |
| 81 void OnCreateVideoDecoderDone(int32 decoder_id); | |
| 82 void OnInitializeDone(const GpuVideoDecoderInitDoneParam& param); | |
| 83 void OnUninitializeDone(); | |
| 84 void OnFlushDone(); | |
| 85 void OnPrerollDone(); | |
| 86 void OnEmptyThisBufferACK(); | |
| 87 void OnProduceVideoSample(); | |
| 88 void OnConsumeVideoFrame(int32 frame_id, int64 timestamp, | |
| 89 int64 duration, int32 flags); | |
| 90 void OnAllocateVideoFrames(int32 n, uint32 width, | |
| 91 uint32 height, int32 format); | |
| 92 void OnReleaseAllVideoFrames(); | |
| 93 | |
| 94 // Handler for VideoDecodeContext. This method is called when video frames | |
| 95 // allocation is done. | |
| 96 void OnAllocateVideoFramesDone(); | |
| 97 | |
| 98 // Send a message to the GPU process to inform that a video frame is | |
| 99 // allocated. | |
| 100 void SendVideoFrameAllocated(int32 frame_id, | |
| 101 scoped_refptr<media::VideoFrame> frame); | |
| 102 | |
| 103 // Send a video sample to the GPU process and tell it to use the buffer for | |
| 104 // video decoding. | |
| 105 void SendConsumeVideoSample(); | |
| 106 | |
| 107 // Look up the frame_id for |frame| and send a message to the GPU process | |
| 108 // to use that video frame to produce an output. | |
| 109 void SendProduceVideoFrame(scoped_refptr<media::VideoFrame> frame); | |
| 110 | |
| 111 // A router used to send us IPC messages. | |
| 112 MessageRouter* router_; | |
| 113 | |
| 114 // Sends IPC messages to the GPU process. | |
| 115 IPC::Message::Sender* ipc_sender_; | |
| 116 | |
| 117 // Route ID of the GLES2 context in the GPU process. | |
| 118 int context_route_id_; | |
| 119 | |
| 120 // Message loop that this object runs on. | |
| 121 MessageLoop* message_loop_; | |
| 122 | |
| 123 // We expect that the client of us will always available during our life span. | |
| 124 EventHandler* event_handler_; | |
| 125 | |
| 126 // A Context for allocating video frame textures. | |
| 127 media::VideoDecodeContext* context_; | |
| 128 | |
| 129 // Dimensions of the video. | |
| 130 int width_; | |
| 131 int height_; | |
| 132 | |
| 133 // Current state of video decoder. | |
| 134 GpuVideoDecoderHostState state_; | |
| 135 | |
| 136 // ID of this GpuVideoDecoderHost. | |
| 137 int32 decoder_host_id_; | |
| 138 | |
| 139 // ID of GpuVideoDecoder in the GPU process. | |
| 140 int32 decoder_id_; | |
| 141 | |
| 142 // We are not able to push all received buffer to gpu process at once. | |
| 143 std::deque<scoped_refptr<Buffer> > input_buffer_queue_; | |
| 144 | |
| 145 // Currently we do not use ring buffer in input buffer, therefore before | |
| 146 // GPU process had finished access it, we should not touch it. | |
| 147 bool input_buffer_busy_; | |
| 148 | |
| 149 // Transfer buffers for both input and output. | |
| 150 // TODO(jiesun): remove output buffer when hardware composition is ready. | |
| 151 scoped_ptr<base::SharedMemory> input_transfer_buffer_; | |
| 152 | |
| 153 // Frame ID for the newly generated video frame. | |
| 154 int32 current_frame_id_; | |
| 155 | |
| 156 // The list of video frames allocated by VideoDecodeContext. | |
| 157 std::vector<scoped_refptr<media::VideoFrame> > video_frames_; | |
| 158 | |
| 159 // The mapping between video frame ID and a video frame. | |
| 160 VideoFrameMap video_frame_map_; | |
| 161 | |
| 162 DISALLOW_COPY_AND_ASSIGN(GpuVideoDecoderHost); | |
| 163 }; | |
| 164 | |
| 165 #endif // CONTENT_RENDERER_GPU_VIDEO_DECODER_HOST_H_ | |
| OLD | NEW |