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_current_loop.h" | 17 #include "media/base/bind_to_current_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 scoped_ptr<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 |