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

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

Issue 2881553002: Add |texture_target_| and |pixel_format_| to media::PictureBuffer (Closed)
Patch Set: removed IPC changes Created 3 years, 7 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
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 #include <array> 8 #include <array>
9 #include <utility> 9 #include <utility>
10 10
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
114 GpuVideoDecoder::GpuVideoDecoder( 114 GpuVideoDecoder::GpuVideoDecoder(
115 GpuVideoAcceleratorFactories* factories, 115 GpuVideoAcceleratorFactories* factories,
116 const RequestOverlayInfoCB& request_overlay_info_cb, 116 const RequestOverlayInfoCB& request_overlay_info_cb,
117 MediaLog* media_log) 117 MediaLog* media_log)
118 : needs_bitstream_conversion_(false), 118 : needs_bitstream_conversion_(false),
119 factories_(factories), 119 factories_(factories),
120 request_overlay_info_cb_(request_overlay_info_cb), 120 request_overlay_info_cb_(request_overlay_info_cb),
121 media_log_(media_log), 121 media_log_(media_log),
122 vda_initialized_(false), 122 vda_initialized_(false),
123 state_(kNormal), 123 state_(kNormal),
124 decoder_texture_target_(0),
125 pixel_format_(PIXEL_FORMAT_UNKNOWN),
126 next_picture_buffer_id_(0), 124 next_picture_buffer_id_(0),
127 next_bitstream_buffer_id_(0), 125 next_bitstream_buffer_id_(0),
128 available_pictures_(0), 126 available_pictures_(0),
129 needs_all_picture_buffers_to_decode_(false), 127 needs_all_picture_buffers_to_decode_(false),
130 supports_deferred_initialization_(false), 128 supports_deferred_initialization_(false),
131 requires_texture_copy_(false), 129 requires_texture_copy_(false),
132 cdm_id_(CdmContext::kInvalidCdmId), 130 cdm_id_(CdmContext::kInvalidCdmId),
133 weak_factory_(this) { 131 weak_factory_(this) {
134 DCHECK(factories_); 132 DCHECK(factories_);
135 } 133 }
(...skipping 397 matching lines...) Expand 10 before | Expand all | Expand 10 after
533 VideoPixelFormat format, 531 VideoPixelFormat format,
534 uint32_t textures_per_buffer, 532 uint32_t textures_per_buffer,
535 const gfx::Size& size, 533 const gfx::Size& size,
536 uint32_t texture_target) { 534 uint32_t texture_target) {
537 DVLOG(3) << "ProvidePictureBuffers(" << count << ", " 535 DVLOG(3) << "ProvidePictureBuffers(" << count << ", "
538 << size.width() << "x" << size.height() << ")"; 536 << size.width() << "x" << size.height() << ")";
539 DCheckGpuVideoAcceleratorFactoriesTaskRunnerIsCurrent(); 537 DCheckGpuVideoAcceleratorFactoriesTaskRunnerIsCurrent();
540 538
541 std::vector<uint32_t> texture_ids; 539 std::vector<uint32_t> texture_ids;
542 std::vector<gpu::Mailbox> texture_mailboxes; 540 std::vector<gpu::Mailbox> texture_mailboxes;
543 decoder_texture_target_ = texture_target;
544 541
545 if (format == PIXEL_FORMAT_UNKNOWN) { 542 if (format == PIXEL_FORMAT_UNKNOWN) {
546 format = IsOpaque(config_.format()) ? PIXEL_FORMAT_XRGB : PIXEL_FORMAT_ARGB; 543 format = IsOpaque(config_.format()) ? PIXEL_FORMAT_XRGB : PIXEL_FORMAT_ARGB;
547 } 544 }
548 545
549 // TODO(jbauman): Move decoder_texture_target_ and pixel_format_ to the 546 if (!factories_->CreateTextures(count * textures_per_buffer, size,
550 // picture buffer. http://crbug.com/614789 547 &texture_ids, &texture_mailboxes,
551 if ((pixel_format_ != PIXEL_FORMAT_UNKNOWN) && (pixel_format_ != format)) { 548 texture_target)) {
552 NotifyError(VideoDecodeAccelerator::PLATFORM_FAILURE); 549 NotifyError(VideoDecodeAccelerator::PLATFORM_FAILURE);
553 return; 550 return;
554 } 551 }
555 552
556 pixel_format_ = format;
557 if (!factories_->CreateTextures(count * textures_per_buffer, size,
558 &texture_ids, &texture_mailboxes,
559 decoder_texture_target_)) {
560 NotifyError(VideoDecodeAccelerator::PLATFORM_FAILURE);
561 return;
562 }
563 sync_token_ = factories_->CreateSyncToken(); 553 sync_token_ = factories_->CreateSyncToken();
564 DCHECK_EQ(count * textures_per_buffer, texture_ids.size()); 554 DCHECK_EQ(count * textures_per_buffer, texture_ids.size());
565 DCHECK_EQ(count * textures_per_buffer, texture_mailboxes.size()); 555 DCHECK_EQ(count * textures_per_buffer, texture_mailboxes.size());
566 556
567 if (!vda_) 557 if (!vda_)
568 return; 558 return;
569 559
570 std::vector<PictureBuffer> picture_buffers; 560 std::vector<PictureBuffer> picture_buffers;
571 size_t index = 0; 561 size_t index = 0;
572 for (size_t i = 0; i < count; ++i) { 562 for (size_t i = 0; i < count; ++i) {
573 PictureBuffer::TextureIds ids; 563 PictureBuffer::TextureIds ids;
574 std::vector<gpu::Mailbox> mailboxes; 564 std::vector<gpu::Mailbox> mailboxes;
575 for (size_t j = 0; j < textures_per_buffer; j++) { 565 for (size_t j = 0; j < textures_per_buffer; j++) {
576 ids.push_back(texture_ids[index]); 566 ids.push_back(texture_ids[index]);
577 mailboxes.push_back(texture_mailboxes[index]); 567 mailboxes.push_back(texture_mailboxes[index]);
578 index++; 568 index++;
579 } 569 }
580 570
581 picture_buffers.push_back( 571 picture_buffers.push_back(PictureBuffer(next_picture_buffer_id_++, size,
582 PictureBuffer(next_picture_buffer_id_++, size, ids, mailboxes)); 572 ids, mailboxes, texture_target,
573 format));
583 bool inserted = assigned_picture_buffers_.insert(std::make_pair( 574 bool inserted = assigned_picture_buffers_.insert(std::make_pair(
584 picture_buffers.back().id(), picture_buffers.back())).second; 575 picture_buffers.back().id(), picture_buffers.back())).second;
585 DCHECK(inserted); 576 DCHECK(inserted);
586 } 577 }
587 578
588 available_pictures_ += count; 579 available_pictures_ += count;
589 580
590 vda_->AssignPictureBuffers(picture_buffers); 581 vda_->AssignPictureBuffers(picture_buffers);
591 } 582 }
592 583
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
651 642
652 if (!picture.visible_rect().IsEmpty()) { 643 if (!picture.visible_rect().IsEmpty()) {
653 visible_rect = picture.visible_rect(); 644 visible_rect = picture.visible_rect();
654 } 645 }
655 if (!gfx::Rect(pb.size()).Contains(visible_rect)) { 646 if (!gfx::Rect(pb.size()).Contains(visible_rect)) {
656 LOG(WARNING) << "Visible size " << visible_rect.ToString() 647 LOG(WARNING) << "Visible size " << visible_rect.ToString()
657 << " is larger than coded size " << pb.size().ToString(); 648 << " is larger than coded size " << pb.size().ToString();
658 visible_rect = gfx::Rect(pb.size()); 649 visible_rect = gfx::Rect(pb.size());
659 } 650 }
660 651
661 DCHECK(decoder_texture_target_); 652 DCHECK(pb.texture_target());
662 653
663 gpu::MailboxHolder mailbox_holders[VideoFrame::kMaxPlanes]; 654 gpu::MailboxHolder mailbox_holders[VideoFrame::kMaxPlanes];
664 for (size_t i = 0; i < pb.client_texture_ids().size(); ++i) { 655 for (size_t i = 0; i < pb.client_texture_ids().size(); ++i) {
665 mailbox_holders[i] = gpu::MailboxHolder(pb.texture_mailbox(i), sync_token_, 656 mailbox_holders[i] = gpu::MailboxHolder(pb.texture_mailbox(i), sync_token_,
666 decoder_texture_target_); 657 pb.texture_target());
667 } 658 }
668 659
669 scoped_refptr<VideoFrame> frame(VideoFrame::WrapNativeTextures( 660 scoped_refptr<VideoFrame> frame(VideoFrame::WrapNativeTextures(
670 pixel_format_, mailbox_holders, 661 pb.pixel_format(), mailbox_holders,
671 // Always post ReleaseMailbox to avoid deadlock with the compositor when 662 // Always post ReleaseMailbox to avoid deadlock with the compositor when
672 // releasing video frames on the media thread; http://crbug.com/710209. 663 // releasing video frames on the media thread; http://crbug.com/710209.
673 BindToCurrentLoop(base::Bind( 664 BindToCurrentLoop(base::Bind(
674 &GpuVideoDecoder::ReleaseMailbox, weak_factory_.GetWeakPtr(), 665 &GpuVideoDecoder::ReleaseMailbox, weak_factory_.GetWeakPtr(),
675 factories_, picture.picture_buffer_id(), pb.client_texture_ids())), 666 factories_, picture.picture_buffer_id(), pb.client_texture_ids())),
676 pb.size(), visible_rect, natural_size, timestamp)); 667 pb.size(), visible_rect, natural_size, timestamp));
677 if (!frame) { 668 if (!frame) {
678 DLOG(ERROR) << "Create frame failed for: " << picture.picture_buffer_id(); 669 DLOG(ERROR) << "Create frame failed for: " << picture.picture_buffer_id();
679 NotifyError(VideoDecodeAccelerator::PLATFORM_FAILURE); 670 NotifyError(VideoDecodeAccelerator::PLATFORM_FAILURE);
680 return; 671 return;
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after
900 } 891 }
901 return false; 892 return false;
902 } 893 }
903 894
904 void GpuVideoDecoder::DCheckGpuVideoAcceleratorFactoriesTaskRunnerIsCurrent() 895 void GpuVideoDecoder::DCheckGpuVideoAcceleratorFactoriesTaskRunnerIsCurrent()
905 const { 896 const {
906 DCHECK(factories_->GetTaskRunner()->BelongsToCurrentThread()); 897 DCHECK(factories_->GetTaskRunner()->BelongsToCurrentThread());
907 } 898 }
908 899
909 } // namespace media 900 } // namespace media
OLDNEW
« no previous file with comments | « media/filters/gpu_video_decoder.h ('k') | media/gpu/ipc/client/gpu_video_decode_accelerator_host.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698