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 "NdkCameraDevice" 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 247e8d4ba5887affda749978d787b898bf31fda729Colin Cross#include <camera/NdkCameraDevice.h> 25ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh#include "impl/ACameraCaptureSession.h" 260dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 270dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yehusing namespace android; 280dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 290dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia YehEXPORT 300dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yehcamera_status_t ACameraDevice_close(ACameraDevice* device) { 310dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ATRACE_CALL(); 320dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh if (device == nullptr) { 330dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ALOGE("%s: invalid argument! device is null", __FUNCTION__); 340dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return ACAMERA_ERROR_INVALID_PARAMETER; 350dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 360dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh delete device; 370dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return ACAMERA_OK; 380dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh} 390dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 400dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia YehEXPORT 410dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yehconst char* ACameraDevice_getId(const ACameraDevice* device) { 420dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ATRACE_CALL(); 430dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh if (device == nullptr) { 440dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ALOGE("%s: invalid argument! device is null", __FUNCTION__); 450dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return nullptr; 460dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 470dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return device->getId(); 480dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh} 490dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 500dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia YehEXPORT 510dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yehcamera_status_t ACameraDevice_createCaptureRequest( 520dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh const ACameraDevice* device, 530dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ACameraDevice_request_template templateId, 540dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ACaptureRequest** request) { 550dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ATRACE_CALL(); 560dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh if (device == nullptr || request == nullptr) { 57ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh ALOGE("%s: invalid argument! device %p request %p", 580dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh __FUNCTION__, device, request); 590dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return ACAMERA_ERROR_INVALID_PARAMETER; 600dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 610dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh switch (templateId) { 620dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh case TEMPLATE_PREVIEW: 630dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh case TEMPLATE_STILL_CAPTURE: 640dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh case TEMPLATE_RECORD: 650dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh case TEMPLATE_VIDEO_SNAPSHOT: 660dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh case TEMPLATE_ZERO_SHUTTER_LAG: 670dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh case TEMPLATE_MANUAL: 680dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh break; 690dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh default: 700dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ALOGE("%s: unknown template ID %d", __FUNCTION__, templateId); 710dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return ACAMERA_ERROR_INVALID_PARAMETER; 720dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh } 730dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return device->createCaptureRequest(templateId, request); 740dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh} 750dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 760dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia YehEXPORT 77ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yehcamera_status_t ACaptureSessionOutputContainer_create( 78ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh /*out*/ACaptureSessionOutputContainer** out) { 790dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ATRACE_CALL(); 80ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh if (out == nullptr) { 81ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh ALOGE("%s: Error: out null", __FUNCTION__); 82ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh return ACAMERA_ERROR_INVALID_PARAMETER; 83ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh } 84ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh *out = new ACaptureSessionOutputContainer(); 850dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return ACAMERA_OK; 860dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh} 870dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 880dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia YehEXPORT 89ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yehvoid ACaptureSessionOutputContainer_free(ACaptureSessionOutputContainer* container) { 900dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ATRACE_CALL(); 91ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh if (container != nullptr) { 92ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh delete container; 93ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh } 940dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return; 950dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh} 960dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 970dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia YehEXPORT 98ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yehcamera_status_t ACaptureSessionOutput_create( 99ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh ANativeWindow* window, /*out*/ACaptureSessionOutput** out) { 1000dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ATRACE_CALL(); 101ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh if (window == nullptr || out == nullptr) { 102ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh ALOGE("%s: Error: bad argument. window %p, out %p", 103ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh __FUNCTION__, window, out); 104ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh return ACAMERA_ERROR_INVALID_PARAMETER; 105ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh } 106ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh *out = new ACaptureSessionOutput(window); 1070dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return ACAMERA_OK; 1080dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh} 1090dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 1100dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia YehEXPORT 111ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yehvoid ACaptureSessionOutput_free(ACaptureSessionOutput* output) { 1120dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ATRACE_CALL(); 113ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh if (output != nullptr) { 114ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh delete output; 115ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh } 1160dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return; 1170dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh} 1180dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 1190dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia YehEXPORT 1200dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yehcamera_status_t ACaptureSessionOutputContainer_add( 121ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh ACaptureSessionOutputContainer* container, const ACaptureSessionOutput* output) { 1220dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ATRACE_CALL(); 123ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh if (container == nullptr || output == nullptr) { 124ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh ALOGE("%s: Error: invalid input: container %p, output %p", 125ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh __FUNCTION__, container, output); 126ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh return ACAMERA_ERROR_INVALID_PARAMETER; 127ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh } 128ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh auto pair = container->mOutputs.insert(*output); 129ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh if (!pair.second) { 130ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh ALOGW("%s: output %p already exists!", __FUNCTION__, output); 131ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh } 1320dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return ACAMERA_OK; 1330dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh} 1340dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 1350dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia YehEXPORT 1360dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yehcamera_status_t ACaptureSessionOutputContainer_remove( 137ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh ACaptureSessionOutputContainer* container, const ACaptureSessionOutput* output) { 1380dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ATRACE_CALL(); 139ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh if (container == nullptr || output == nullptr) { 140ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh ALOGE("%s: Error: invalid input: container %p, output %p", 141ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh __FUNCTION__, container, output); 142ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh return ACAMERA_ERROR_INVALID_PARAMETER; 143ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh } 144ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh container->mOutputs.erase(*output); 1450dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh return ACAMERA_OK; 1460dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh} 1470dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh 1480dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia YehEXPORT 1490dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yehcamera_status_t ACameraDevice_createCaptureSession( 150ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh ACameraDevice* device, 1510dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh const ACaptureSessionOutputContainer* outputs, 152ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh const ACameraCaptureSession_stateCallbacks* callbacks, 153ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh /*out*/ACameraCaptureSession** session) { 1540dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh ATRACE_CALL(); 155ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh if (device == nullptr || outputs == nullptr || callbacks == nullptr || session == nullptr) { 156ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh ALOGE("%s: Error: invalid input: device %p, outputs %p, callbacks %p, session %p", 157ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh __FUNCTION__, device, outputs, callbacks, session); 158ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh return ACAMERA_ERROR_INVALID_PARAMETER; 159ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh } 160ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh return device->createCaptureSession(outputs, callbacks, session); 1610dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh} 162