blob: b4ebc40d6aeb56be76ed9b9db5f61e00d7620fbb [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 CAMERA_HAL_IP_CAMERA_HAL_H_
#define CAMERA_HAL_IP_CAMERA_HAL_H_
#include <base/macros.h>
#include <base/synchronization/atomic_flag.h>
#include <base/synchronization/lock.h>
#include <base/synchronization/waitable_event.h>
#include <mojo/public/cpp/system/isolated_connection.h>
#include <map>
#include <memory>
#include <string>
#include <sys/types.h>
#include "camera/camera_metadata.h"
#include "cros-camera/camera_mojo_channel_manager.h"
#include "cros-camera/future.h"
#include "hal/ip/camera_device.h"
#include "mojo/ip/ip_camera.mojom.h"
namespace cros {
class CameraHal : public mojom::IpCameraConnectionListener {
public:
CameraHal();
CameraHal(const CameraHal&) = delete;
CameraHal& operator=(const CameraHal&) = delete;
~CameraHal();
static CameraHal& GetInstance();
CameraMojoChannelManager* GetMojoManagerInstance();
// Implementations of camera_module_t
int OpenDevice(int id, const hw_module_t* module, hw_device_t** hw_device);
int GetNumberOfCameras() const;
int GetCameraInfo(int id, camera_info* info);
int SetCallbacks(const camera_module_callbacks_t* callbacks);
int Init();
// Implementations for cros_camera_hal_t.
void SetUp(CameraMojoChannelManager* mojo_manager);
void TearDown();
private:
// IpCameraConnectionListener interface
void OnDeviceConnected(const std::string& ip,
const std::string& name,
mojom::IpCameraDevicePtr device_ptr,
mojom::IpCameraStreamPtr default_stream) override;
void OnDeviceDisconnected(const std::string& ip) override;
void InitOnIpcThread(scoped_refptr<Future<int>> return_val);
void DestroyOnIpcThread(scoped_refptr<Future<void>> return_val);
void OnConnectionError();
base::AtomicFlag initialized_;
std::unique_ptr<mojo::IsolatedConnection> isolated_connection_;
mojom::IpCameraDetectorPtr detector_;
mojo::Binding<IpCameraConnectionListener> binding_;
// The maps, as well as |next_camera_id_| are protected by this lock
base::Lock camera_map_lock_;
// Maps from IP to HAL camera id
std::map<const std::string, int> ip_to_id_;
std::map<int, std::unique_ptr<CameraDevice>> cameras_;
int next_camera_id_;
// Any calls to OnDeviceConnected/OnDeviceDisconnected will block until
// SetCallbacks has been called
base::WaitableEvent callbacks_set_;
const camera_module_callbacks_t* callbacks_;
// Mojo manager which is used for Mojo communication.
CameraMojoChannelManager* mojo_manager_;
};
} // namespace cros
extern camera_module_t HAL_MODULE_INFO_SYM;
#endif // CAMERA_HAL_IP_CAMERA_HAL_H_