| 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 "media/filters/gpu_video_decoder.h" | 5 #include "media/filters/gpu_video_decoder.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/callback_helpers.h" | 10 #include "base/callback_helpers.h" |
| 11 #include "base/cpu.h" | 11 #include "base/cpu.h" |
| 12 #include "base/message_loop/message_loop.h" | 12 #include "base/message_loop/message_loop.h" |
| 13 #include "base/stl_util.h" | 13 #include "base/stl_util.h" |
| 14 #include "base/task_runner_util.h" | 14 #include "base/task_runner_util.h" |
| 15 #include "media/base/bind_to_loop.h" | 15 #include "media/base/bind_to_loop.h" |
| 16 #include "media/base/decoder_buffer.h" | 16 #include "media/base/decoder_buffer.h" |
| 17 #include "media/base/media_log.h" | 17 #include "media/base/media_log.h" |
| 18 #include "media/base/pipeline.h" | 18 #include "media/base/pipeline.h" |
| 19 #include "media/base/pipeline_status.h" | 19 #include "media/base/pipeline_status.h" |
| 20 #include "media/base/video_decoder_config.h" | 20 #include "media/base/video_decoder_config.h" |
| 21 #include "media/filters/gpu_video_accelerator_factories.h" | 21 #include "media/filters/gpu_video_accelerator_factories.h" |
| 22 #include "third_party/skia/include/core/SkBitmap.h" |
| 22 | 23 |
| 23 namespace media { | 24 namespace media { |
| 24 | 25 |
| 25 // Maximum number of concurrent VDA::Decode() operations GVD will maintain. | 26 // Maximum number of concurrent VDA::Decode() operations GVD will maintain. |
| 26 // Higher values allow better pipelining in the GPU, but also require more | 27 // Higher values allow better pipelining in the GPU, but also require more |
| 27 // resources. | 28 // resources. |
| 28 enum { kMaxInFlightDecodes = 4 }; | 29 enum { kMaxInFlightDecodes = 4 }; |
| 29 | 30 |
| 30 // Size of shared-memory segments we allocate. Since we reuse them we let them | 31 // Size of shared-memory segments we allocate. Since we reuse them we let them |
| 31 // be on the beefy side. | 32 // be on the beefy side. |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 65 next_picture_buffer_id_(0), | 66 next_picture_buffer_id_(0), |
| 66 next_bitstream_buffer_id_(0), | 67 next_bitstream_buffer_id_(0), |
| 67 available_pictures_(0) { | 68 available_pictures_(0) { |
| 68 DCHECK(factories_.get()); | 69 DCHECK(factories_.get()); |
| 69 } | 70 } |
| 70 | 71 |
| 71 void GpuVideoDecoder::Reset(const base::Closure& closure) { | 72 void GpuVideoDecoder::Reset(const base::Closure& closure) { |
| 72 DVLOG(3) << "Reset()"; | 73 DVLOG(3) << "Reset()"; |
| 73 DCHECK(gvd_loop_proxy_->BelongsToCurrentThread()); | 74 DCHECK(gvd_loop_proxy_->BelongsToCurrentThread()); |
| 74 | 75 |
| 75 if (state_ == kDrainingDecoder && !factories_->IsAborted()) { | 76 if (state_ == kDrainingDecoder) { |
| 76 gvd_loop_proxy_->PostTask(FROM_HERE, base::Bind( | 77 gvd_loop_proxy_->PostTask(FROM_HERE, base::Bind( |
| 77 &GpuVideoDecoder::Reset, weak_this_, closure)); | 78 &GpuVideoDecoder::Reset, weak_this_, closure)); |
| 78 // NOTE: if we're deferring Reset() until a Flush() completes, return | 79 // NOTE: if we're deferring Reset() until a Flush() completes, return |
| 79 // queued pictures to the VDA so they can be used to finish that Flush(). | 80 // queued pictures to the VDA so they can be used to finish that Flush(). |
| 80 if (pending_decode_cb_.is_null()) | 81 if (pending_decode_cb_.is_null()) |
| 81 ready_video_frames_.clear(); | 82 ready_video_frames_.clear(); |
| 82 return; | 83 return; |
| 83 } | 84 } |
| 84 | 85 |
| 85 // Throw away any already-decoded, not-yet-delivered frames. | 86 // Throw away any already-decoded, not-yet-delivered frames. |
| (...skipping 347 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 433 pb.texture_mailbox(), | 434 pb.texture_mailbox(), |
| 434 0, // sync_point | 435 0, // sync_point |
| 435 BindToCurrentLoop(base::Bind(&GpuVideoDecoder::ReusePictureBuffer, | 436 BindToCurrentLoop(base::Bind(&GpuVideoDecoder::ReusePictureBuffer, |
| 436 weak_this_, | 437 weak_this_, |
| 437 picture.picture_buffer_id()))), | 438 picture.picture_buffer_id()))), |
| 438 decoder_texture_target_, | 439 decoder_texture_target_, |
| 439 pb.size(), | 440 pb.size(), |
| 440 visible_rect, | 441 visible_rect, |
| 441 natural_size, | 442 natural_size, |
| 442 timestamp, | 443 timestamp, |
| 443 base::Bind(&GpuVideoAcceleratorFactories::ReadPixels, | 444 media::BindToLoopSync( |
| 444 factories_, | 445 factories_->GetMessageLoop(), |
| 445 pb.texture_id(), | 446 base::Bind(&GpuVideoAcceleratorFactories::ReadPixels, |
| 446 gfx::Size(visible_rect.width(), visible_rect.height())), | 447 factories_, |
| 448 pb.texture_id(), |
| 449 gfx::Size(visible_rect.width(), visible_rect.height()))), |
| 447 base::Closure())); | 450 base::Closure())); |
| 448 CHECK_GT(available_pictures_, 0); | 451 CHECK_GT(available_pictures_, 0); |
| 449 --available_pictures_; | 452 --available_pictures_; |
| 450 bool inserted = | 453 bool inserted = |
| 451 picture_buffers_at_display_.insert(picture.picture_buffer_id()).second; | 454 picture_buffers_at_display_.insert(picture.picture_buffer_id()).second; |
| 452 DCHECK(inserted); | 455 DCHECK(inserted); |
| 453 | 456 |
| 454 EnqueueFrameAndTriggerFrameDelivery(frame); | 457 EnqueueFrameAndTriggerFrameDelivery(frame); |
| 455 } | 458 } |
| 456 | 459 |
| (...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 603 | 606 |
| 604 state_ = kError; | 607 state_ = kError; |
| 605 | 608 |
| 606 if (!pending_decode_cb_.is_null()) { | 609 if (!pending_decode_cb_.is_null()) { |
| 607 base::ResetAndReturn(&pending_decode_cb_).Run(kDecodeError, NULL); | 610 base::ResetAndReturn(&pending_decode_cb_).Run(kDecodeError, NULL); |
| 608 return; | 611 return; |
| 609 } | 612 } |
| 610 } | 613 } |
| 611 | 614 |
| 612 } // namespace media | 615 } // namespace media |
| OLD | NEW |