Home | History | Annotate | Download | only in ndk
      1 /*
      2  * Copyright (C) 2015 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 //#define LOG_NDEBUG 0
     18 #define LOG_TAG "NdkCameraCaptureSession"
     19 #define ATRACE_TAG ATRACE_TAG_CAMERA
     20 
     21 #include <utils/Log.h>
     22 #include <utils/Mutex.h>
     23 #include <utils/StrongPointer.h>
     24 #include <utils/Trace.h>
     25 
     26 #include <camera/NdkCameraDevice.h>
     27 #include <camera/NdkCaptureRequest.h>
     28 #include <camera/NdkCameraCaptureSession.h>
     29 #include "impl/ACameraCaptureSession.h"
     30 
     31 #include "impl/ACameraCaptureSession.inc"
     32 
     33 using namespace android;
     34 
     35 EXPORT
     36 void ACameraCaptureSession_close(ACameraCaptureSession* session) {
     37     ATRACE_CALL();
     38     if (session != nullptr) {
     39         session->closeByApp();
     40     }
     41     return;
     42 }
     43 
     44 EXPORT
     45 camera_status_t ACameraCaptureSession_getDevice(
     46         ACameraCaptureSession* session, ACameraDevice **device) {
     47     ATRACE_CALL();
     48     if (session == nullptr || device == nullptr) {
     49         ALOGE("%s: Error: invalid input: session %p, device %p",
     50                 __FUNCTION__, session, device);
     51         return ACAMERA_ERROR_INVALID_PARAMETER;
     52     }
     53 
     54     if (session->isClosed()) {
     55         ALOGE("%s: session %p is already closed", __FUNCTION__, session);
     56         *device = nullptr;
     57         return ACAMERA_ERROR_SESSION_CLOSED;
     58     }
     59 
     60     *device = session->getDevice();
     61     if (*device == nullptr) {
     62         // Should not reach here
     63         ALOGE("%s: unknown failure: device is null", __FUNCTION__);
     64         return ACAMERA_ERROR_UNKNOWN;
     65     }
     66     return ACAMERA_OK;
     67 }
     68 
     69 EXPORT
     70 camera_status_t ACameraCaptureSession_capture(
     71         ACameraCaptureSession* session, /*optional*/ACameraCaptureSession_captureCallbacks* cbs,
     72         int numRequests, ACaptureRequest** requests,
     73         /*optional*/int* captureSequenceId) {
     74     ATRACE_CALL();
     75     if (session == nullptr || requests == nullptr || numRequests < 1) {
     76         ALOGE("%s: Error: invalid input: session %p, numRequest %d, requests %p",
     77                 __FUNCTION__, session, numRequests, requests);
     78         return ACAMERA_ERROR_INVALID_PARAMETER;
     79     }
     80 
     81     if (session->isClosed()) {
     82         ALOGE("%s: session %p is already closed", __FUNCTION__, session);
     83         if (captureSequenceId != nullptr) {
     84             *captureSequenceId = CAPTURE_SEQUENCE_ID_NONE;
     85         }
     86         return ACAMERA_ERROR_SESSION_CLOSED;
     87     }
     88 
     89     return session->capture(
     90             cbs, numRequests, requests, captureSequenceId);
     91 }
     92 
     93 EXPORT
     94 camera_status_t ACameraCaptureSession_logicalCamera_capture(
     95         ACameraCaptureSession* session,
     96         /*optional*/ACameraCaptureSession_logicalCamera_captureCallbacks* lcbs,
     97         int numRequests, ACaptureRequest** requests,
     98         /*optional*/int* captureSequenceId) {
     99     ATRACE_CALL();
    100     if (session == nullptr || requests == nullptr || numRequests < 1) {
    101         ALOGE("%s: Error: invalid input: session %p, numRequest %d, requests %p",
    102                 __FUNCTION__, session, numRequests, requests);
    103         return ACAMERA_ERROR_INVALID_PARAMETER;
    104     }
    105 
    106     if (session->isClosed()) {
    107         ALOGE("%s: session %p is already closed", __FUNCTION__, session);
    108         if (captureSequenceId) {
    109             *captureSequenceId = CAPTURE_SEQUENCE_ID_NONE;
    110         }
    111         return ACAMERA_ERROR_SESSION_CLOSED;
    112     }
    113 
    114     return session->capture(
    115             lcbs, numRequests, requests, captureSequenceId);
    116 }
    117 
    118 EXPORT
    119 camera_status_t ACameraCaptureSession_setRepeatingRequest(
    120         ACameraCaptureSession* session, /*optional*/ACameraCaptureSession_captureCallbacks* cbs,
    121         int numRequests, ACaptureRequest** requests,
    122         /*optional*/int* captureSequenceId) {
    123     ATRACE_CALL();
    124     if (session == nullptr || requests == nullptr || numRequests < 1) {
    125         ALOGE("%s: Error: invalid input: session %p, numRequest %d, requests %p",
    126                 __FUNCTION__, session, numRequests, requests);
    127         return ACAMERA_ERROR_INVALID_PARAMETER;
    128     }
    129 
    130     if (session->isClosed()) {
    131         ALOGE("%s: session %p is already closed", __FUNCTION__, session);
    132         if (captureSequenceId) {
    133             *captureSequenceId = CAPTURE_SEQUENCE_ID_NONE;
    134         }
    135         return ACAMERA_ERROR_SESSION_CLOSED;
    136     }
    137 
    138     return session->setRepeatingRequest(cbs, numRequests, requests, captureSequenceId);
    139 }
    140 
    141 EXPORT
    142 camera_status_t ACameraCaptureSession_logicalCamera_setRepeatingRequest(
    143         ACameraCaptureSession* session,
    144         /*optional*/ACameraCaptureSession_logicalCamera_captureCallbacks* lcbs,
    145         int numRequests, ACaptureRequest** requests,
    146         /*optional*/int* captureSequenceId) {
    147     ATRACE_CALL();
    148     if (session == nullptr || requests == nullptr || numRequests < 1) {
    149         ALOGE("%s: Error: invalid input: session %p, numRequest %d, requests %p",
    150                 __FUNCTION__, session, numRequests, requests);
    151         return ACAMERA_ERROR_INVALID_PARAMETER;
    152     }
    153 
    154     if (session->isClosed()) {
    155         ALOGE("%s: session %p is already closed", __FUNCTION__, session);
    156         if (captureSequenceId) {
    157             *captureSequenceId = CAPTURE_SEQUENCE_ID_NONE;
    158         }
    159         return ACAMERA_ERROR_SESSION_CLOSED;
    160     }
    161 
    162     return session->setRepeatingRequest(lcbs, numRequests, requests, captureSequenceId);
    163 }
    164 
    165 EXPORT
    166 camera_status_t ACameraCaptureSession_stopRepeating(ACameraCaptureSession* session) {
    167     ATRACE_CALL();
    168     if (session == nullptr) {
    169         ALOGE("%s: Error: session is null", __FUNCTION__);
    170         return ACAMERA_ERROR_INVALID_PARAMETER;
    171     }
    172 
    173     if (session->isClosed()) {
    174         ALOGE("%s: session %p is already closed", __FUNCTION__, session);
    175         return ACAMERA_ERROR_SESSION_CLOSED;
    176     }
    177     return session->stopRepeating();
    178 }
    179 
    180 EXPORT
    181 camera_status_t ACameraCaptureSession_abortCaptures(ACameraCaptureSession* session) {
    182     ATRACE_CALL();
    183     if (session == nullptr) {
    184         ALOGE("%s: Error: session is null", __FUNCTION__);
    185         return ACAMERA_ERROR_INVALID_PARAMETER;
    186     }
    187 
    188     if (session->isClosed()) {
    189         ALOGE("%s: session %p is already closed", __FUNCTION__, session);
    190         return ACAMERA_ERROR_SESSION_CLOSED;
    191     }
    192     return session->abortCaptures();
    193 }
    194 
    195 EXPORT
    196 camera_status_t ACameraCaptureSession_updateSharedOutput(ACameraCaptureSession* session,
    197         ACaptureSessionOutput* output) {
    198     ATRACE_CALL();
    199     if (session == nullptr) {
    200         ALOGE("%s: Error: session is null", __FUNCTION__);
    201         return ACAMERA_ERROR_INVALID_PARAMETER;
    202     }
    203 
    204     if (session->isClosed()) {
    205         ALOGE("%s: session %p is already closed", __FUNCTION__, session);
    206         return ACAMERA_ERROR_SESSION_CLOSED;
    207     }
    208     return session->updateOutputConfiguration(output);
    209 }
    210