camera_pixel_format_e _defaultPixelFormat { CAMERA_PIXEL_FORMAT_I420 };
std::vector<camera_pixel_format_e> _validPixelFormat;
std::vector<cv::Size> _validResolution;
+ std::unordered_set<unsigned int> _camera_ids;
+ camera_device_e _active_camera_id {};
+ std::map<int, camera_device_e> _cameraDeviceIdTable = {
+ { 0, CAMERA_DEVICE_CAMERA0 }, { 1, CAMERA_DEVICE_CAMERA1 }, { 2, CAMERA_DEVICE_CAMERA2 },
+ { 3, CAMERA_DEVICE_CAMERA3 }, { 4, CAMERA_DEVICE_CAMERA4 }, { 5, CAMERA_DEVICE_CAMERA5 },
+ { 6, CAMERA_DEVICE_CAMERA6 }, { 7, CAMERA_DEVICE_CAMERA7 }, { 8, CAMERA_DEVICE_CAMERA8 },
+ { 9, CAMERA_DEVICE_CAMERA9 }
+ };
+ void updateAvailableCameraDevices();
+ void setActivateCameraDevice(unsigned int id);
void threadLoop();
static void previewCb(camera_preview_data_s *data, void *user_data);
static bool previewFormatCb(camera_pixel_format_e format, void *user_data);
CameraApiBackend::CameraApiBackend(const CameraConfig &config)
{
- int ret = camera_create(CAMERA_DEVICE_CAMERA0, &_camera);
+ updateAvailableCameraDevices();
+ setActivateCameraDevice(config.device_id);
+
+ int ret = camera_create(_active_camera_id, &_camera);
if (ret != CAMERA_ERROR_NONE) {
SINGLEO_LOGE("CameraApiBackend: camera_create failed. ret: %d", ret);
throw InvalidOperation("CameraApiBackend: camera_create failed.");
camera_destroy(_camera);
}
+void CameraApiBackend::updateAvailableCameraDevices()
+{
+ for (unsigned int idx = 0; idx < _cameraDeviceIdTable.size(); ++idx) {
+ camera_h camera;
+
+ if (camera_create(_cameraDeviceIdTable[idx], &camera) == CAMERA_ERROR_NONE) {
+ // Update valid camera device ids.
+ _camera_ids.insert(idx);
+ camera_destroy(camera);
+
+ SINGLEO_LOGD("camera device id %d is valid.", idx);
+ }
+ }
+}
+
+void CameraApiBackend::setActivateCameraDevice(unsigned int id)
+{
+ if (_camera_ids.count(id) == 0) {
+ SINGLEO_LOGE("A given camera device id(%d) isn't supported.", id);
+ throw InvalidOperation("A given camera device id not supported.");
+ }
+
+ _active_camera_id = _cameraDeviceIdTable[id];
+
+ SINGLEO_LOGD("Camera device id(%d) has been activated.", id);
+}
+
void CameraApiBackend::setUserCb(const InputServiceCallbackType &userCb, void *user_data)
{
_userCb = userCb;