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    }
10640ead60d7163c2d5577099d49f11da7afa6124d1Emilian Peev    *out = new ACaptureSessionOutput(window, false);
1070dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    return ACAMERA_OK;
1080dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh}
1090dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
1100dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia YehEXPORT
11140ead60d7163c2d5577099d49f11da7afa6124d1Emilian Peevcamera_status_t ACaptureSessionSharedOutput_create(
11240ead60d7163c2d5577099d49f11da7afa6124d1Emilian Peev        ANativeWindow* window, /*out*/ACaptureSessionOutput** out) {
11340ead60d7163c2d5577099d49f11da7afa6124d1Emilian Peev    ATRACE_CALL();
11440ead60d7163c2d5577099d49f11da7afa6124d1Emilian Peev    if (window == nullptr || out == nullptr) {
11540ead60d7163c2d5577099d49f11da7afa6124d1Emilian Peev        ALOGE("%s: Error: bad argument. window %p, out %p",
11640ead60d7163c2d5577099d49f11da7afa6124d1Emilian Peev                __FUNCTION__, window, out);
11740ead60d7163c2d5577099d49f11da7afa6124d1Emilian Peev        return ACAMERA_ERROR_INVALID_PARAMETER;
11840ead60d7163c2d5577099d49f11da7afa6124d1Emilian Peev    }
11940ead60d7163c2d5577099d49f11da7afa6124d1Emilian Peev    *out = new ACaptureSessionOutput(window, true);
12040ead60d7163c2d5577099d49f11da7afa6124d1Emilian Peev    return ACAMERA_OK;
12140ead60d7163c2d5577099d49f11da7afa6124d1Emilian Peev}
12240ead60d7163c2d5577099d49f11da7afa6124d1Emilian Peev
12340ead60d7163c2d5577099d49f11da7afa6124d1Emilian PeevEXPORT
12440ead60d7163c2d5577099d49f11da7afa6124d1Emilian Peevcamera_status_t ACaptureSessionSharedOutput_add(ACaptureSessionOutput *out,
12540ead60d7163c2d5577099d49f11da7afa6124d1Emilian Peev        ANativeWindow* window) {
12640ead60d7163c2d5577099d49f11da7afa6124d1Emilian Peev    ATRACE_CALL();
12740ead60d7163c2d5577099d49f11da7afa6124d1Emilian Peev    if ((window == nullptr) || (out == nullptr)) {
12840ead60d7163c2d5577099d49f11da7afa6124d1Emilian Peev        ALOGE("%s: Error: bad argument. window %p, out %p",
12940ead60d7163c2d5577099d49f11da7afa6124d1Emilian Peev                __FUNCTION__, window, out);
13040ead60d7163c2d5577099d49f11da7afa6124d1Emilian Peev        return ACAMERA_ERROR_INVALID_PARAMETER;
13140ead60d7163c2d5577099d49f11da7afa6124d1Emilian Peev    }
13240ead60d7163c2d5577099d49f11da7afa6124d1Emilian Peev    if (!out->mIsShared) {
13340ead60d7163c2d5577099d49f11da7afa6124d1Emilian Peev        ALOGE("%s: Error trying to insert a new window in non-shared output configuration",
13440ead60d7163c2d5577099d49f11da7afa6124d1Emilian Peev                __FUNCTION__);
13540ead60d7163c2d5577099d49f11da7afa6124d1Emilian Peev        return ACAMERA_ERROR_INVALID_OPERATION;
13640ead60d7163c2d5577099d49f11da7afa6124d1Emilian Peev    }
13740ead60d7163c2d5577099d49f11da7afa6124d1Emilian Peev    if (out->mWindow == window) {
13840ead60d7163c2d5577099d49f11da7afa6124d1Emilian Peev        ALOGE("%s: Error trying to add the same window associated with the output configuration",
13940ead60d7163c2d5577099d49f11da7afa6124d1Emilian Peev                __FUNCTION__);
14040ead60d7163c2d5577099d49f11da7afa6124d1Emilian Peev        return ACAMERA_ERROR_INVALID_PARAMETER;
14140ead60d7163c2d5577099d49f11da7afa6124d1Emilian Peev    }
14240ead60d7163c2d5577099d49f11da7afa6124d1Emilian Peev
14340ead60d7163c2d5577099d49f11da7afa6124d1Emilian Peev    auto insert = out->mSharedWindows.insert(window);
14440ead60d7163c2d5577099d49f11da7afa6124d1Emilian Peev    camera_status_t ret = (insert.second) ? ACAMERA_OK : ACAMERA_ERROR_INVALID_PARAMETER;
14540ead60d7163c2d5577099d49f11da7afa6124d1Emilian Peev    return ret;
14640ead60d7163c2d5577099d49f11da7afa6124d1Emilian Peev}
14740ead60d7163c2d5577099d49f11da7afa6124d1Emilian Peev
14840ead60d7163c2d5577099d49f11da7afa6124d1Emilian PeevEXPORT
14940ead60d7163c2d5577099d49f11da7afa6124d1Emilian Peevcamera_status_t ACaptureSessionSharedOutput_remove(ACaptureSessionOutput *out,
15040ead60d7163c2d5577099d49f11da7afa6124d1Emilian Peev        ANativeWindow* window) {
15140ead60d7163c2d5577099d49f11da7afa6124d1Emilian Peev    ATRACE_CALL();
15240ead60d7163c2d5577099d49f11da7afa6124d1Emilian Peev    if ((window == nullptr) || (out == nullptr)) {
15340ead60d7163c2d5577099d49f11da7afa6124d1Emilian Peev        ALOGE("%s: Error: bad argument. window %p, out %p",
15440ead60d7163c2d5577099d49f11da7afa6124d1Emilian Peev                __FUNCTION__, window, out);
15540ead60d7163c2d5577099d49f11da7afa6124d1Emilian Peev        return ACAMERA_ERROR_INVALID_PARAMETER;
15640ead60d7163c2d5577099d49f11da7afa6124d1Emilian Peev    }
15740ead60d7163c2d5577099d49f11da7afa6124d1Emilian Peev    if (!out->mIsShared) {
15840ead60d7163c2d5577099d49f11da7afa6124d1Emilian Peev        ALOGE("%s: Error trying to remove a  window in non-shared output configuration",
15940ead60d7163c2d5577099d49f11da7afa6124d1Emilian Peev                __FUNCTION__);
16040ead60d7163c2d5577099d49f11da7afa6124d1Emilian Peev        return ACAMERA_ERROR_INVALID_OPERATION;
16140ead60d7163c2d5577099d49f11da7afa6124d1Emilian Peev    }
16240ead60d7163c2d5577099d49f11da7afa6124d1Emilian Peev    if (out->mWindow == window) {
16340ead60d7163c2d5577099d49f11da7afa6124d1Emilian Peev        ALOGE("%s: Error trying to remove the same window associated with the output configuration",
16440ead60d7163c2d5577099d49f11da7afa6124d1Emilian Peev                __FUNCTION__);
16540ead60d7163c2d5577099d49f11da7afa6124d1Emilian Peev        return ACAMERA_ERROR_INVALID_PARAMETER;
16640ead60d7163c2d5577099d49f11da7afa6124d1Emilian Peev    }
16740ead60d7163c2d5577099d49f11da7afa6124d1Emilian Peev
16840ead60d7163c2d5577099d49f11da7afa6124d1Emilian Peev    auto remove = out->mSharedWindows.erase(window);
16940ead60d7163c2d5577099d49f11da7afa6124d1Emilian Peev    camera_status_t ret = (remove) ? ACAMERA_OK : ACAMERA_ERROR_INVALID_PARAMETER;
17040ead60d7163c2d5577099d49f11da7afa6124d1Emilian Peev    return ret;
17140ead60d7163c2d5577099d49f11da7afa6124d1Emilian Peev}
17240ead60d7163c2d5577099d49f11da7afa6124d1Emilian Peev
17340ead60d7163c2d5577099d49f11da7afa6124d1Emilian PeevEXPORT
174ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yehvoid ACaptureSessionOutput_free(ACaptureSessionOutput* output) {
1750dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    ATRACE_CALL();
176ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh    if (output != nullptr) {
177ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh        delete output;
178ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh    }
1790dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    return;
1800dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh}
1810dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
1820dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia YehEXPORT
1830dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yehcamera_status_t ACaptureSessionOutputContainer_add(
184ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh        ACaptureSessionOutputContainer* container, const ACaptureSessionOutput* output) {
1850dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    ATRACE_CALL();
186ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh    if (container == nullptr || output == nullptr) {
187ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh        ALOGE("%s: Error: invalid input: container %p, output %p",
188ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh                __FUNCTION__, container, output);
189ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh        return ACAMERA_ERROR_INVALID_PARAMETER;
190ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh    }
191ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh    auto pair = container->mOutputs.insert(*output);
192ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh    if (!pair.second) {
193ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh        ALOGW("%s: output %p already exists!", __FUNCTION__, output);
194ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh    }
1950dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    return ACAMERA_OK;
1960dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh}
1970dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
1980dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia YehEXPORT
1990dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yehcamera_status_t ACaptureSessionOutputContainer_remove(
200ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh        ACaptureSessionOutputContainer* container, const ACaptureSessionOutput* output) {
2010dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    ATRACE_CALL();
202ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh    if (container == nullptr || output == nullptr) {
203ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh        ALOGE("%s: Error: invalid input: container %p, output %p",
204ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh                __FUNCTION__, container, output);
205ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh        return ACAMERA_ERROR_INVALID_PARAMETER;
206ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh    }
207ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh    container->mOutputs.erase(*output);
2080dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    return ACAMERA_OK;
2090dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh}
2100dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh
2110dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia YehEXPORT
2120dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yehcamera_status_t ACameraDevice_createCaptureSession(
213ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh        ACameraDevice* device,
2140dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh        const ACaptureSessionOutputContainer*       outputs,
215ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh        const ACameraCaptureSession_stateCallbacks* callbacks,
216ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh        /*out*/ACameraCaptureSession** session) {
2170dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh    ATRACE_CALL();
218ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh    if (device == nullptr || outputs == nullptr || callbacks == nullptr || session == nullptr) {
219ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh        ALOGE("%s: Error: invalid input: device %p, outputs %p, callbacks %p, session %p",
220ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh                __FUNCTION__, device, outputs, callbacks, session);
221ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh        return ACAMERA_ERROR_INVALID_PARAMETER;
222ead9146f844ee194a4f4244ba8ae1a3aece12b63Yin-Chia Yeh    }
2235fbe0ba24d88910e68610add74fd1e1b94d282b5Emilian Peev    return device->createCaptureSession(outputs, nullptr, callbacks, session);
2245fbe0ba24d88910e68610add74fd1e1b94d282b5Emilian Peev}
2255fbe0ba24d88910e68610add74fd1e1b94d282b5Emilian Peev
2265fbe0ba24d88910e68610add74fd1e1b94d282b5Emilian PeevEXPORT
2275fbe0ba24d88910e68610add74fd1e1b94d282b5Emilian Peevcamera_status_t ACameraDevice_createCaptureSessionWithSessionParameters(
2285fbe0ba24d88910e68610add74fd1e1b94d282b5Emilian Peev        ACameraDevice* device,
2295fbe0ba24d88910e68610add74fd1e1b94d282b5Emilian Peev        const ACaptureSessionOutputContainer*       outputs,
2305fbe0ba24d88910e68610add74fd1e1b94d282b5Emilian Peev        const ACaptureRequest* sessionParameters,
2315fbe0ba24d88910e68610add74fd1e1b94d282b5Emilian Peev        const ACameraCaptureSession_stateCallbacks* callbacks,
2325fbe0ba24d88910e68610add74fd1e1b94d282b5Emilian Peev        /*out*/ACameraCaptureSession** session) {
2335fbe0ba24d88910e68610add74fd1e1b94d282b5Emilian Peev    ATRACE_CALL();
2345fbe0ba24d88910e68610add74fd1e1b94d282b5Emilian Peev    if (device == nullptr || outputs == nullptr || callbacks == nullptr || session == nullptr) {
2355fbe0ba24d88910e68610add74fd1e1b94d282b5Emilian Peev        ALOGE("%s: Error: invalid input: device %p, outputs %p, callbacks %p, session %p",
2365fbe0ba24d88910e68610add74fd1e1b94d282b5Emilian Peev                __FUNCTION__, device, outputs, callbacks, session);
2375fbe0ba24d88910e68610add74fd1e1b94d282b5Emilian Peev        return ACAMERA_ERROR_INVALID_PARAMETER;
2385fbe0ba24d88910e68610add74fd1e1b94d282b5Emilian Peev    }
2395fbe0ba24d88910e68610add74fd1e1b94d282b5Emilian Peev    return device->createCaptureSession(outputs, sessionParameters, callbacks, session);
2400dea57fd9fc4b2ccaab97d9477359fbd5a626f5cYin-Chia Yeh}
241