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