| /* |
| * Copyright 2017 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_SERVER_IMPL_H_ |
| #define HAL_ADAPTER_CAMERA_HAL_SERVER_IMPL_H_ |
| |
| #include <memory> |
| |
| #include <base/files/file_path.h> |
| #include <base/files/file_path_watcher.h> |
| #include <base/single_thread_task_runner.h> |
| #include <mojo/public/cpp/bindings/binding.h> |
| |
| #include "hal_adapter/camera_hal_adapter.h" |
| #include "mojo/cros_camera_service.mojom.h" |
| |
| namespace cros { |
| |
| // CameraHalServerImpl is the implementation of the CameraHalServer Mojo |
| // interface. It hosts the camera HAL v3 adapter and registers itself to the |
| // CameraHalDispatcher Mojo proxy in started by Chrome. Camera clients such |
| // as Chrome VideoCaptureDeviceFactory and Android cameraserver process connect |
| // to the CameraHalDispatcher to ask for camera service; CameraHalDispatcher |
| // proxies the service requests to CameraHalServerImpl. |
| class CameraHalServerImpl final : public mojom::CameraHalServer { |
| public: |
| CameraHalServerImpl(); |
| ~CameraHalServerImpl(); |
| |
| // Initializes the threads and start monitoring the unix domain socket file |
| // created by Chrome. |
| bool Start(); |
| |
| // CameraHalServer Mojo interface implementation. This method runs on |
| // |ipc_thread_|. |
| void CreateChannel(mojom::CameraModuleRequest camera_module_request) final; |
| |
| void SetTracingEnabled(bool enabled); |
| |
| private: |
| // Callback method for the unix domain socket file change events. The method |
| // will try to establish the Mojo connection to the CameraHalDispatcher |
| // started by Chrome. |
| void OnSocketFileStatusChange(const base::FilePath& socket_path, bool error); |
| |
| // Registers with the CameraHalDispatcher Mojo proxy. After registration the |
| // CameraHalDispatcher proxy will call CreateChannel for each connected |
| // service clients to create a Mojo channel handle to the HAL adapter. This |
| // method runs on |ipc_thread_|. |
| void RegisterCameraHal(); |
| |
| // Connection error handler for the Mojo connection to CameraHalDispatcher. |
| // This method runs on |ipc_thread_|. |
| void OnServiceMojoChannelError(); |
| |
| void ExitOnMainThread(int exit_status); |
| |
| // Watches for change events on the unix domain socket file created by Chrome. |
| // Upon file change OnScoketFileStatusChange will be called to initiate |
| // connection to CameraHalDispatcher. |
| base::FilePathWatcher watcher_; |
| |
| // The Mojo IPC thread. |
| base::Thread ipc_thread_; |
| |
| const scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_; |
| |
| // The Mojo channel to CameraHalDispatcher in Chrome. All the Mojo |
| // communication to |dispatcher_| happens on |ipc_thread_|. |
| mojom::CameraHalDispatcherPtr dispatcher_; |
| |
| // The CameraHalServer implementation binding. All the function calls to |
| // |binding_| runs on |ipc_thread_|. |
| mojo::Binding<mojom::CameraHalServer> binding_; |
| |
| // The camera HAL adapter instance. Each call to CreateChannel creates a |
| // new Mojo binding in the camera HAL adapter. Currently the camera HAL |
| // adapter serves two clients: Chrome VideoCaptureDeviceFactory and Android |
| // cameraserver process. |
| std::unique_ptr<CameraHalAdapter> camera_hal_adapter_; |
| |
| DISALLOW_COPY_AND_ASSIGN(CameraHalServerImpl); |
| }; |
| |
| } // namespace cros |
| |
| #endif // HAL_ADAPTER_CAMERA_HAL_SERVER_IMPL_H_ |