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

Side by Side Diff: content/common/gpu/media/vaapi_video_decode_accelerator.cc

Issue 23125014: Run VDA::Decode on GPU IO thread if VDA supports it. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Use a separate MessageFilter for GVDA Created 7 years, 3 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
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "base/bind.h" 5 #include "base/bind.h"
6 #include "base/debug/trace_event.h" 6 #include "base/debug/trace_event.h"
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "base/metrics/histogram.h" 8 #include "base/metrics/histogram.h"
9 #include "base/stl_util.h" 9 #include "base/stl_util.h"
10 #include "base/strings/string_util.h" 10 #include "base/strings/string_util.h"
(...skipping 26 matching lines...) Expand all
37 } while (0) 37 } while (0)
38 38
39 VaapiVideoDecodeAccelerator::InputBuffer::InputBuffer() : id(0), size(0) { 39 VaapiVideoDecodeAccelerator::InputBuffer::InputBuffer() : id(0), size(0) {
40 } 40 }
41 41
42 VaapiVideoDecodeAccelerator::InputBuffer::~InputBuffer() { 42 VaapiVideoDecodeAccelerator::InputBuffer::~InputBuffer() {
43 } 43 }
44 44
45 void VaapiVideoDecodeAccelerator::NotifyError(Error error) { 45 void VaapiVideoDecodeAccelerator::NotifyError(Error error) {
46 if (message_loop_ != base::MessageLoop::current()) { 46 if (message_loop_ != base::MessageLoop::current()) {
47 DCHECK_EQ(decoder_thread_.message_loop(), base::MessageLoop::current());
48 message_loop_->PostTask(FROM_HERE, base::Bind( 47 message_loop_->PostTask(FROM_HERE, base::Bind(
49 &VaapiVideoDecodeAccelerator::NotifyError, weak_this_, error)); 48 &VaapiVideoDecodeAccelerator::NotifyError, weak_this_, error));
50 return; 49 return;
51 } 50 }
52 51
53 // Post Cleanup() as a task so we don't recursively acquire lock_. 52 // Post Cleanup() as a task so we don't recursively acquire lock_.
54 message_loop_->PostTask(FROM_HERE, base::Bind( 53 message_loop_->PostTask(FROM_HERE, base::Bind(
55 &VaapiVideoDecodeAccelerator::Cleanup, weak_this_)); 54 &VaapiVideoDecodeAccelerator::Cleanup, weak_this_));
56 55
57 DVLOG(1) << "Notifying of error " << error; 56 DVLOG(1) << "Notifying of error " << error;
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after
235 DVLOG(1) << "Picture id " << picture_buffer_id << " does not exist"; 234 DVLOG(1) << "Picture id " << picture_buffer_id << " does not exist";
236 return NULL; 235 return NULL;
237 } 236 }
238 237
239 return it->second.get(); 238 return it->second.get();
240 } 239 }
241 240
242 VaapiVideoDecodeAccelerator::VaapiVideoDecodeAccelerator( 241 VaapiVideoDecodeAccelerator::VaapiVideoDecodeAccelerator(
243 Display* x_display, GLXContext glx_context, 242 Display* x_display, GLXContext glx_context,
244 Client* client, 243 Client* client,
245 const base::Callback<bool(void)>& make_context_current) 244 const base::Callback<bool(void)>& make_context_current,
245 const scoped_refptr<base::MessageLoopProxy>& io_message_loop);
246 : x_display_(x_display), 246 : x_display_(x_display),
247 glx_context_(glx_context), 247 glx_context_(glx_context),
248 make_context_current_(make_context_current), 248 make_context_current_(make_context_current),
249 state_(kUninitialized), 249 state_(kUninitialized),
250 input_ready_(&lock_), 250 input_ready_(&lock_),
251 surfaces_available_(&lock_), 251 surfaces_available_(&lock_),
252 message_loop_(base::MessageLoop::current()), 252 message_loop_(base::MessageLoop::current()),
253 io_message_loop_(io_message_loop),
253 weak_this_(base::AsWeakPtr(this)), 254 weak_this_(base::AsWeakPtr(this)),
254 client_ptr_factory_(client), 255 client_ptr_factory_(client),
255 client_(client_ptr_factory_.GetWeakPtr()), 256 client_(client_ptr_factory_.GetWeakPtr()),
256 decoder_thread_("VaapiDecoderThread"), 257 decoder_thread_("VaapiDecoderThread"),
257 num_frames_at_client_(0), 258 num_frames_at_client_(0),
258 num_stream_bufs_at_decoder_(0), 259 num_stream_bufs_at_decoder_(0),
259 finish_flush_pending_(false), 260 finish_flush_pending_(false),
260 awaiting_va_surfaces_recycle_(false), 261 awaiting_va_surfaces_recycle_(false),
261 requested_num_pics_(0) { 262 requested_num_pics_(0) {
262 DCHECK(client); 263 DCHECK(client);
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
404 output_buffers_.pop(); 405 output_buffers_.pop();
405 406
406 output_cb.Run(tfp_picture); 407 output_cb.Run(tfp_picture);
407 408
408 if (finish_flush_pending_ && pending_output_cbs_.empty()) 409 if (finish_flush_pending_ && pending_output_cbs_.empty())
409 FinishFlush(); 410 FinishFlush();
410 } 411 }
411 412
412 void VaapiVideoDecodeAccelerator::MapAndQueueNewInputBuffer( 413 void VaapiVideoDecodeAccelerator::MapAndQueueNewInputBuffer(
413 const media::BitstreamBuffer& bitstream_buffer) { 414 const media::BitstreamBuffer& bitstream_buffer) {
414 DCHECK_EQ(message_loop_, base::MessageLoop::current()); 415 DCHECK_EQ(io_message_loop_, base::MessageLoop::current());
415 TRACE_EVENT1("Video Decoder", "MapAndQueueNewInputBuffer", "input_id", 416 TRACE_EVENT1("Video Decoder", "MapAndQueueNewInputBuffer", "input_id",
416 bitstream_buffer.id()); 417 bitstream_buffer.id());
417 418
418 DVLOG(4) << "Mapping new input buffer id: " << bitstream_buffer.id() 419 DVLOG(4) << "Mapping new input buffer id: " << bitstream_buffer.id()
419 << " size: " << (int)bitstream_buffer.size(); 420 << " size: " << (int)bitstream_buffer.size();
420 421
421 scoped_ptr<base::SharedMemory> shm( 422 scoped_ptr<base::SharedMemory> shm(
422 new base::SharedMemory(bitstream_buffer.handle(), true)); 423 new base::SharedMemory(bitstream_buffer.handle(), true));
423 RETURN_AND_NOTIFY_ON_FAILURE(shm->Map(bitstream_buffer.size()), 424 RETURN_AND_NOTIFY_ON_FAILURE(shm->Map(bitstream_buffer.size()),
piman 2013/08/27 04:01:20 The Map() can take a long time. Can you move it to
wuchengli 2013/08/27 12:32:24 I reverted this and let CanDecodeOnIOThread return
424 "Failed to map input buffer", UNREADABLE_INPUT,); 425 "Failed to map input buffer", UNREADABLE_INPUT,);
425 426
426 base::AutoLock auto_lock(lock_); 427 base::AutoLock auto_lock(lock_);
piman 2013/08/27 04:01:20 What else takes this lock? Can it be held for a lo
wuchengli 2013/08/27 12:32:24 I reverted this and let CanDecodeOnIOThread return
427 428
428 // Set up a new input buffer and queue it for later. 429 // Set up a new input buffer and queue it for later.
429 linked_ptr<InputBuffer> input_buffer(new InputBuffer()); 430 linked_ptr<InputBuffer> input_buffer(new InputBuffer());
430 input_buffer->shm.reset(shm.release()); 431 input_buffer->shm.reset(shm.release());
431 input_buffer->id = bitstream_buffer.id(); 432 input_buffer->id = bitstream_buffer.id();
432 input_buffer->size = bitstream_buffer.size(); 433 input_buffer->size = bitstream_buffer.size();
433 434
434 ++num_stream_bufs_at_decoder_; 435 ++num_stream_bufs_at_decoder_;
435 TRACE_COUNTER1("Video Decoder", "Stream buffers at decoder", 436 TRACE_COUNTER1("Video Decoder", "Stream buffers at decoder",
436 num_stream_bufs_at_decoder_); 437 num_stream_bufs_at_decoder_);
(...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after
639 DVLOG(1) << "Requesting " << requested_num_pics_ << " pictures of size: " 640 DVLOG(1) << "Requesting " << requested_num_pics_ << " pictures of size: "
640 << requested_pic_size_.ToString(); 641 << requested_pic_size_.ToString();
641 642
642 message_loop_->PostTask(FROM_HERE, base::Bind( 643 message_loop_->PostTask(FROM_HERE, base::Bind(
643 &Client::ProvidePictureBuffers, client_, 644 &Client::ProvidePictureBuffers, client_,
644 requested_num_pics_, requested_pic_size_, GL_TEXTURE_2D)); 645 requested_num_pics_, requested_pic_size_, GL_TEXTURE_2D));
645 } 646 }
646 647
647 void VaapiVideoDecodeAccelerator::Decode( 648 void VaapiVideoDecodeAccelerator::Decode(
648 const media::BitstreamBuffer& bitstream_buffer) { 649 const media::BitstreamBuffer& bitstream_buffer) {
649 DCHECK_EQ(message_loop_, base::MessageLoop::current()); 650 DCHECK_EQ(io_message_loop_, base::MessageLoop::current());
650 651
651 TRACE_EVENT1("Video Decoder", "VAVDA::Decode", "Buffer id", 652 TRACE_EVENT1("Video Decoder", "VAVDA::Decode", "Buffer id",
652 bitstream_buffer.id()); 653 bitstream_buffer.id());
653 654
654 // We got a new input buffer from the client, map it and queue for later use. 655 // We got a new input buffer from the client, map it and queue for later use.
655 MapAndQueueNewInputBuffer(bitstream_buffer); 656 MapAndQueueNewInputBuffer(bitstream_buffer);
656 657
657 base::AutoLock auto_lock(lock_); 658 base::AutoLock auto_lock(lock_);
658 switch (state_) { 659 switch (state_) {
659 case kIdle: 660 case kIdle:
(...skipping 265 matching lines...) Expand 10 before | Expand all | Expand 10 after
925 state_ = kUninitialized; 926 state_ = kUninitialized;
926 } 927 }
927 928
928 void VaapiVideoDecodeAccelerator::Destroy() { 929 void VaapiVideoDecodeAccelerator::Destroy() {
929 DCHECK_EQ(message_loop_, base::MessageLoop::current()); 930 DCHECK_EQ(message_loop_, base::MessageLoop::current());
930 Cleanup(); 931 Cleanup();
931 delete this; 932 delete this;
932 } 933 }
933 934
934 } // namespace content 935 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698