blob: 48812c970f861d98f127759a68ee9071b88e0a76 [file] [log] [blame]
// Copyright 2019 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef ARC_VM_LIBVDA_GPU_VAF_CONNECTION_H_
#define ARC_VM_LIBVDA_GPU_VAF_CONNECTION_H_
#include <memory>
#include <string>
#include <vector>
#include <base/threading/thread.h>
#include <base/threading/thread_checker.h>
#include <mojo/core/embedder/scoped_ipc_support.h>
#include "arc/vm/libvda/gpu/mojom/video.mojom.h"
namespace arc {
void RunTaskOnThread(scoped_refptr<base::SingleThreadTaskRunner> task_runner,
base::OnceClosure task);
// VafConnection provides a connection to the mojo VideoAcceleratorFactory
// interface using the LibvdaService D-Bus service. Only a single instantiated
// VafConnection object should exist at a time. Callers can use the
// GetVafConnection() function to retrieve an instance.
class VafConnection {
public:
~VafConnection();
scoped_refptr<base::SingleThreadTaskRunner> GetIpcTaskRunner();
void CreateDecodeAccelerator(arc::mojom::VideoDecodeAcceleratorPtr* vda_ptr);
void CreateEncodeAccelerator(arc::mojom::VideoEncodeAcceleratorPtr* vea_ptr);
// Returns a VafConnection instance.
static VafConnection* Get();
private:
VafConnection();
bool Initialize();
void InitializeOnIpcThread(bool* init_success);
void CleanupOnIpcThread();
void OnFactoryError(uint32_t custom_reason, const std::string& description);
void CreateDecodeAcceleratorOnIpcThread(
arc::mojom::VideoDecodeAcceleratorPtr* vda_ptr);
void CreateEncodeAcceleratorOnIpcThread(
arc::mojom::VideoEncodeAcceleratorPtr* vea_ptr);
base::Thread ipc_thread_;
// TODO(alexlau): Use THREAD_CHECKER macro after libchrome uprev
// (crbug.com/909719).
base::ThreadChecker ipc_thread_checker_;
std::unique_ptr<mojo::core::ScopedIPCSupport> ipc_support_;
arc::mojom::VideoAcceleratorFactoryPtr factory_ptr_;
};
} // namespace arc
#endif // ARC_VM_LIBVDA_GPU_VAF_CONNECTION_H_