| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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/gpu_jpeg_decode_accelerator.h" | 5 #include "content/common/gpu/media/gpu_jpeg_decode_accelerator.h" |
| 6 | 6 |
| 7 #include <stdint.h> | 7 #include <stdint.h> |
| 8 #include <utility> |
| 8 | 9 |
| 9 #include "base/bind.h" | 10 #include "base/bind.h" |
| 10 #include "base/containers/hash_tables.h" | 11 #include "base/containers/hash_tables.h" |
| 11 #include "base/logging.h" | 12 #include "base/logging.h" |
| 12 #include "base/memory/shared_memory.h" | 13 #include "base/memory/shared_memory.h" |
| 13 #include "base/single_thread_task_runner.h" | 14 #include "base/single_thread_task_runner.h" |
| 14 #include "base/stl_util.h" | 15 #include "base/stl_util.h" |
| 15 #include "base/trace_event/trace_event.h" | 16 #include "base/trace_event/trace_event.h" |
| 16 #include "build/build_config.h" | 17 #include "build/build_config.h" |
| 17 #include "content/common/gpu/gpu_channel.h" | 18 #include "content/common/gpu/gpu_channel.h" |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 105 | 106 |
| 106 void Decode(const media::BitstreamBuffer& bitstream_buffer, | 107 void Decode(const media::BitstreamBuffer& bitstream_buffer, |
| 107 const scoped_refptr<media::VideoFrame>& video_frame) { | 108 const scoped_refptr<media::VideoFrame>& video_frame) { |
| 108 DCHECK(CalledOnValidThread()); | 109 DCHECK(CalledOnValidThread()); |
| 109 DCHECK(accelerator_); | 110 DCHECK(accelerator_); |
| 110 accelerator_->Decode(bitstream_buffer, video_frame); | 111 accelerator_->Decode(bitstream_buffer, video_frame); |
| 111 } | 112 } |
| 112 | 113 |
| 113 void set_accelerator(scoped_ptr<media::JpegDecodeAccelerator> accelerator) { | 114 void set_accelerator(scoped_ptr<media::JpegDecodeAccelerator> accelerator) { |
| 114 DCHECK(CalledOnValidThread()); | 115 DCHECK(CalledOnValidThread()); |
| 115 accelerator_ = accelerator.Pass(); | 116 accelerator_ = std::move(accelerator); |
| 116 } | 117 } |
| 117 | 118 |
| 118 private: | 119 private: |
| 119 base::WeakPtr<content::GpuJpegDecodeAccelerator> owner_; | 120 base::WeakPtr<content::GpuJpegDecodeAccelerator> owner_; |
| 120 int32_t route_id_; | 121 int32_t route_id_; |
| 121 scoped_ptr<media::JpegDecodeAccelerator> accelerator_; | 122 scoped_ptr<media::JpegDecodeAccelerator> accelerator_; |
| 122 }; | 123 }; |
| 123 | 124 |
| 124 // Create, destroy, and RemoveClient run on child thread. All other methods run | 125 // Create, destroy, and RemoveClient run on child thread. All other methods run |
| 125 // on IO thread. | 126 // on IO thread. |
| (...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 336 &GpuJpegDecodeAccelerator::CreateV4L2JDA, | 337 &GpuJpegDecodeAccelerator::CreateV4L2JDA, |
| 337 &GpuJpegDecodeAccelerator::CreateVaapiJDA, | 338 &GpuJpegDecodeAccelerator::CreateVaapiJDA, |
| 338 }; | 339 }; |
| 339 | 340 |
| 340 scoped_ptr<Client> client(new Client(this, route_id)); | 341 scoped_ptr<Client> client(new Client(this, route_id)); |
| 341 scoped_ptr<media::JpegDecodeAccelerator> accelerator; | 342 scoped_ptr<media::JpegDecodeAccelerator> accelerator; |
| 342 for (const auto& create_jda_function : create_jda_fps) { | 343 for (const auto& create_jda_function : create_jda_fps) { |
| 343 scoped_ptr<media::JpegDecodeAccelerator> tmp_accelerator = | 344 scoped_ptr<media::JpegDecodeAccelerator> tmp_accelerator = |
| 344 (*create_jda_function)(io_task_runner_); | 345 (*create_jda_function)(io_task_runner_); |
| 345 if (tmp_accelerator && tmp_accelerator->Initialize(client.get())) { | 346 if (tmp_accelerator && tmp_accelerator->Initialize(client.get())) { |
| 346 accelerator = tmp_accelerator.Pass(); | 347 accelerator = std::move(tmp_accelerator); |
| 347 break; | 348 break; |
| 348 } | 349 } |
| 349 } | 350 } |
| 350 | 351 |
| 351 if (!accelerator) { | 352 if (!accelerator) { |
| 352 DLOG(ERROR) << "JPEG accelerator Initialize failed"; | 353 DLOG(ERROR) << "JPEG accelerator Initialize failed"; |
| 353 GpuMsg_CreateJpegDecoder::WriteReplyParams(reply_msg, false); | 354 GpuMsg_CreateJpegDecoder::WriteReplyParams(reply_msg, false); |
| 354 Send(reply_msg); | 355 Send(reply_msg); |
| 355 return; | 356 return; |
| 356 } | 357 } |
| 357 client->set_accelerator(accelerator.Pass()); | 358 client->set_accelerator(std::move(accelerator)); |
| 358 | 359 |
| 359 if (!filter_) { | 360 if (!filter_) { |
| 360 DCHECK_EQ(client_number_, 0); | 361 DCHECK_EQ(client_number_, 0); |
| 361 filter_ = new MessageFilter(this); | 362 filter_ = new MessageFilter(this); |
| 362 // This should be before AddClientOnIOThread. | 363 // This should be before AddClientOnIOThread. |
| 363 channel_->AddFilter(filter_.get()); | 364 channel_->AddFilter(filter_.get()); |
| 364 } | 365 } |
| 365 client_number_++; | 366 client_number_++; |
| 366 | 367 |
| 367 // In this PostTask, |client| may leak if |io_task_runner_| is destroyed | 368 // In this PostTask, |client| may leak if |io_task_runner_| is destroyed |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 402 scoped_ptr<media::JpegDecodeAccelerator> | 403 scoped_ptr<media::JpegDecodeAccelerator> |
| 403 GpuJpegDecodeAccelerator::CreateV4L2JDA( | 404 GpuJpegDecodeAccelerator::CreateV4L2JDA( |
| 404 const scoped_refptr<base::SingleThreadTaskRunner>& io_task_runner) { | 405 const scoped_refptr<base::SingleThreadTaskRunner>& io_task_runner) { |
| 405 scoped_ptr<media::JpegDecodeAccelerator> decoder; | 406 scoped_ptr<media::JpegDecodeAccelerator> decoder; |
| 406 #if defined(OS_CHROMEOS) && defined(USE_V4L2_CODEC) | 407 #if defined(OS_CHROMEOS) && defined(USE_V4L2_CODEC) |
| 407 scoped_refptr<V4L2Device> device = V4L2Device::Create( | 408 scoped_refptr<V4L2Device> device = V4L2Device::Create( |
| 408 V4L2Device::kJpegDecoder); | 409 V4L2Device::kJpegDecoder); |
| 409 if (device) | 410 if (device) |
| 410 decoder.reset(new V4L2JpegDecodeAccelerator(device, io_task_runner)); | 411 decoder.reset(new V4L2JpegDecodeAccelerator(device, io_task_runner)); |
| 411 #endif | 412 #endif |
| 412 return decoder.Pass(); | 413 return decoder; |
| 413 } | 414 } |
| 414 | 415 |
| 415 // static | 416 // static |
| 416 scoped_ptr<media::JpegDecodeAccelerator> | 417 scoped_ptr<media::JpegDecodeAccelerator> |
| 417 GpuJpegDecodeAccelerator::CreateVaapiJDA( | 418 GpuJpegDecodeAccelerator::CreateVaapiJDA( |
| 418 const scoped_refptr<base::SingleThreadTaskRunner>& io_task_runner) { | 419 const scoped_refptr<base::SingleThreadTaskRunner>& io_task_runner) { |
| 419 scoped_ptr<media::JpegDecodeAccelerator> decoder; | 420 scoped_ptr<media::JpegDecodeAccelerator> decoder; |
| 420 #if defined(OS_CHROMEOS) && defined(ARCH_CPU_X86_FAMILY) | 421 #if defined(OS_CHROMEOS) && defined(ARCH_CPU_X86_FAMILY) |
| 421 decoder.reset(new VaapiJpegDecodeAccelerator(io_task_runner)); | 422 decoder.reset(new VaapiJpegDecodeAccelerator(io_task_runner)); |
| 422 #endif | 423 #endif |
| 423 return decoder.Pass(); | 424 return decoder; |
| 424 } | 425 } |
| 425 | 426 |
| 426 // static | 427 // static |
| 427 bool GpuJpegDecodeAccelerator::IsSupported() { | 428 bool GpuJpegDecodeAccelerator::IsSupported() { |
| 428 const GpuJpegDecodeAccelerator::CreateJDAFp create_jda_fps[] = { | 429 const GpuJpegDecodeAccelerator::CreateJDAFp create_jda_fps[] = { |
| 429 &GpuJpegDecodeAccelerator::CreateV4L2JDA, | 430 &GpuJpegDecodeAccelerator::CreateV4L2JDA, |
| 430 &GpuJpegDecodeAccelerator::CreateVaapiJDA, | 431 &GpuJpegDecodeAccelerator::CreateVaapiJDA, |
| 431 }; | 432 }; |
| 432 for (const auto& create_jda_function : create_jda_fps) { | 433 for (const auto& create_jda_function : create_jda_fps) { |
| 433 scoped_ptr<media::JpegDecodeAccelerator> accelerator = | 434 scoped_ptr<media::JpegDecodeAccelerator> accelerator = |
| 434 (*create_jda_function)(base::ThreadTaskRunnerHandle::Get()); | 435 (*create_jda_function)(base::ThreadTaskRunnerHandle::Get()); |
| 435 if (accelerator && accelerator->IsSupported()) | 436 if (accelerator && accelerator->IsSupported()) |
| 436 return true; | 437 return true; |
| 437 } | 438 } |
| 438 return false; | 439 return false; |
| 439 } | 440 } |
| 440 | 441 |
| 441 } // namespace content | 442 } // namespace content |
| OLD | NEW |