| 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/metrics/histogram.h" | 13 #include "base/metrics/histogram.h" |
| 14 #include "base/stl_util.h" | 14 #include "base/stl_util.h" |
| 15 #include "base/task_runner_util.h" | 15 #include "base/task_runner_util.h" |
| 16 #include "gpu/command_buffer/common/mailbox_holder.h" |
| 16 #include "media/base/bind_to_loop.h" | 17 #include "media/base/bind_to_loop.h" |
| 17 #include "media/base/decoder_buffer.h" | 18 #include "media/base/decoder_buffer.h" |
| 18 #include "media/base/media_log.h" | 19 #include "media/base/media_log.h" |
| 19 #include "media/base/pipeline.h" | 20 #include "media/base/pipeline.h" |
| 20 #include "media/base/pipeline_status.h" | 21 #include "media/base/pipeline_status.h" |
| 21 #include "media/base/video_decoder_config.h" | 22 #include "media/base/video_decoder_config.h" |
| 22 #include "media/filters/gpu_video_accelerator_factories.h" | 23 #include "media/filters/gpu_video_accelerator_factories.h" |
| 23 | 24 |
| 24 namespace media { | 25 namespace media { |
| 25 | 26 |
| (...skipping 409 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 435 | 436 |
| 436 // Update frame's timestamp. | 437 // Update frame's timestamp. |
| 437 base::TimeDelta timestamp; | 438 base::TimeDelta timestamp; |
| 438 gfx::Rect visible_rect; | 439 gfx::Rect visible_rect; |
| 439 gfx::Size natural_size; | 440 gfx::Size natural_size; |
| 440 GetBufferData(picture.bitstream_buffer_id(), ×tamp, &visible_rect, | 441 GetBufferData(picture.bitstream_buffer_id(), ×tamp, &visible_rect, |
| 441 &natural_size); | 442 &natural_size); |
| 442 DCHECK(decoder_texture_target_); | 443 DCHECK(decoder_texture_target_); |
| 443 | 444 |
| 444 scoped_refptr<VideoFrame> frame(VideoFrame::WrapNativeTexture( | 445 scoped_refptr<VideoFrame> frame(VideoFrame::WrapNativeTexture( |
| 445 make_scoped_ptr(new VideoFrame::MailboxHolder( | 446 make_scoped_ptr(new gpu::MailboxHolder( |
| 446 pb.texture_mailbox(), | 447 pb.texture_mailbox(), decoder_texture_target_, 0 /* sync_point */)), |
| 447 0, // sync_point | 448 BindToCurrentLoop(base::Bind(&GpuVideoDecoder::ReusePictureBuffer, |
| 448 BindToCurrentLoop(base::Bind(&GpuVideoDecoder::ReusePictureBuffer, | 449 weak_this_, |
| 449 weak_this_, | 450 picture.picture_buffer_id())), |
| 450 picture.picture_buffer_id())))), | |
| 451 decoder_texture_target_, | |
| 452 pb.size(), | 451 pb.size(), |
| 453 visible_rect, | 452 visible_rect, |
| 454 natural_size, | 453 natural_size, |
| 455 timestamp, | 454 timestamp, |
| 456 base::Bind(&GpuVideoAcceleratorFactories::ReadPixels, | 455 base::Bind(&GpuVideoAcceleratorFactories::ReadPixels, |
| 457 factories_, | 456 factories_, |
| 458 pb.texture_id(), | 457 pb.texture_id(), |
| 459 gfx::Size(visible_rect.width(), visible_rect.height())), | 458 gfx::Size(visible_rect.width(), visible_rect.height())))); |
| 460 base::Closure())); | |
| 461 CHECK_GT(available_pictures_, 0); | 459 CHECK_GT(available_pictures_, 0); |
| 462 --available_pictures_; | 460 --available_pictures_; |
| 463 bool inserted = | 461 bool inserted = |
| 464 picture_buffers_at_display_.insert(picture.picture_buffer_id()).second; | 462 picture_buffers_at_display_.insert(picture.picture_buffer_id()).second; |
| 465 DCHECK(inserted); | 463 DCHECK(inserted); |
| 466 | 464 |
| 467 EnqueueFrameAndTriggerFrameDelivery(frame); | 465 EnqueueFrameAndTriggerFrameDelivery(frame); |
| 468 } | 466 } |
| 469 | 467 |
| 470 void GpuVideoDecoder::EnqueueFrameAndTriggerFrameDelivery( | 468 void GpuVideoDecoder::EnqueueFrameAndTriggerFrameDelivery( |
| (...skipping 11 matching lines...) Expand all Loading... |
| 482 DCHECK(!ready_video_frames_.empty()); | 480 DCHECK(!ready_video_frames_.empty()); |
| 483 | 481 |
| 484 if (pending_decode_cb_.is_null()) | 482 if (pending_decode_cb_.is_null()) |
| 485 return; | 483 return; |
| 486 | 484 |
| 487 base::ResetAndReturn(&pending_decode_cb_) | 485 base::ResetAndReturn(&pending_decode_cb_) |
| 488 .Run(kOk, ready_video_frames_.front()); | 486 .Run(kOk, ready_video_frames_.front()); |
| 489 ready_video_frames_.pop_front(); | 487 ready_video_frames_.pop_front(); |
| 490 } | 488 } |
| 491 | 489 |
| 492 void GpuVideoDecoder::ReusePictureBuffer(int64 picture_buffer_id, | 490 void GpuVideoDecoder::ReusePictureBuffer( |
| 493 uint32 sync_point) { | 491 int64 picture_buffer_id, |
| 492 const gpu::MailboxHolder* mailbox_holder) { |
| 494 DVLOG(3) << "ReusePictureBuffer(" << picture_buffer_id << ")"; | 493 DVLOG(3) << "ReusePictureBuffer(" << picture_buffer_id << ")"; |
| 495 DCheckGpuVideoAcceleratorFactoriesTaskRunnerIsCurrent(); | 494 DCheckGpuVideoAcceleratorFactoriesTaskRunnerIsCurrent(); |
| 496 | 495 |
| 497 if (!vda_) | 496 if (!vda_) |
| 498 return; | 497 return; |
| 499 | 498 |
| 500 CHECK(!picture_buffers_at_display_.empty()); | 499 CHECK(!picture_buffers_at_display_.empty()); |
| 501 | 500 |
| 502 size_t num_erased = picture_buffers_at_display_.erase(picture_buffer_id); | 501 size_t num_erased = picture_buffers_at_display_.erase(picture_buffer_id); |
| 503 DCHECK(num_erased); | 502 DCHECK(num_erased); |
| 504 | 503 |
| 505 PictureBufferMap::iterator it = | 504 PictureBufferMap::iterator it = |
| 506 assigned_picture_buffers_.find(picture_buffer_id); | 505 assigned_picture_buffers_.find(picture_buffer_id); |
| 507 | 506 |
| 508 if (it == assigned_picture_buffers_.end()) { | 507 if (it == assigned_picture_buffers_.end()) { |
| 509 // This picture was dismissed while in display, so we postponed deletion. | 508 // This picture was dismissed while in display, so we postponed deletion. |
| 510 it = dismissed_picture_buffers_.find(picture_buffer_id); | 509 it = dismissed_picture_buffers_.find(picture_buffer_id); |
| 511 DCHECK(it != dismissed_picture_buffers_.end()); | 510 DCHECK(it != dismissed_picture_buffers_.end()); |
| 512 factories_->DeleteTexture(it->second.texture_id()); | 511 factories_->DeleteTexture(it->second.texture_id()); |
| 513 dismissed_picture_buffers_.erase(it); | 512 dismissed_picture_buffers_.erase(it); |
| 514 return; | 513 return; |
| 515 } | 514 } |
| 516 | 515 |
| 517 factories_->WaitSyncPoint(sync_point); | 516 factories_->WaitSyncPoint(mailbox_holder->sync_point); |
| 518 ++available_pictures_; | 517 ++available_pictures_; |
| 519 | 518 |
| 520 vda_->ReusePictureBuffer(picture_buffer_id); | 519 vda_->ReusePictureBuffer(picture_buffer_id); |
| 521 } | 520 } |
| 522 | 521 |
| 523 GpuVideoDecoder::SHMBuffer* GpuVideoDecoder::GetSHM(size_t min_size) { | 522 GpuVideoDecoder::SHMBuffer* GpuVideoDecoder::GetSHM(size_t min_size) { |
| 524 DCheckGpuVideoAcceleratorFactoriesTaskRunnerIsCurrent(); | 523 DCheckGpuVideoAcceleratorFactoriesTaskRunnerIsCurrent(); |
| 525 if (available_shm_segments_.empty() || | 524 if (available_shm_segments_.empty() || |
| 526 available_shm_segments_.back()->size < min_size) { | 525 available_shm_segments_.back()->size < min_size) { |
| 527 size_t size_to_allocate = std::max(min_size, kSharedMemorySegmentBytes); | 526 size_t size_to_allocate = std::max(min_size, kSharedMemorySegmentBytes); |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 621 return; | 620 return; |
| 622 } | 621 } |
| 623 } | 622 } |
| 624 | 623 |
| 625 void GpuVideoDecoder::DCheckGpuVideoAcceleratorFactoriesTaskRunnerIsCurrent() | 624 void GpuVideoDecoder::DCheckGpuVideoAcceleratorFactoriesTaskRunnerIsCurrent() |
| 626 const { | 625 const { |
| 627 DCHECK(factories_->GetTaskRunner()->BelongsToCurrentThread()); | 626 DCHECK(factories_->GetTaskRunner()->BelongsToCurrentThread()); |
| 628 } | 627 } |
| 629 | 628 |
| 630 } // namespace media | 629 } // namespace media |
| OLD | NEW |