| Index: chrome/gpu/arc_gpu_video_decode_accelerator.cc
|
| diff --git a/chrome/gpu/arc_gpu_video_decode_accelerator.cc b/chrome/gpu/arc_gpu_video_decode_accelerator.cc
|
| index 52444a0c56843445e30be7d5fbbe5edf10e97127..aa1f1c8c848bee428d3c2df90c6bd40f6b879a28 100644
|
| --- a/chrome/gpu/arc_gpu_video_decode_accelerator.cc
|
| +++ b/chrome/gpu/arc_gpu_video_decode_accelerator.cc
|
| @@ -14,6 +14,21 @@
|
| namespace chromeos {
|
| namespace arc {
|
|
|
| +namespace {
|
| +
|
| +// An arbitrary chosen limit of the number of buffers. The number of
|
| +// buffers used is requested from the untrusted client side.
|
| +const size_t kMaxBufferCount = 128;
|
| +
|
| +// Maximum number of concurrent ARC video clients.
|
| +// Currently we have no way to know the resources are not enough to create more
|
| +// VDA. Arbitrarily chosen a reasonable constant as the limit.
|
| +const int kMaxConcurrentClients = 8;
|
| +
|
| +} // anonymous namespace
|
| +
|
| +int ArcGpuVideoDecodeAccelerator::client_count_ = 0;
|
| +
|
| ArcGpuVideoDecodeAccelerator::InputRecord::InputRecord(
|
| int32_t bitstream_buffer_id,
|
| uint32_t buffer_index,
|
| @@ -42,17 +57,14 @@ ArcGpuVideoDecodeAccelerator::ArcGpuVideoDecodeAccelerator()
|
| output_pixel_format_(media::PIXEL_FORMAT_UNKNOWN),
|
| output_buffer_size_(0) {}
|
|
|
| -ArcGpuVideoDecodeAccelerator::~ArcGpuVideoDecodeAccelerator() {}
|
| -
|
| -namespace {
|
| -
|
| -// An arbitrary chosen limit of the number of buffers. The number of
|
| -// buffers used is requested from the untrusted client side.
|
| -const size_t kMaxBufferCount = 128;
|
| -
|
| -} // anonymous namespace
|
| +ArcGpuVideoDecodeAccelerator::~ArcGpuVideoDecodeAccelerator() {
|
| + DCHECK(thread_checker_.CalledOnValidThread());
|
| + if (vda_) {
|
| + client_count_--;
|
| + }
|
| +}
|
|
|
| -bool ArcGpuVideoDecodeAccelerator::Initialize(
|
| +ArcVideoAccelerator::Result ArcGpuVideoDecodeAccelerator::Initialize(
|
| const Config& config,
|
| ArcVideoAccelerator::Client* client) {
|
| DVLOG(5) << "Initialize(device=" << config.device_type
|
| @@ -60,19 +72,25 @@ bool ArcGpuVideoDecodeAccelerator::Initialize(
|
| << ", num_input_buffers=" << config.num_input_buffers << ")";
|
| DCHECK(thread_checker_.CalledOnValidThread());
|
| if (config.device_type != Config::DEVICE_DECODER)
|
| - return false;
|
| + return INVALID_ARGUMENT;
|
| DCHECK(client);
|
|
|
| if (arc_client_) {
|
| DLOG(ERROR) << "Re-Initialize() is not allowed";
|
| - return false;
|
| + return ILLEGAL_STATE;
|
| + }
|
| +
|
| + if (client_count_ >= kMaxConcurrentClients) {
|
| + LOG(WARNING) << "Reject to Initialize() due to too many clients: "
|
| + << client_count_;
|
| + return INSUFFICIENT_RESOURCES;
|
| }
|
|
|
| arc_client_ = client;
|
|
|
| if (config.num_input_buffers > kMaxBufferCount) {
|
| DLOG(ERROR) << "Request too many buffers: " << config.num_input_buffers;
|
| - return false;
|
| + return INVALID_ARGUMENT;
|
| }
|
| input_buffer_info_.resize(config.num_input_buffers);
|
|
|
| @@ -86,7 +104,7 @@ bool ArcGpuVideoDecodeAccelerator::Initialize(
|
| break;
|
| default:
|
| DLOG(ERROR) << "Unsupported input format: " << config.input_pixel_format;
|
| - return false;
|
| + return INVALID_ARGUMENT;
|
| }
|
| vda_config.output_mode =
|
| media::VideoDecodeAccelerator::Config::OutputMode::IMPORT;
|
| @@ -96,9 +114,14 @@ bool ArcGpuVideoDecodeAccelerator::Initialize(
|
| vda_ = vda_factory->CreateVDA(this, vda_config);
|
| if (!vda_) {
|
| DLOG(ERROR) << "Failed to create VDA.";
|
| - return false;
|
| + return PLATFORM_FAILURE;
|
| }
|
| - return true;
|
| +
|
| + client_count_++;
|
| + DVLOG(5) << "Number of concurrent ArcVideoAccelerator clients: "
|
| + << client_count_;
|
| +
|
| + return SUCCESS;
|
| }
|
|
|
| void ArcGpuVideoDecodeAccelerator::SetNumberOfOutputBuffers(size_t number) {
|
| @@ -394,7 +417,7 @@ void ArcGpuVideoDecodeAccelerator::NotifyResetDone() {
|
| arc_client_->OnResetDone();
|
| }
|
|
|
| -static ArcVideoAccelerator::Error ConvertErrorCode(
|
| +static ArcVideoAccelerator::Result ConvertErrorCode(
|
| media::VideoDecodeAccelerator::Error error) {
|
| switch (error) {
|
| case media::VideoDecodeAccelerator::ILLEGAL_STATE:
|
|
|