blob: 3abf3d55c0bb397b70df2200ba1b3e4fd3320638 [file] [log] [blame]
/*
* Copyright 2016 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 HAL_ADAPTER_CAMERA_HAL_ADAPTER_H_
#define HAL_ADAPTER_CAMERA_HAL_ADAPTER_H_
#include <map>
#include <memory>
#include <string>
#include <base/threading/thread.h>
#include <mojo/edk/embedder/process_delegate.h>
#include "hal_adapter/mojo/arc_camera3.mojom.h"
#include "hardware/camera3.h"
namespace arc {
class CameraDeviceAdapter;
class CameraModuleDelegate;
class CameraModuleCallbacksDelegate;
class CameraHalAdapter : public mojo::edk::ProcessDelegate {
public:
CameraHalAdapter(camera_module_t* camera_module,
int socket_fd,
base::Closure quit_cb);
~CameraHalAdapter();
// Create a mojo connection to container.
bool Start();
// ProcessDelegate implementation.
void OnShutdownComplete() override;
// Callback interface for CameraModuleDelegate.
// These methods are callbacks for |module_delegate_| and are executed on
// the mojo IPC handler thread in |module_delegate_|.
int32_t OpenDevice(int32_t device_id, mojom::Camera3DeviceOpsPtr* device_ops);
int32_t GetNumberOfCameras();
int32_t GetCameraInfo(int32_t device_id, mojom::CameraInfoPtr* camera_info);
int32_t SetCallbacks(mojom::CameraModuleCallbacksPtr callbacks);
// A callback for the camera devices opened in OpenDevice(). Used to run
// CloseDevice() on the same thread that OpenDevice() runs on.
void CloseDeviceCallback(base::TaskRunner* runner, int32_t device_id);
private:
// Clean up the camera device specified by |device_id| in |device_adapters_|.
void CloseDevice(int32_t device_id);
void ResetModuleDelegateOnThread();
void ResetCallbacksDelegateOnThread();
// The handle to the camera HAL dlopen()'d on process start.
camera_module_t* camera_module_;
// A callback passed to |module_delegate_| to be called to exit the process.
base::Closure quit_cb_;
// The unix domain socket used to establish the mojo IPC channel.
base::ScopedFD socket_fd_;
// Thread used in mojo to send and receive IPC messages.
base::Thread ipc_thread_;
// The thread that all camera module functions operate on.
base::Thread camera_module_thread_;
// The thread that all the Mojo communication of camera module callbacks
// operate on.
base::Thread camera_module_callbacks_thread_;
// The delegate that handles the CameraModule mojo IPC.
std::unique_ptr<CameraModuleDelegate> module_delegate_;
// The delegate that handles the CameraModuleCallbacks mojo IPC.
std::unique_ptr<CameraModuleCallbacksDelegate> callbacks_delegate_;
// The handles to the opened camera devices. |device_adapters_| is accessed
// only in OpenDevice() and CloseDevice(). In order to do lock-free access to
// |device_adapters_|, we run OpenDevice() and CloseDevice() on the same
// thread (i.e. the mojo IPC handler thread in |module_delegate_|).
std::map<int32_t, std::unique_ptr<CameraDeviceAdapter>> device_adapters_;
DISALLOW_IMPLICIT_CONSTRUCTORS(CameraHalAdapter);
};
} // namespace arc
#endif // HAL_ADAPTER_CAMERA_HAL_ADAPTER_H_