| Index: content/browser/gpu/gpu_arc_video_service_host.cc
|
| diff --git a/content/browser/gpu/gpu_arc_video_service_host.cc b/content/browser/gpu/gpu_arc_video_service_host.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..7ba572d64f1bcbd7e4ef686ba0e5c0742ce6288b
|
| --- /dev/null
|
| +++ b/content/browser/gpu/gpu_arc_video_service_host.cc
|
| @@ -0,0 +1,76 @@
|
| +// Copyright 2016 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "content/browser/gpu/gpu_arc_video_service_host.h"
|
| +
|
| +#include "base/location.h"
|
| +#include "base/logging.h"
|
| +#include "base/message_loop/message_loop.h"
|
| +#include "content/browser/gpu/gpu_process_host.h"
|
| +#include "content/common/gpu/gpu_messages.h"
|
| +#include "content/public/browser/arc_video_host_delegate.h"
|
| +#include "content/public/browser/browser_thread.h"
|
| +#include "ipc/ipc_channel_handle.h"
|
| +#include "ipc/ipc_message_macros.h"
|
| +#include "ipc/ipc_message_utils.h"
|
| +#include "third_party/mojo/src/mojo/edk/embedder/embedder.h"
|
| +
|
| +namespace content {
|
| +
|
| +namespace {
|
| +
|
| +void CreateChannelOnIOThread(
|
| + const GpuProcessHost::CreateArcVideoAcceleratorChannelCallback& callback) {
|
| + GpuProcessHost* gpu_process_host =
|
| + GpuProcessHost::Get(GpuProcessHost::GPU_PROCESS_KIND_SANDBOXED,
|
| + CAUSE_FOR_GPU_LAUNCH_ARCVIDEOACCELERATOR);
|
| + gpu_process_host->CreateArcVideoAcceleratorChannel(callback);
|
| +}
|
| +
|
| +void HandleChannelCreatedReply(
|
| + const arc::VideoHost::OnRequestArcVideoAcceleratorChannelCallback& callback,
|
| + const IPC::ChannelHandle& handle) {
|
| + MojoHandle wrapped_handle;
|
| + MojoResult wrap_result = mojo::embedder::CreatePlatformHandleWrapper(
|
| + mojo::embedder::ScopedPlatformHandle(
|
| + mojo::embedder::PlatformHandle(handle.socket.fd)),
|
| + &wrapped_handle);
|
| + if (wrap_result != MOJO_RESULT_OK) {
|
| + LOG(WARNING) << "Pipe failed to wrap handles. Closing: " << wrap_result;
|
| + callback.Run(mojo::ScopedHandle());
|
| + return;
|
| + }
|
| + callback.Run(mojo::ScopedHandle(mojo::Handle(wrapped_handle)));
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +scoped_ptr<arc::VideoHostDelegate> CreateArcVideoHostDelegate() {
|
| + return make_scoped_ptr(new GpuArcVideoServiceHost());
|
| +}
|
| +
|
| +GpuArcVideoServiceHost::GpuArcVideoServiceHost()
|
| + : io_task_runner_(content::BrowserThread::GetMessageLoopProxyForThread(
|
| + content::BrowserThread::IO)) {}
|
| +
|
| +GpuArcVideoServiceHost::~GpuArcVideoServiceHost() {
|
| + DCHECK(thread_checker_.CalledOnValidThread());
|
| +}
|
| +
|
| +void GpuArcVideoServiceHost::OnRequestArcVideoAcceleratorChannel(
|
| + const OnRequestArcVideoAcceleratorChannelCallback& callback) {
|
| + DCHECK(thread_checker_.CalledOnValidThread());
|
| +
|
| + io_task_runner_->PostTask(
|
| + FROM_HERE, base::Bind(&CreateChannelOnIOThread,
|
| + base::Bind(&HandleChannelCreatedReply, callback)));
|
| +}
|
| +
|
| +void GpuArcVideoServiceHost::OnStopping() {
|
| + GpuProcessHost::SendOnIO(GpuProcessHost::GPU_PROCESS_KIND_SANDBOXED,
|
| + CAUSE_FOR_GPU_LAUNCH_NO_LAUNCH,
|
| + new GpuMsg_ShutdownArcVideoService());
|
| +}
|
| +
|
| +} // namespace content
|
|
|