| OLD | NEW |
| 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 "content/common/gpu/media/vaapi_video_decode_accelerator.h" | 5 #include "content/common/gpu/media/vaapi_video_decode_accelerator.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/logging.h" | 8 #include "base/logging.h" |
| 9 #include "base/metrics/histogram.h" | 9 #include "base/metrics/histogram.h" |
| 10 #include "base/stl_util.h" | 10 #include "base/stl_util.h" |
| (...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 247 private: | 247 private: |
| 248 scoped_refptr<VaapiDecodeSurface> VP9PictureToVaapiDecodeSurface( | 248 scoped_refptr<VaapiDecodeSurface> VP9PictureToVaapiDecodeSurface( |
| 249 const scoped_refptr<VP9Picture>& pic); | 249 const scoped_refptr<VP9Picture>& pic); |
| 250 | 250 |
| 251 VaapiWrapper* vaapi_wrapper_; | 251 VaapiWrapper* vaapi_wrapper_; |
| 252 VaapiVideoDecodeAccelerator* vaapi_dec_; | 252 VaapiVideoDecodeAccelerator* vaapi_dec_; |
| 253 | 253 |
| 254 DISALLOW_COPY_AND_ASSIGN(VaapiVP9Accelerator); | 254 DISALLOW_COPY_AND_ASSIGN(VaapiVP9Accelerator); |
| 255 }; | 255 }; |
| 256 | 256 |
| 257 VaapiVideoDecodeAccelerator::InputBuffer::InputBuffer() : id(0), size(0) { | 257 VaapiVideoDecodeAccelerator::InputBuffer::InputBuffer() : id(0) {} |
| 258 } | |
| 259 | 258 |
| 260 VaapiVideoDecodeAccelerator::InputBuffer::~InputBuffer() { | 259 VaapiVideoDecodeAccelerator::InputBuffer::~InputBuffer() { |
| 261 } | 260 } |
| 262 | 261 |
| 263 void VaapiVideoDecodeAccelerator::NotifyError(Error error) { | 262 void VaapiVideoDecodeAccelerator::NotifyError(Error error) { |
| 264 if (message_loop_ != base::MessageLoop::current()) { | 263 if (message_loop_ != base::MessageLoop::current()) { |
| 265 DCHECK(decoder_thread_task_runner_->BelongsToCurrentThread()); | 264 DCHECK(decoder_thread_task_runner_->BelongsToCurrentThread()); |
| 266 message_loop_->PostTask(FROM_HERE, base::Bind( | 265 message_loop_->PostTask(FROM_HERE, base::Bind( |
| 267 &VaapiVideoDecodeAccelerator::NotifyError, weak_this_, error)); | 266 &VaapiVideoDecodeAccelerator::NotifyError, weak_this_, error)); |
| 268 return; | 267 return; |
| (...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 438 | 437 |
| 439 void VaapiVideoDecodeAccelerator::MapAndQueueNewInputBuffer( | 438 void VaapiVideoDecodeAccelerator::MapAndQueueNewInputBuffer( |
| 440 const media::BitstreamBuffer& bitstream_buffer) { | 439 const media::BitstreamBuffer& bitstream_buffer) { |
| 441 DCHECK_EQ(message_loop_, base::MessageLoop::current()); | 440 DCHECK_EQ(message_loop_, base::MessageLoop::current()); |
| 442 TRACE_EVENT1("Video Decoder", "MapAndQueueNewInputBuffer", "input_id", | 441 TRACE_EVENT1("Video Decoder", "MapAndQueueNewInputBuffer", "input_id", |
| 443 bitstream_buffer.id()); | 442 bitstream_buffer.id()); |
| 444 | 443 |
| 445 DVLOG(4) << "Mapping new input buffer id: " << bitstream_buffer.id() | 444 DVLOG(4) << "Mapping new input buffer id: " << bitstream_buffer.id() |
| 446 << " size: " << (int)bitstream_buffer.size(); | 445 << " size: " << (int)bitstream_buffer.size(); |
| 447 | 446 |
| 448 scoped_ptr<base::SharedMemory> shm( | 447 scoped_ptr<SharedMemoryRegion> shm( |
| 449 new base::SharedMemory(bitstream_buffer.handle(), true)); | 448 new SharedMemoryRegion(bitstream_buffer, true)); |
| 450 RETURN_AND_NOTIFY_ON_FAILURE(shm->Map(bitstream_buffer.size()), | 449 RETURN_AND_NOTIFY_ON_FAILURE(shm->Map(), "Failed to map input buffer", |
| 451 "Failed to map input buffer", UNREADABLE_INPUT,); | 450 UNREADABLE_INPUT, ); |
| 452 | 451 |
| 453 base::AutoLock auto_lock(lock_); | 452 base::AutoLock auto_lock(lock_); |
| 454 | 453 |
| 455 // Set up a new input buffer and queue it for later. | 454 // Set up a new input buffer and queue it for later. |
| 456 linked_ptr<InputBuffer> input_buffer(new InputBuffer()); | 455 linked_ptr<InputBuffer> input_buffer(new InputBuffer()); |
| 457 input_buffer->shm.reset(shm.release()); | 456 input_buffer->shm.reset(shm.release()); |
| 458 input_buffer->id = bitstream_buffer.id(); | 457 input_buffer->id = bitstream_buffer.id(); |
| 459 input_buffer->size = bitstream_buffer.size(); | |
| 460 | 458 |
| 461 ++num_stream_bufs_at_decoder_; | 459 ++num_stream_bufs_at_decoder_; |
| 462 TRACE_COUNTER1("Video Decoder", "Stream buffers at decoder", | 460 TRACE_COUNTER1("Video Decoder", "Stream buffers at decoder", |
| 463 num_stream_bufs_at_decoder_); | 461 num_stream_bufs_at_decoder_); |
| 464 | 462 |
| 465 input_buffers_.push(input_buffer); | 463 input_buffers_.push(input_buffer); |
| 466 input_ready_.Signal(); | 464 input_ready_.Signal(); |
| 467 } | 465 } |
| 468 | 466 |
| 469 bool VaapiVideoDecodeAccelerator::GetInputBuffer_Locked() { | 467 bool VaapiVideoDecodeAccelerator::GetInputBuffer_Locked() { |
| (...skipping 18 matching lines...) Expand all Loading... |
| 488 if (input_buffers_.empty()) | 486 if (input_buffers_.empty()) |
| 489 return false; | 487 return false; |
| 490 // else fallthrough | 488 // else fallthrough |
| 491 case kDecoding: | 489 case kDecoding: |
| 492 case kIdle: | 490 case kIdle: |
| 493 DCHECK(!input_buffers_.empty()); | 491 DCHECK(!input_buffers_.empty()); |
| 494 | 492 |
| 495 curr_input_buffer_ = input_buffers_.front(); | 493 curr_input_buffer_ = input_buffers_.front(); |
| 496 input_buffers_.pop(); | 494 input_buffers_.pop(); |
| 497 | 495 |
| 498 DVLOG(4) << "New current bitstream buffer, id: " | 496 DVLOG(4) << "New current bitstream buffer, id: " << curr_input_buffer_->id |
| 499 << curr_input_buffer_->id | 497 << " size: " << curr_input_buffer_->shm->size(); |
| 500 << " size: " << curr_input_buffer_->size; | |
| 501 | 498 |
| 502 decoder_->SetStream( | 499 decoder_->SetStream( |
| 503 static_cast<uint8*>(curr_input_buffer_->shm->memory()), | 500 static_cast<uint8*>(curr_input_buffer_->shm->memory()), |
| 504 curr_input_buffer_->size); | 501 curr_input_buffer_->shm->size()); |
| 505 return true; | 502 return true; |
| 506 | 503 |
| 507 default: | 504 default: |
| 508 // We got woken up due to being destroyed/reset, ignore any already | 505 // We got woken up due to being destroyed/reset, ignore any already |
| 509 // queued inputs. | 506 // queued inputs. |
| 510 return false; | 507 return false; |
| 511 } | 508 } |
| 512 } | 509 } |
| 513 | 510 |
| 514 void VaapiVideoDecodeAccelerator::ReturnCurrInputBuffer_Locked() { | 511 void VaapiVideoDecodeAccelerator::ReturnCurrInputBuffer_Locked() { |
| (...skipping 1224 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1739 return vaapi_pic->dec_surface(); | 1736 return vaapi_pic->dec_surface(); |
| 1740 } | 1737 } |
| 1741 | 1738 |
| 1742 // static | 1739 // static |
| 1743 media::VideoDecodeAccelerator::SupportedProfiles | 1740 media::VideoDecodeAccelerator::SupportedProfiles |
| 1744 VaapiVideoDecodeAccelerator::GetSupportedProfiles() { | 1741 VaapiVideoDecodeAccelerator::GetSupportedProfiles() { |
| 1745 return VaapiWrapper::GetSupportedDecodeProfiles(); | 1742 return VaapiWrapper::GetSupportedDecodeProfiles(); |
| 1746 } | 1743 } |
| 1747 | 1744 |
| 1748 } // namespace content | 1745 } // namespace content |
| OLD | NEW |