Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(560)

Side by Side Diff: content/renderer/gpu/gpu_video_decode_accelerator_host.cc

Issue 7260008: Implement proper synchronization between HW video decode IPC and CommandBuffer. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fixing compilation errors from bots. Created 9 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/renderer/gpu/gpu_video_decode_accelerator_host.h" 5 #include "content/renderer/gpu/gpu_video_decode_accelerator_host.h"
6 6
7 #include "base/bind.h"
7 #include "base/logging.h" 8 #include "base/logging.h"
9 #include "base/message_loop.h"
8 #include "base/shared_memory.h" 10 #include "base/shared_memory.h"
9 #include "base/task.h" 11 #include "base/task.h"
10 #include "content/common/gpu/gpu_messages.h" 12 #include "content/common/gpu/gpu_messages.h"
11 #include "content/common/view_messages.h" 13 #include "content/common/view_messages.h"
12 #include "content/renderer/render_thread.h" 14 #include "content/renderer/render_thread.h"
15 #include "gpu/command_buffer/client/cmd_buffer_helper.h"
13 #include "ipc/ipc_message_macros.h" 16 #include "ipc/ipc_message_macros.h"
14 #include "ipc/ipc_message_utils.h" 17 #include "ipc/ipc_message_utils.h"
18 #include "ipc/ipc_platform_file.h"
15 19
16 using media::VideoDecodeAccelerator; 20 using media::VideoDecodeAccelerator;
17 21
18 GpuVideoDecodeAcceleratorHost::GpuVideoDecodeAcceleratorHost( 22 GpuVideoDecodeAcceleratorHost::GpuVideoDecodeAcceleratorHost(
19 MessageRouter* router, 23 MessageRouter* router,
20 IPC::Message::Sender* ipc_sender, 24 IPC::Message::Sender* ipc_sender,
21 int32 decoder_host_id, 25 int32 decoder_host_id,
22 uint32 command_buffer_route_id, 26 int32 command_buffer_route_id,
27 gpu::CommandBufferHelper* cmd_buffer_helper,
23 VideoDecodeAccelerator::Client* client) 28 VideoDecodeAccelerator::Client* client)
24 : router_(router), 29 : router_(router),
25 ipc_sender_(ipc_sender), 30 ipc_sender_(ipc_sender),
26 decoder_host_id_(decoder_host_id), 31 decoder_host_id_(decoder_host_id),
27 decoder_id_(0), 32 decoder_id_(-1),
28 command_buffer_route_id_(command_buffer_route_id), 33 command_buffer_route_id_(command_buffer_route_id),
34 cmd_buffer_helper_(cmd_buffer_helper),
29 client_(client) { 35 client_(client) {
36 message_loop_ = MessageLoop::current();
30 } 37 }
31 38
32 GpuVideoDecodeAcceleratorHost::~GpuVideoDecodeAcceleratorHost() {} 39 GpuVideoDecodeAcceleratorHost::~GpuVideoDecodeAcceleratorHost() {}
33 40
34 void GpuVideoDecodeAcceleratorHost::OnChannelConnected(int32 peer_pid) { 41 void GpuVideoDecodeAcceleratorHost::OnChannelConnected(int32 peer_pid) {
35 } 42 }
36 43
37 void GpuVideoDecodeAcceleratorHost::OnChannelError() { 44 void GpuVideoDecodeAcceleratorHost::OnChannelError() {
38 ipc_sender_ = NULL; 45 ipc_sender_ = NULL;
39 } 46 }
(...skipping 18 matching lines...) Expand all
58 IPC_MESSAGE_HANDLER(AcceleratedVideoDecoderHostMsg_EndOfStream, 65 IPC_MESSAGE_HANDLER(AcceleratedVideoDecoderHostMsg_EndOfStream,
59 OnEndOfStream) 66 OnEndOfStream)
60 IPC_MESSAGE_HANDLER(AcceleratedVideoDecoderHostMsg_ErrorNotification, 67 IPC_MESSAGE_HANDLER(AcceleratedVideoDecoderHostMsg_ErrorNotification,
61 OnErrorNotification) 68 OnErrorNotification)
62 IPC_MESSAGE_UNHANDLED(handled = false) 69 IPC_MESSAGE_UNHANDLED(handled = false)
63 IPC_END_MESSAGE_MAP() 70 IPC_END_MESSAGE_MAP()
64 DCHECK(handled); 71 DCHECK(handled);
65 return handled; 72 return handled;
66 } 73 }
67 74
75 std::pair<int32, int32> GpuVideoDecodeAcceleratorHost::SyncTokens() {
76 std::pair<int32, int32> tokens;
77 tokens.first = cmd_buffer_helper_->last_token_read();
78 tokens.second = cmd_buffer_helper_->InsertToken();
79 cmd_buffer_helper_->Flush();
80 return tokens;
81 }
82
68 bool GpuVideoDecodeAcceleratorHost::GetConfigs( 83 bool GpuVideoDecodeAcceleratorHost::GetConfigs(
69 const std::vector<uint32>& requested_configs, 84 const std::vector<uint32>& requested_configs,
70 std::vector<uint32>* matched_configs) { 85 std::vector<uint32>* matched_configs) {
71 // TODO(vrk): Need to rethink GetConfigs. 86 // TODO(vrk): Need to rethink GetConfigs.
72 NOTIMPLEMENTED(); 87 NOTIMPLEMENTED();
73 return true; 88 return true;
74 } 89 }
75 90
76 bool GpuVideoDecodeAcceleratorHost::Initialize( 91 bool GpuVideoDecodeAcceleratorHost::Initialize(
77 const std::vector<uint32>& configs) { 92 const std::vector<uint32>& configs) {
93 DCHECK_EQ(message_loop_, MessageLoop::current());
78 router_->AddRoute(decoder_host_id_, this); 94 router_->AddRoute(decoder_host_id_, this);
79 95
80 // Temporarily save configs for after create is done and we're 96 // Temporarily save configs for after create is done and we're
81 // ready to initialize. 97 // ready to initialize.
82 configs_ = configs; 98 configs_ = configs;
83
84 if (!ipc_sender_->Send(new GpuChannelMsg_CreateVideoDecoder( 99 if (!ipc_sender_->Send(new GpuChannelMsg_CreateVideoDecoder(
85 decoder_id_, command_buffer_route_id_, configs))) { 100 decoder_host_id_, command_buffer_route_id_, configs))) {
86 LOG(ERROR) << "Send(GpuChannelMsg_CreateVideoDecoder) failed"; 101 LOG(ERROR) << "Send(GpuChannelMsg_CreateVideoDecoder) failed";
87 return false; 102 return false;
88 } 103 }
89 return true; 104 return true;
90 } 105 }
91 106
92 bool GpuVideoDecodeAcceleratorHost::Decode( 107 void GpuVideoDecodeAcceleratorHost::Decode(
93 const media::BitstreamBuffer& bitstream_buffer) { 108 const media::BitstreamBuffer& bitstream_buffer) {
109 if (MessageLoop::current() != message_loop_) {
scherkus (not reviewing) 2011/06/27 22:54:47 I've been cracking down on this stuff.. who isn't
Ami GONE FROM CHROMIUM 2011/06/28 00:06:35 These calls are all async by definition; they have
110 message_loop_->PostTask(FROM_HERE, base::Bind(
111 &GpuVideoDecodeAcceleratorHost::Decode,
112 base::Unretained(this), bitstream_buffer));
113 return;
114 }
94 if (!ipc_sender_->Send(new AcceleratedVideoDecoderMsg_Decode( 115 if (!ipc_sender_->Send(new AcceleratedVideoDecoderMsg_Decode(
95 decoder_id_, bitstream_buffer.id(), 116 decoder_id_, SyncTokens(), bitstream_buffer.handle(),
96 bitstream_buffer.handle(), bitstream_buffer.size()))) { 117 bitstream_buffer.id(), bitstream_buffer.size()))) {
97 DLOG(ERROR) << "Send(AcceleratedVideoDecoderMsg_Decode) failed"; 118 DLOG(ERROR) << "Send(AcceleratedVideoDecoderMsg_Decode) failed";
98 return false; 119 // TODO(fischman/vrk): signal error to client.
120 return;
99 } 121 }
100
101 return true;
102 } 122 }
103 123
104 void GpuVideoDecodeAcceleratorHost::AssignGLESBuffers( 124 void GpuVideoDecodeAcceleratorHost::AssignGLESBuffers(
105 const std::vector<media::GLESBuffer>& buffers) { 125 const std::vector<media::GLESBuffer>& buffers) {
126 if (MessageLoop::current() != message_loop_) {
127 message_loop_->PostTask(FROM_HERE, base::Bind(
128 &GpuVideoDecodeAcceleratorHost::AssignGLESBuffers,
129 base::Unretained(this), buffers));
130 return;
131 }
106 // Rearrange data for IPC command. 132 // Rearrange data for IPC command.
107 std::vector<int32> buffer_ids; 133 std::vector<int32> buffer_ids;
108 std::vector<uint32> texture_ids; 134 std::vector<uint32> texture_ids;
109 std::vector<gfx::Size> sizes; 135 std::vector<gfx::Size> sizes;
110 for (uint32 i = 0; i < buffers.size(); i++) { 136 for (uint32 i = 0; i < buffers.size(); i++) {
111 const media::GLESBuffer& buffer = buffers[i]; 137 const media::GLESBuffer& buffer = buffers[i];
112 texture_ids.push_back(buffer.texture_id()); 138 texture_ids.push_back(buffer.texture_id());
113 buffer_ids.push_back(buffer.id()); 139 buffer_ids.push_back(buffer.id());
114 sizes.push_back(buffer.size()); 140 sizes.push_back(buffer.size());
115 } 141 }
116 if (!ipc_sender_->Send(new GpuChannelMsg_AssignTexturesToVideoDecoder( 142 if (!ipc_sender_->Send(new AcceleratedVideoDecoderMsg_AssignTextures(
117 decoder_id_, buffer_ids, texture_ids, sizes))) { 143 decoder_id_, SyncTokens(), buffer_ids, texture_ids, sizes))) {
118 LOG(ERROR) << "Send(AcceleratedVideoDecoderMsg_AssignGLESBuffers) failed"; 144 LOG(ERROR) << "Send(AcceleratedVideoDecoderMsg_AssignGLESBuffers) failed";
119 } 145 }
120 } 146 }
121 147
122 void GpuVideoDecodeAcceleratorHost::AssignSysmemBuffers( 148 void GpuVideoDecodeAcceleratorHost::AssignSysmemBuffers(
123 const std::vector<media::SysmemBuffer>& buffers) { 149 const std::vector<media::SysmemBuffer>& buffers) {
150 if (MessageLoop::current() != message_loop_) {
151 message_loop_->PostTask(FROM_HERE, base::Bind(
152 &GpuVideoDecodeAcceleratorHost::AssignSysmemBuffers,
153 base::Unretained(this), buffers));
154 return;
155 }
124 // TODO(vrk): Implement. 156 // TODO(vrk): Implement.
125 NOTIMPLEMENTED(); 157 NOTIMPLEMENTED();
126 } 158 }
127 159
128 void GpuVideoDecodeAcceleratorHost::ReusePictureBuffer( 160 void GpuVideoDecodeAcceleratorHost::ReusePictureBuffer(
129 int32 picture_buffer_id) { 161 int32 picture_buffer_id) {
162 if (MessageLoop::current() != message_loop_) {
163 message_loop_->PostTask(FROM_HERE, base::Bind(
164 &GpuVideoDecodeAcceleratorHost::ReusePictureBuffer,
165 base::Unretained(this), picture_buffer_id));
166 return;
167 }
130 if (!ipc_sender_->Send(new AcceleratedVideoDecoderMsg_ReusePictureBuffer( 168 if (!ipc_sender_->Send(new AcceleratedVideoDecoderMsg_ReusePictureBuffer(
131 decoder_id_, picture_buffer_id))) { 169 decoder_id_, SyncTokens(), picture_buffer_id))) {
132 LOG(ERROR) << "Send(AcceleratedVideoDecoderMsg_ReusePictureBuffer) failed"; 170 LOG(ERROR) << "Send(AcceleratedVideoDecoderMsg_ReusePictureBuffer) failed";
133 } 171 }
134 } 172 }
135 173
136 bool GpuVideoDecodeAcceleratorHost::Flush() { 174 void GpuVideoDecodeAcceleratorHost::Flush() {
137 if (!ipc_sender_->Send(new AcceleratedVideoDecoderMsg_Flush(decoder_id_))) { 175 if (MessageLoop::current() != message_loop_) {
176 message_loop_->PostTask(FROM_HERE, base::Bind(
177 &GpuVideoDecodeAcceleratorHost::Flush,
178 base::Unretained(this)));
179 return;
180 }
181 if (!ipc_sender_->Send(new AcceleratedVideoDecoderMsg_Flush(
182 decoder_id_, SyncTokens()))) {
138 LOG(ERROR) << "Send(AcceleratedVideoDecoderMsg_Flush) failed"; 183 LOG(ERROR) << "Send(AcceleratedVideoDecoderMsg_Flush) failed";
139 return false; 184 // TODO(fischman/vrk): signal error to client.
185 return;
140 } 186 }
141 return true;
142 } 187 }
143 188
144 bool GpuVideoDecodeAcceleratorHost::Abort() { 189 void GpuVideoDecodeAcceleratorHost::Abort() {
145 if (!ipc_sender_->Send(new AcceleratedVideoDecoderMsg_Abort(decoder_id_))) { 190 if (MessageLoop::current() != message_loop_) {
191 message_loop_->PostTask(FROM_HERE, base::Bind(
192 &GpuVideoDecodeAcceleratorHost::Abort,
193 base::Unretained(this)));
194 return;
195 }
196 if (!ipc_sender_->Send(new AcceleratedVideoDecoderMsg_Abort(
197 decoder_id_, SyncTokens()))) {
146 LOG(ERROR) << "Send(AcceleratedVideoDecoderMsg_Abort) failed"; 198 LOG(ERROR) << "Send(AcceleratedVideoDecoderMsg_Abort) failed";
147 return false; 199 // TODO(fischman/vrk): signal error to client.
200 return;
148 } 201 }
149 return true;
150 } 202 }
151 203
152 void GpuVideoDecodeAcceleratorHost::OnBitstreamBufferProcessed( 204 void GpuVideoDecodeAcceleratorHost::OnBitstreamBufferProcessed(
153 int32 bitstream_buffer_id) { 205 int32 bitstream_buffer_id) {
154 client_->NotifyEndOfBitstreamBuffer(bitstream_buffer_id); 206 client_->NotifyEndOfBitstreamBuffer(bitstream_buffer_id);
155 } 207 }
156 208
157 void GpuVideoDecodeAcceleratorHost::OnProvidePictureBuffer( 209 void GpuVideoDecodeAcceleratorHost::OnProvidePictureBuffer(
158 uint32 num_requested_buffers, 210 uint32 num_requested_buffers,
159 const gfx::Size& buffer_size, 211 const gfx::Size& buffer_size,
160 int32 mem_type) { 212 int32 mem_type) {
161 media::VideoDecodeAccelerator::MemoryType converted_mem_type = 213 media::VideoDecodeAccelerator::MemoryType converted_mem_type =
162 static_cast<media::VideoDecodeAccelerator::MemoryType>(mem_type); 214 static_cast<media::VideoDecodeAccelerator::MemoryType>(mem_type);
163 client_->ProvidePictureBuffers( 215 client_->ProvidePictureBuffers(
164 num_requested_buffers, buffer_size, converted_mem_type); 216 num_requested_buffers, buffer_size, converted_mem_type);
165 } 217 }
166 218
167 void GpuVideoDecodeAcceleratorHost::OnDismissPictureBuffer( 219 void GpuVideoDecodeAcceleratorHost::OnDismissPictureBuffer(
168 int32 picture_buffer_id) { 220 int32 picture_buffer_id) {
169 client_->DismissPictureBuffer(picture_buffer_id); 221 client_->DismissPictureBuffer(picture_buffer_id);
170 } 222 }
171 223
172 void GpuVideoDecodeAcceleratorHost::OnCreateDone(int32 decoder_id) { 224 void GpuVideoDecodeAcceleratorHost::OnCreateDone(int32 decoder_id) {
173 decoder_id_ = decoder_id; 225 decoder_id_ = decoder_id;
174 if (!ipc_sender_->Send(new AcceleratedVideoDecoderMsg_Initialize( 226 if (!ipc_sender_->Send(new AcceleratedVideoDecoderMsg_Initialize(
175 decoder_id_, configs_))) { 227 decoder_id_, SyncTokens(), configs_))) {
176 LOG(ERROR) << "Send(AcceleratedVideoDecoderMsg_Initialize) failed"; 228 LOG(ERROR) << "Send(AcceleratedVideoDecoderMsg_Initialize) failed";
177 } 229 }
178 } 230 }
179 231
180 void GpuVideoDecodeAcceleratorHost::OnInitializeDone() { 232 void GpuVideoDecodeAcceleratorHost::OnInitializeDone() {
181 client_->NotifyInitializeDone(); 233 client_->NotifyInitializeDone();
182 } 234 }
183 235
184 void GpuVideoDecodeAcceleratorHost::OnPictureReady( 236 void GpuVideoDecodeAcceleratorHost::OnPictureReady(
185 int32 picture_buffer_id, int32 bitstream_buffer_id, 237 int32 picture_buffer_id, int32 bitstream_buffer_id,
(...skipping 12 matching lines...) Expand all
198 } 250 }
199 251
200 void GpuVideoDecodeAcceleratorHost::OnEndOfStream() { 252 void GpuVideoDecodeAcceleratorHost::OnEndOfStream() {
201 client_->NotifyEndOfStream(); 253 client_->NotifyEndOfStream();
202 } 254 }
203 255
204 void GpuVideoDecodeAcceleratorHost::OnErrorNotification(uint32 error) { 256 void GpuVideoDecodeAcceleratorHost::OnErrorNotification(uint32 error) {
205 client_->NotifyError( 257 client_->NotifyError(
206 static_cast<media::VideoDecodeAccelerator::Error>(error)); 258 static_cast<media::VideoDecodeAccelerator::Error>(error));
207 } 259 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698