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

Side by Side Diff: media/filters/gpu_video_decoder.cc

Issue 132233041: Add gpu::MailboxHolder to hold state for a gpu::Mailbox (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: ff7262fa Rebase. Created 6 years, 10 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 | Annotate | Revision Log
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 "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
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(), &timestamp, &visible_rect, 441 GetBufferData(picture.bitstream_buffer_id(), &timestamp, &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
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
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
OLDNEW
« no previous file with comments | « media/filters/gpu_video_decoder.h ('k') | webkit/renderer/compositor_bindings/web_external_texture_layer_impl.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698