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 #include "content/renderer/gpu_video_decode_accelerator_host.h" | |
6 | |
7 #include "base/logging.h" | |
8 #include "base/shared_memory.h" | |
9 #include "base/task.h" | |
10 #include "content/common/gpu/gpu_messages.h" | |
11 #include "content/common/view_messages.h" | |
12 #include "content/renderer/render_thread.h" | |
13 #include "ipc/ipc_message_macros.h" | |
14 #include "ipc/ipc_message_utils.h" | |
15 | |
16 using media::VideoDecodeAccelerator; | |
17 using media::VideoDecodeAcceleratorCallback; | |
18 | |
19 GpuVideoDecodeAcceleratorHost::GpuVideoDecodeAcceleratorHost( | |
20 MessageRouter* router, | |
21 IPC::Message::Sender* ipc_sender, | |
22 int32 decoder_host_id, | |
23 VideoDecodeAccelerator::Client* client) | |
24 : router_(router), | |
25 ipc_sender_(ipc_sender), | |
26 decoder_host_id_(decoder_host_id), | |
27 decoder_id_(0), | |
28 client_(client) { | |
29 } | |
30 | |
31 GpuVideoDecodeAcceleratorHost::~GpuVideoDecodeAcceleratorHost() {} | |
32 | |
33 void GpuVideoDecodeAcceleratorHost::OnChannelConnected(int32 peer_pid) { | |
34 } | |
35 | |
36 void GpuVideoDecodeAcceleratorHost::OnChannelError() { | |
37 ipc_sender_ = NULL; | |
38 } | |
39 | |
40 bool GpuVideoDecodeAcceleratorHost::OnMessageReceived(const IPC::Message& msg) { | |
41 bool handled = true; | |
42 IPC_BEGIN_MESSAGE_MAP(GpuVideoDecodeAcceleratorHost, msg) | |
43 IPC_MESSAGE_HANDLER(AcceleratedVideoDecoderHostMsg_BitstreamBufferProcessed, | |
44 OnBitstreamBufferProcessed) | |
45 IPC_MESSAGE_HANDLER(AcceleratedVideoDecoderHostMsg_ProvidePictureBuffers, | |
46 OnProvidePictureBuffer) | |
47 IPC_MESSAGE_HANDLER(AcceleratedVideoDecoderHostMsg_CreateDone, | |
48 OnCreateDone) | |
49 IPC_MESSAGE_HANDLER(AcceleratedVideoDecoderHostMsg_PictureReady, | |
50 OnPictureReady) | |
51 IPC_MESSAGE_HANDLER(AcceleratedVideoDecoderHostMsg_FlushDone, | |
52 OnFlushDone) | |
53 IPC_MESSAGE_HANDLER(AcceleratedVideoDecoderHostMsg_AbortDone, | |
54 OnAbortDone) | |
55 IPC_MESSAGE_HANDLER(AcceleratedVideoDecoderHostMsg_EndOfStream, | |
56 OnEndOfStream) | |
57 IPC_MESSAGE_HANDLER(AcceleratedVideoDecoderHostMsg_ErrorNotification, | |
58 OnErrorNotification) | |
59 IPC_MESSAGE_UNHANDLED(handled = false) | |
60 IPC_END_MESSAGE_MAP() | |
61 DCHECK(handled); | |
62 return handled; | |
63 } | |
64 | |
65 void GpuVideoDecodeAcceleratorHost::GetConfigs( | |
66 const std::vector<uint32>& requested_configs, | |
67 std::vector<uint32>* matched_configs) { | |
68 // TODO(vrk): Need to rethink GetConfigs. | |
69 NOTIMPLEMENTED(); | |
70 } | |
71 | |
72 bool GpuVideoDecodeAcceleratorHost::Initialize( | |
73 const std::vector<uint32>& configs) { | |
74 router_->AddRoute(decoder_host_id_, this); | |
75 | |
76 // Temporarily save configs for after create is done and we're | |
77 // ready to initialize. | |
78 configs_ = configs; | |
79 | |
80 if (!ipc_sender_->Send(new GpuChannelMsg_CreateVideoDecoder( | |
81 decoder_id_, configs))) { | |
82 LOG(ERROR) << "Send(GpuChannelMsg_CreateVideoDecoder) failed"; | |
83 return false; | |
84 } | |
85 return true; | |
86 } | |
87 | |
88 bool GpuVideoDecodeAcceleratorHost::Decode( | |
89 const media::BitstreamBuffer& bitstream_buffer) { | |
90 if (!ipc_sender_->Send(new AcceleratedVideoDecoderMsg_Decode( | |
91 decoder_id_, bitstream_buffer.id(), | |
92 bitstream_buffer.handle(), bitstream_buffer.size()))) { | |
93 DLOG(ERROR) << "Send(AcceleratedVideoDecoderMsg_Decode) failed"; | |
94 return false; | |
95 } | |
96 | |
97 return true; | |
98 } | |
99 | |
100 void GpuVideoDecodeAcceleratorHost::AssignGLESBuffers( | |
101 const std::vector<media::GLESBuffer>& buffers) { | |
102 // Rearrange data for IPC command. | |
103 std::vector<int32> buffer_ids; | |
104 std::vector<uint32> texture_ids; | |
105 std::vector<uint32> context_ids; | |
106 std::vector<gfx::Size> sizes; | |
107 for (uint32 i = 0; i < buffers.size(); i++) { | |
108 const media::BufferInfo& info = buffers[i].buffer_info(); | |
109 texture_ids.push_back(buffers[i].texture_id()); | |
110 context_ids.push_back(buffers[i].context_id()); | |
111 buffer_ids.push_back(info.id()); | |
112 sizes.push_back(info.size()); | |
113 } | |
114 if (!ipc_sender_->Send(new AcceleratedVideoDecoderMsg_AssignGLESBuffers( | |
115 decoder_id_, buffer_ids, texture_ids, context_ids, sizes))) { | |
116 LOG(ERROR) << "Send(AcceleratedVideoDecoderMsg_AssignGLESBuffers) failed"; | |
117 } | |
118 } | |
119 | |
120 void GpuVideoDecodeAcceleratorHost::AssignSysmemBuffers( | |
121 const std::vector<media::SysmemBuffer>& buffers) { | |
122 // TODO(vrk): Implement. | |
123 NOTIMPLEMENTED(); | |
124 } | |
125 | |
126 void GpuVideoDecodeAcceleratorHost::ReusePictureBuffer( | |
127 int32 picture_buffer_id) { | |
128 if (!ipc_sender_->Send(new AcceleratedVideoDecoderMsg_ReusePictureBuffer( | |
129 decoder_id_, picture_buffer_id))) { | |
130 LOG(ERROR) << "Send(AcceleratedVideoDecoderMsg_ReusePictureBuffer) failed"; | |
131 } | |
132 } | |
133 | |
134 bool GpuVideoDecodeAcceleratorHost::Flush() { | |
135 if (!ipc_sender_->Send(new AcceleratedVideoDecoderMsg_Flush(decoder_id_))) { | |
136 LOG(ERROR) << "Send(AcceleratedVideoDecoderMsg_Flush) failed"; | |
137 return false; | |
138 } | |
139 return true; | |
140 } | |
141 | |
142 bool GpuVideoDecodeAcceleratorHost::Abort() { | |
143 if (!ipc_sender_->Send(new AcceleratedVideoDecoderMsg_Abort(decoder_id_))) { | |
144 LOG(ERROR) << "Send(AcceleratedVideoDecoderMsg_Abort) failed"; | |
145 return false; | |
146 } | |
147 return true; | |
148 } | |
149 | |
150 void GpuVideoDecodeAcceleratorHost::OnBitstreamBufferProcessed( | |
151 int32 bitstream_buffer_id) { | |
152 client_->NotifyEndOfBitstreamBuffer(bitstream_buffer_id); | |
153 } | |
154 | |
155 void GpuVideoDecodeAcceleratorHost::OnProvidePictureBuffer( | |
156 uint32 num_requested_buffers, | |
157 const gfx::Size& buffer_size, | |
158 int32 mem_type) { | |
159 media::VideoDecodeAccelerator::MemoryType converted_mem_type = | |
160 static_cast<media::VideoDecodeAccelerator::MemoryType>(mem_type); | |
161 client_->ProvidePictureBuffers( | |
162 num_requested_buffers, buffer_size, converted_mem_type); | |
163 } | |
164 | |
165 void GpuVideoDecodeAcceleratorHost::OnDismissPictureBuffer( | |
166 int32 picture_buffer_id) { | |
167 client_->DismissPictureBuffer(picture_buffer_id); | |
168 } | |
169 | |
170 void GpuVideoDecodeAcceleratorHost::OnCreateDone(int32 decoder_id) { | |
171 decoder_id_ = decoder_id; | |
172 if (!ipc_sender_->Send(new AcceleratedVideoDecoderMsg_Initialize( | |
173 decoder_id_, configs_))) { | |
174 LOG(ERROR) << "Send(AcceleratedVideoDecoderMsg_Initialize) failed"; | |
175 } | |
176 } | |
177 | |
178 void GpuVideoDecodeAcceleratorHost::OnPictureReady( | |
179 int32 picture_buffer_id, int32 bitstream_buffer_id, | |
180 const gfx::Size& visible_size, const gfx::Size& decoded_size) { | |
181 media::Picture picture( | |
182 picture_buffer_id, bitstream_buffer_id, visible_size, decoded_size); | |
183 client_->PictureReady(picture); | |
184 } | |
185 | |
186 void GpuVideoDecodeAcceleratorHost::OnFlushDone() { | |
187 client_->NotifyFlushDone(); | |
188 } | |
189 | |
190 void GpuVideoDecodeAcceleratorHost::OnAbortDone() { | |
191 client_->NotifyAbortDone(); | |
192 } | |
193 | |
194 void GpuVideoDecodeAcceleratorHost::OnEndOfStream() { | |
195 client_->NotifyEndOfStream(); | |
196 } | |
197 | |
198 void GpuVideoDecodeAcceleratorHost::OnErrorNotification(uint32 error) { | |
199 client_->NotifyError( | |
200 static_cast<media::VideoDecodeAccelerator::Error>(error)); | |
201 } | |
OLD | NEW |