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

Side by Side Diff: content/common/gpu/media/dxva_video_decode_accelerator.cc

Issue 1207043002: Introduce a client minimum picture pool size (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 5 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 "content/common/gpu/media/dxva_video_decode_accelerator.h" 5 #include "content/common/gpu/media/dxva_video_decode_accelerator.h"
6 6
7 #if !defined(OS_WIN) 7 #if !defined(OS_WIN)
8 #error This file should only be built on Windows. 8 #error This file should only be built on Windows.
9 #endif // !defined(OS_WIN) 9 #endif // !defined(OS_WIN)
10 10
(...skipping 499 matching lines...) Expand 10 before | Expand all | Expand 10 after
510 DXVAVideoDecodeAccelerator::PendingSampleInfo::~PendingSampleInfo() {} 510 DXVAVideoDecodeAccelerator::PendingSampleInfo::~PendingSampleInfo() {}
511 511
512 DXVAVideoDecodeAccelerator::DXVAVideoDecodeAccelerator( 512 DXVAVideoDecodeAccelerator::DXVAVideoDecodeAccelerator(
513 const base::Callback<bool(void)>& make_context_current, 513 const base::Callback<bool(void)>& make_context_current,
514 gfx::GLContext* gl_context) 514 gfx::GLContext* gl_context)
515 : client_(NULL), 515 : client_(NULL),
516 dev_manager_reset_token_(0), 516 dev_manager_reset_token_(0),
517 dx11_dev_manager_reset_token_(0), 517 dx11_dev_manager_reset_token_(0),
518 egl_config_(NULL), 518 egl_config_(NULL),
519 state_(kUninitialized), 519 state_(kUninitialized),
520 num_picture_buffers_(kNumPictureBuffers),
520 pictures_requested_(false), 521 pictures_requested_(false),
521 inputs_before_decode_(0), 522 inputs_before_decode_(0),
522 sent_drain_message_(false), 523 sent_drain_message_(false),
523 make_context_current_(make_context_current), 524 make_context_current_(make_context_current),
524 codec_(media::kUnknownVideoCodec), 525 codec_(media::kUnknownVideoCodec),
525 decoder_thread_("DXVAVideoDecoderThread"), 526 decoder_thread_("DXVAVideoDecoderThread"),
526 pending_flush_(false), 527 pending_flush_(false),
527 use_dx11_(false), 528 use_dx11_(false),
528 dx11_video_format_converter_media_type_needs_init_(true), 529 dx11_video_format_converter_media_type_needs_init_(true),
529 gl_context_(gl_context), 530 gl_context_(gl_context),
530 weak_this_factory_(this) { 531 weak_this_factory_(this) {
531 weak_ptr_ = weak_this_factory_.GetWeakPtr(); 532 weak_ptr_ = weak_this_factory_.GetWeakPtr();
532 memset(&input_stream_info_, 0, sizeof(input_stream_info_)); 533 memset(&input_stream_info_, 0, sizeof(input_stream_info_));
533 memset(&output_stream_info_, 0, sizeof(output_stream_info_)); 534 memset(&output_stream_info_, 0, sizeof(output_stream_info_));
534 } 535 }
535 536
536 DXVAVideoDecodeAccelerator::~DXVAVideoDecodeAccelerator() { 537 DXVAVideoDecodeAccelerator::~DXVAVideoDecodeAccelerator() {
537 client_ = NULL; 538 client_ = NULL;
538 } 539 }
539 540
540 bool DXVAVideoDecodeAccelerator::Initialize(media::VideoCodecProfile profile, 541 bool DXVAVideoDecodeAccelerator::Initialize(media::VideoCodecProfile profile,
541 Client* client) { 542 uint32_t min_picture_count,
543 Client* client) {
542 client_ = client; 544 client_ = client;
543 545
546 num_picture_buffers_ = std::max(min_picture_count,
547 static_cast<uint32_t>(kNumPictureBuffers));
548
544 main_thread_task_runner_ = base::MessageLoop::current()->task_runner(); 549 main_thread_task_runner_ = base::MessageLoop::current()->task_runner();
545 550
546 bool profile_supported = false; 551 bool profile_supported = false;
547 for (const auto& supported_profile : kSupportedProfiles) { 552 for (const auto& supported_profile : kSupportedProfiles) {
548 if (profile == supported_profile) { 553 if (profile == supported_profile) {
549 profile_supported = true; 554 profile_supported = true;
550 break; 555 break;
551 } 556 }
552 } 557 }
553 if (!profile_supported) { 558 if (!profile_supported) {
(...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after
770 base::Unretained(this), sample)); 775 base::Unretained(this), sample));
771 } 776 }
772 777
773 void DXVAVideoDecodeAccelerator::AssignPictureBuffers( 778 void DXVAVideoDecodeAccelerator::AssignPictureBuffers(
774 const std::vector<media::PictureBuffer>& buffers) { 779 const std::vector<media::PictureBuffer>& buffers) {
775 DCHECK(main_thread_task_runner_->BelongsToCurrentThread()); 780 DCHECK(main_thread_task_runner_->BelongsToCurrentThread());
776 781
777 State state = GetState(); 782 State state = GetState();
778 RETURN_AND_NOTIFY_ON_FAILURE((state != kUninitialized), 783 RETURN_AND_NOTIFY_ON_FAILURE((state != kUninitialized),
779 "Invalid state: " << state, ILLEGAL_STATE,); 784 "Invalid state: " << state, ILLEGAL_STATE,);
780 RETURN_AND_NOTIFY_ON_FAILURE((kNumPictureBuffers == buffers.size()), 785 RETURN_AND_NOTIFY_ON_FAILURE((num_picture_buffers_ == buffers.size()),
781 "Failed to provide requested picture buffers. (Got " << buffers.size() << 786 "Failed to provide requested picture buffers. (Got " << buffers.size() <<
782 ", requested " << kNumPictureBuffers << ")", INVALID_ARGUMENT,); 787 ", requested " << num_picture_buffers_ << ")", INVALID_ARGUMENT,);
783 788
784 // Copy the picture buffers provided by the client to the available list, 789 // Copy the picture buffers provided by the client to the available list,
785 // and mark these buffers as available for use. 790 // and mark these buffers as available for use.
786 for (size_t buffer_index = 0; buffer_index < buffers.size(); 791 for (size_t buffer_index = 0; buffer_index < buffers.size();
787 ++buffer_index) { 792 ++buffer_index) {
788 linked_ptr<DXVAPictureBuffer> picture_buffer = 793 linked_ptr<DXVAPictureBuffer> picture_buffer =
789 DXVAPictureBuffer::Create(*this, buffers[buffer_index], egl_config_); 794 DXVAPictureBuffer::Create(*this, buffers[buffer_index], egl_config_);
790 RETURN_AND_NOTIFY_ON_FAILURE(picture_buffer.get(), 795 RETURN_AND_NOTIFY_ON_FAILURE(picture_buffer.get(),
791 "Failed to allocate picture buffer", PLATFORM_FAILURE,); 796 "Failed to allocate picture buffer", PLATFORM_FAILURE,);
792 797
(...skipping 679 matching lines...) Expand 10 before | Expand all | Expand 10 after
1472 DCHECK(main_thread_task_runner_->BelongsToCurrentThread()); 1477 DCHECK(main_thread_task_runner_->BelongsToCurrentThread());
1473 if (client_) 1478 if (client_)
1474 client_->NotifyResetDone(); 1479 client_->NotifyResetDone();
1475 } 1480 }
1476 1481
1477 void DXVAVideoDecodeAccelerator::RequestPictureBuffers(int width, int height) { 1482 void DXVAVideoDecodeAccelerator::RequestPictureBuffers(int width, int height) {
1478 DCHECK(main_thread_task_runner_->BelongsToCurrentThread()); 1483 DCHECK(main_thread_task_runner_->BelongsToCurrentThread());
1479 // This task could execute after the decoder has been torn down. 1484 // This task could execute after the decoder has been torn down.
1480 if (GetState() != kUninitialized && client_) { 1485 if (GetState() != kUninitialized && client_) {
1481 client_->ProvidePictureBuffers( 1486 client_->ProvidePictureBuffers(
1482 kNumPictureBuffers, 1487 num_picture_buffers_,
1483 gfx::Size(width, height), 1488 gfx::Size(width, height),
1484 GL_TEXTURE_2D); 1489 GL_TEXTURE_2D);
1485 } 1490 }
1486 } 1491 }
1487 1492
1488 void DXVAVideoDecodeAccelerator::NotifyPictureReady( 1493 void DXVAVideoDecodeAccelerator::NotifyPictureReady(
1489 int picture_buffer_id, 1494 int picture_buffer_id,
1490 int input_buffer_id, 1495 int input_buffer_id,
1491 const gfx::Rect& picture_buffer_size) { 1496 const gfx::Rect& picture_buffer_size) {
1492 DCHECK(main_thread_task_runner_->BelongsToCurrentThread()); 1497 DCHECK(main_thread_task_runner_->BelongsToCurrentThread());
(...skipping 694 matching lines...) Expand 10 before | Expand all | Expand 10 after
2187 D3DSURFACE_DESC surface_desc; 2192 D3DSURFACE_DESC surface_desc;
2188 hr = surface->GetDesc(&surface_desc); 2193 hr = surface->GetDesc(&surface_desc);
2189 RETURN_ON_HR_FAILURE(hr, "Failed to get surface description", false); 2194 RETURN_ON_HR_FAILURE(hr, "Failed to get surface description", false);
2190 *width = surface_desc.Width; 2195 *width = surface_desc.Width;
2191 *height = surface_desc.Height; 2196 *height = surface_desc.Height;
2192 } 2197 }
2193 return true; 2198 return true;
2194 } 2199 }
2195 2200
2196 } // namespace content 2201 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698