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(); |
} |