10dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh/* 20dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh * Copyright (C) 2015 The Android Open Source Project 30dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh * 40dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh * Licensed under the Apache License, Version 2.0 (the "License"); 50dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh * you may not use this file except in compliance with the License. 60dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh * You may obtain a copy of the License at 70dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh * 80dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh * http://www.apache.org/licenses/LICENSE-2.0 90dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh * 100dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh * Unless required by applicable law or agreed to in writing, software 110dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh * distributed under the License is distributed on an "AS IS" BASIS, 120dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh * See the License for the specific language governing permissions and 140dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh * limitations under the License. 150dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh */ 160dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 170dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh//#define LOG_NDEBUG 0 180dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh#define LOG_TAG "NdkCameraManager" 190dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh#define ATRACE_TAG ATRACE_TAG_CAMERA 200dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 210dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh#include <utils/Log.h> 220dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh#include <utils/Trace.h> 230dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 240dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh#include <NdkCameraManager.h> 250dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh#include "impl/ACameraManager.h" 260dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 27d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvalausing namespace android; 28d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala 290dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia YehEXPORT 300dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia YehACameraManager* ACameraManager_create() { 310dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ATRACE_CALL(); 320dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return new ACameraManager(); 330dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh} 340dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 350dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia YehEXPORT 360dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yehvoid ACameraManager_delete(ACameraManager* manager) { 370dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ATRACE_CALL(); 380dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh if (manager != nullptr) { 390dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh delete manager; 400dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 410dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh} 420dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 430dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia YehEXPORT 440dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yehcamera_status_t ACameraManager_getCameraIdList( 450dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ACameraManager* manager, ACameraIdList** cameraIdList) { 460dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ATRACE_CALL(); 470dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh if (manager == nullptr || cameraIdList == nullptr) { 48ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh ALOGE("%s: invalid argument! manager %p, cameraIdList %p", 490dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh __FUNCTION__, manager, cameraIdList); 500dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return ACAMERA_ERROR_INVALID_PARAMETER; 510dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 520dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return manager->getCameraIdList(cameraIdList); 530dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh} 540dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 550dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia YehEXPORT 560dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yehvoid ACameraManager_deleteCameraIdList(ACameraIdList* cameraIdList) { 570dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ATRACE_CALL(); 580dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh if (cameraIdList != nullptr) { 590dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ACameraManager::deleteCameraIdList(cameraIdList); 600dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 610dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh} 620dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 630dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia YehEXPORT 640dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yehcamera_status_t ACameraManager_registerAvailabilityCallback( 650dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ACameraManager*, const ACameraManager_AvailabilityCallbacks *callback) { 660dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ATRACE_CALL(); 670dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh if (callback == nullptr) { 680dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ALOGE("%s: invalid argument! callback is null!", __FUNCTION__); 690dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return ACAMERA_ERROR_INVALID_PARAMETER; 700dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 710dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh if (callback->onCameraAvailable == nullptr || callback->onCameraUnavailable == nullptr) { 72ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh ALOGE("%s: invalid argument! callback %p, " 73ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh "onCameraAvailable %p, onCameraUnavailable %p", 740dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh __FUNCTION__, callback, 750dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh callback->onCameraAvailable, callback->onCameraUnavailable); 760dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return ACAMERA_ERROR_INVALID_PARAMETER; 770dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 780dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh CameraManagerGlobal::getInstance().registerAvailabilityCallback(callback); 790dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return ACAMERA_OK; 800dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh} 810dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 820dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia YehEXPORT 830dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yehcamera_status_t ACameraManager_unregisterAvailabilityCallback( 840dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ACameraManager*, const ACameraManager_AvailabilityCallbacks *callback) { 850dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ATRACE_CALL(); 860dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh if (callback == nullptr) { 870dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ALOGE("%s: invalid argument! callback is null!", __FUNCTION__); 880dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return ACAMERA_ERROR_INVALID_PARAMETER; 890dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 900dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh if (callback->onCameraAvailable == nullptr || callback->onCameraUnavailable == nullptr) { 91ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh ALOGE("%s: invalid argument! callback %p, " 92ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh "onCameraAvailable %p, onCameraUnavailable %p", 930dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh __FUNCTION__, callback, 940dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh callback->onCameraAvailable, callback->onCameraUnavailable); 950dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return ACAMERA_ERROR_INVALID_PARAMETER; 960dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 970dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh CameraManagerGlobal::getInstance().unregisterAvailabilityCallback(callback); 980dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return ACAMERA_OK; 990dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh} 1000dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 1010dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia YehEXPORT 1020dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yehcamera_status_t ACameraManager_getCameraCharacteristics( 1030dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ACameraManager* mgr, const char* cameraId, ACameraMetadata** chars){ 1040dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ATRACE_CALL(); 1050dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh if (mgr == nullptr || cameraId == nullptr || chars == nullptr) { 106ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh ALOGE("%s: invalid argument! mgr %p cameraId %p chars %p", 1070dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh __FUNCTION__, mgr, cameraId, chars); 1080dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return ACAMERA_ERROR_INVALID_PARAMETER; 1090dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 1100dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return mgr->getCameraCharacteristics(cameraId, chars); 1110dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh} 1120dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 1130dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia YehEXPORT 1140dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yehcamera_status_t ACameraManager_openCamera( 1150dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ACameraManager* mgr, const char* cameraId, 1160dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ACameraDevice_StateCallbacks* callback, 1170dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh /*out*/ACameraDevice** device) { 1180dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ATRACE_CALL(); 1190dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh if (mgr == nullptr || cameraId == nullptr || callback == nullptr || device == nullptr) { 120ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh ALOGE("%s: invalid argument! mgr %p cameraId %p callback %p device %p", 1210dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh __FUNCTION__, mgr, cameraId, callback, device); 1220dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return ACAMERA_ERROR_INVALID_PARAMETER; 1230dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 1240dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return mgr->openCamera(cameraId, callback, device); 1250dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh} 126