| Index: content/browser/renderer_host/media/video_capture_gpu_jpeg_decoder.cc
|
| diff --git a/content/browser/renderer_host/media/video_capture_gpu_jpeg_decoder.cc b/content/browser/renderer_host/media/video_capture_gpu_jpeg_decoder.cc
|
| index 0bf2749f96605a737f3ffc62184e08919c5cf6e3..6102e7d74e268c93d93ac88fc9ae5b9360d3d5fc 100644
|
| --- a/content/browser/renderer_host/media/video_capture_gpu_jpeg_decoder.cc
|
| +++ b/content/browser/renderer_host/media/video_capture_gpu_jpeg_decoder.cc
|
| @@ -17,10 +17,11 @@
|
| #include "build/build_config.h"
|
| #include "content/browser/gpu/browser_gpu_channel_host_factory.h"
|
| #include "content/public/browser/browser_thread.h"
|
| +#include "content/public/browser/gpu_data_manager.h"
|
| +#include "content/public/browser/gpu_service_registry.h"
|
| #include "content/public/common/content_switches.h"
|
| #include "media/base/media_switches.h"
|
| #include "media/base/video_frame.h"
|
| -#include "media/gpu/ipc/client/gpu_jpeg_decode_accelerator_host.h"
|
| #include "mojo/public/cpp/system/platform_handle.h"
|
|
|
| namespace content {
|
| @@ -41,10 +42,6 @@ VideoCaptureGpuJpegDecoder::~VideoCaptureGpuJpegDecoder() {
|
| // |decoder_| guarantees no more JpegDecodeAccelerator::Client callbacks
|
| // on IO thread after deletion.
|
| decoder_.reset();
|
| -
|
| - // |gpu_channel_host_| should outlive |decoder_|, so |gpu_channel_host_|
|
| - // must be released after |decoder_| has been destroyed.
|
| - gpu_channel_host_ = nullptr;
|
| }
|
|
|
| void VideoCaptureGpuJpegDecoder::Initialize() {
|
| @@ -70,9 +67,10 @@ void VideoCaptureGpuJpegDecoder::Initialize() {
|
|
|
| const scoped_refptr<base::SingleThreadTaskRunner> current_task_runner(
|
| base::ThreadTaskRunnerHandle::Get());
|
| - BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
|
| - base::Bind(&EstablishGpuChannelOnUIThread,
|
| - current_task_runner, AsWeakPtr()));
|
| + BrowserThread::PostTask(
|
| + BrowserThread::IO, FROM_HERE,
|
| + base::Bind(&ConnectToGpuJpegDecodeAcceleratorOnIOThread,
|
| + current_task_runner, AsWeakPtr()));
|
| }
|
|
|
| VideoCaptureGpuJpegDecoder::STATUS VideoCaptureGpuJpegDecoder::GetStatus()
|
| @@ -217,53 +215,39 @@ void VideoCaptureGpuJpegDecoder::NotifyError(
|
| }
|
|
|
| // static
|
| -void VideoCaptureGpuJpegDecoder::EstablishGpuChannelOnUIThread(
|
| +void VideoCaptureGpuJpegDecoder::ConnectToGpuJpegDecodeAcceleratorOnIOThread(
|
| const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
|
| base::WeakPtr<VideoCaptureGpuJpegDecoder> weak_this) {
|
| - DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| - DCHECK(BrowserGpuChannelHostFactory::instance());
|
| -
|
| - BrowserGpuChannelHostFactory::instance()->EstablishGpuChannel(
|
| - base::Bind(&VideoCaptureGpuJpegDecoder::GpuChannelEstablishedOnUIThread,
|
| - task_runner, weak_this));
|
| -}
|
| + DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
|
|
| -// static
|
| -void VideoCaptureGpuJpegDecoder::GpuChannelEstablishedOnUIThread(
|
| - const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
|
| - base::WeakPtr<VideoCaptureGpuJpegDecoder> weak_this,
|
| - scoped_refptr<gpu::GpuChannelHost> gpu_channel_host) {
|
| - DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
| + media::mojom::GpuJpegDecodeAcceleratorPtr remote_decoder;
|
| + BindInterfaceInGpuProcess(mojo::MakeRequest(&remote_decoder));
|
|
|
| task_runner->PostTask(
|
| - FROM_HERE, base::Bind(&VideoCaptureGpuJpegDecoder::FinishInitialization,
|
| - weak_this, std::move(gpu_channel_host)));
|
| + FROM_HERE,
|
| + base::Bind(&VideoCaptureGpuJpegDecoder::FinishInitialization, weak_this,
|
| + base::Passed(remote_decoder.PassInterface())));
|
| }
|
|
|
| void VideoCaptureGpuJpegDecoder::FinishInitialization(
|
| - scoped_refptr<gpu::GpuChannelHost> gpu_channel_host) {
|
| + media::mojom::GpuJpegDecodeAcceleratorPtrInfo remote_decoder_info) {
|
| TRACE_EVENT0("gpu", "VideoCaptureGpuJpegDecoder::FinishInitialization");
|
| DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
|
| base::AutoLock lock(lock_);
|
| - if (!gpu_channel_host) {
|
| - LOG(ERROR) << "Failed to establish GPU channel for JPEG decoder";
|
| - } else if (gpu_channel_host->gpu_info().jpeg_decode_accelerator_supported) {
|
| - gpu_channel_host_ = std::move(gpu_channel_host);
|
| - scoped_refptr<base::SingleThreadTaskRunner> io_task_runner =
|
| - BrowserGpuChannelHostFactory::instance()->GetIOThreadTaskRunner();
|
| -
|
| - int32_t route_id = gpu_channel_host_->GenerateRouteID();
|
| - std::unique_ptr<media::GpuJpegDecodeAcceleratorHost> decoder(
|
| - new media::GpuJpegDecodeAcceleratorHost(gpu_channel_host_.get(),
|
| - route_id, io_task_runner));
|
| +
|
| + if (GpuDataManager::GetInstance()
|
| + ->GetGPUInfo()
|
| + .jpeg_decode_accelerator_supported) {
|
| + auto decoder = base::MakeUnique<media::GpuJpegDecodeAcceleratorHost>(
|
| + BrowserGpuChannelHostFactory::instance()->GetIOThreadTaskRunner(),
|
| + std::move(remote_decoder_info));
|
| if (decoder->Initialize(this)) {
|
| - gpu_channel_host_->AddRouteWithTaskRunner(
|
| - route_id, decoder->GetReceiver(), io_task_runner);
|
| decoder_ = std::move(decoder);
|
| } else {
|
| DLOG(ERROR) << "Failed to initialize JPEG decoder";
|
| }
|
| }
|
| +
|
| decoder_status_ = decoder_ ? INIT_PASSED : FAILED;
|
| RecordInitDecodeUMA_Locked();
|
| }
|
|
|