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

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

Issue 105743004: Add gpu::MailboxHolder to hold state for a gpu::Mailbox (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: cc2a95fe Android fixes. Created 7 years 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"
(...skipping 423 matching lines...) Expand 10 before | Expand all | Expand 10 after
434 434
435 // Update frame's timestamp. 435 // Update frame's timestamp.
436 base::TimeDelta timestamp; 436 base::TimeDelta timestamp;
437 gfx::Rect visible_rect; 437 gfx::Rect visible_rect;
438 gfx::Size natural_size; 438 gfx::Size natural_size;
439 GetBufferData(picture.bitstream_buffer_id(), &timestamp, &visible_rect, 439 GetBufferData(picture.bitstream_buffer_id(), &timestamp, &visible_rect,
440 &natural_size); 440 &natural_size);
441 DCHECK(decoder_texture_target_); 441 DCHECK(decoder_texture_target_);
442 442
443 scoped_refptr<VideoFrame> frame(VideoFrame::WrapNativeTexture( 443 scoped_refptr<VideoFrame> frame(VideoFrame::WrapNativeTexture(
444 make_scoped_ptr(new VideoFrame::MailboxHolder( 444 make_scoped_ptr(new gpu::MailboxHolder(
445 pb.texture_mailbox(), 445 pb.texture_mailbox(), decoder_texture_target_, 0 /* sync_point */)),
446 0, // sync_point 446 BindToCurrentLoop(base::Bind(&GpuVideoDecoder::ReusePictureBuffer,
447 BindToCurrentLoop(base::Bind(&GpuVideoDecoder::ReusePictureBuffer, 447 weak_this_,
448 weak_this_, 448 picture.picture_buffer_id())),
449 picture.picture_buffer_id())))),
450 decoder_texture_target_,
451 pb.size(), 449 pb.size(),
452 visible_rect, 450 visible_rect,
453 natural_size, 451 natural_size,
454 timestamp, 452 timestamp,
455 base::Bind(&GpuVideoAcceleratorFactories::ReadPixels, 453 base::Bind(&GpuVideoAcceleratorFactories::ReadPixels,
456 factories_, 454 factories_,
457 pb.texture_id(), 455 pb.texture_id(),
458 gfx::Size(visible_rect.width(), visible_rect.height())), 456 gfx::Size(visible_rect.width(), visible_rect.height()))));
459 base::Closure()));
460 CHECK_GT(available_pictures_, 0); 457 CHECK_GT(available_pictures_, 0);
461 --available_pictures_; 458 --available_pictures_;
462 bool inserted = 459 bool inserted =
463 picture_buffers_at_display_.insert(picture.picture_buffer_id()).second; 460 picture_buffers_at_display_.insert(picture.picture_buffer_id()).second;
464 DCHECK(inserted); 461 DCHECK(inserted);
465 462
466 EnqueueFrameAndTriggerFrameDelivery(frame); 463 EnqueueFrameAndTriggerFrameDelivery(frame);
467 } 464 }
468 465
469 void GpuVideoDecoder::EnqueueFrameAndTriggerFrameDelivery( 466 void GpuVideoDecoder::EnqueueFrameAndTriggerFrameDelivery(
(...skipping 11 matching lines...) Expand all
481 DCHECK(!ready_video_frames_.empty()); 478 DCHECK(!ready_video_frames_.empty());
482 479
483 if (pending_decode_cb_.is_null()) 480 if (pending_decode_cb_.is_null())
484 return; 481 return;
485 482
486 base::ResetAndReturn(&pending_decode_cb_) 483 base::ResetAndReturn(&pending_decode_cb_)
487 .Run(kOk, ready_video_frames_.front()); 484 .Run(kOk, ready_video_frames_.front());
488 ready_video_frames_.pop_front(); 485 ready_video_frames_.pop_front();
489 } 486 }
490 487
491 void GpuVideoDecoder::ReusePictureBuffer(int64 picture_buffer_id, 488 void GpuVideoDecoder::ReusePictureBuffer(
492 uint32 sync_point) { 489 int64 picture_buffer_id,
490 scoped_ptr<gpu::MailboxHolder> mailbox_holder) {
493 DVLOG(3) << "ReusePictureBuffer(" << picture_buffer_id << ")"; 491 DVLOG(3) << "ReusePictureBuffer(" << picture_buffer_id << ")";
494 DCHECK(gvd_loop_proxy_->BelongsToCurrentThread()); 492 DCHECK(gvd_loop_proxy_->BelongsToCurrentThread());
495 493
496 if (!vda_) 494 if (!vda_)
497 return; 495 return;
498 496
499 CHECK(!picture_buffers_at_display_.empty()); 497 CHECK(!picture_buffers_at_display_.empty());
500 498
501 size_t num_erased = picture_buffers_at_display_.erase(picture_buffer_id); 499 size_t num_erased = picture_buffers_at_display_.erase(picture_buffer_id);
502 DCHECK(num_erased); 500 DCHECK(num_erased);
503 501
504 PictureBufferMap::iterator it = 502 PictureBufferMap::iterator it =
505 assigned_picture_buffers_.find(picture_buffer_id); 503 assigned_picture_buffers_.find(picture_buffer_id);
506 504
507 if (it == assigned_picture_buffers_.end()) { 505 if (it == assigned_picture_buffers_.end()) {
508 // This picture was dismissed while in display, so we postponed deletion. 506 // This picture was dismissed while in display, so we postponed deletion.
509 it = dismissed_picture_buffers_.find(picture_buffer_id); 507 it = dismissed_picture_buffers_.find(picture_buffer_id);
510 DCHECK(it != dismissed_picture_buffers_.end()); 508 DCHECK(it != dismissed_picture_buffers_.end());
511 factories_->DeleteTexture(it->second.texture_id()); 509 factories_->DeleteTexture(it->second.texture_id());
512 dismissed_picture_buffers_.erase(it); 510 dismissed_picture_buffers_.erase(it);
513 return; 511 return;
514 } 512 }
515 513
516 factories_->WaitSyncPoint(sync_point); 514 factories_->WaitSyncPoint(mailbox_holder->sync_point());
517 ++available_pictures_; 515 ++available_pictures_;
518 516
519 vda_->ReusePictureBuffer(picture_buffer_id); 517 vda_->ReusePictureBuffer(picture_buffer_id);
520 } 518 }
521 519
522 GpuVideoDecoder::SHMBuffer* GpuVideoDecoder::GetSHM(size_t min_size) { 520 GpuVideoDecoder::SHMBuffer* GpuVideoDecoder::GetSHM(size_t min_size) {
523 DCHECK(gvd_loop_proxy_->BelongsToCurrentThread()); 521 DCHECK(gvd_loop_proxy_->BelongsToCurrentThread());
524 if (available_shm_segments_.empty() || 522 if (available_shm_segments_.empty() ||
525 available_shm_segments_.back()->size < min_size) { 523 available_shm_segments_.back()->size < min_size) {
526 size_t size_to_allocate = std::max(min_size, kSharedMemorySegmentBytes); 524 size_t size_to_allocate = std::max(min_size, kSharedMemorySegmentBytes);
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
615 613
616 state_ = kError; 614 state_ = kError;
617 615
618 if (!pending_decode_cb_.is_null()) { 616 if (!pending_decode_cb_.is_null()) {
619 base::ResetAndReturn(&pending_decode_cb_).Run(kDecodeError, NULL); 617 base::ResetAndReturn(&pending_decode_cb_).Run(kDecodeError, NULL);
620 return; 618 return;
621 } 619 }
622 } 620 }
623 621
624 } // namespace media 622 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698