Loading camera/ndk/NdkCameraCaptureSession.cpp +40 −57 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ #include "impl/ACameraCaptureSession.h" #include "impl/ACameraCaptureSession.inc" #include "NdkCameraCaptureSession.inc" using namespace android; Loading Loading @@ -72,22 +73,16 @@ camera_status_t ACameraCaptureSession_capture( int numRequests, ACaptureRequest** requests, /*optional*/int* captureSequenceId) { ATRACE_CALL(); if (session == nullptr || requests == nullptr || numRequests < 1) { ALOGE("%s: Error: invalid input: session %p, numRequest %d, requests %p", __FUNCTION__, session, numRequests, requests); return ACAMERA_ERROR_INVALID_PARAMETER; return captureTemplate(session, cbs, numRequests, requests, captureSequenceId); } if (session->isClosed()) { ALOGE("%s: session %p is already closed", __FUNCTION__, session); if (captureSequenceId != nullptr) { *captureSequenceId = CAPTURE_SEQUENCE_ID_NONE; } return ACAMERA_ERROR_SESSION_CLOSED; } return session->capture( cbs, numRequests, requests, captureSequenceId); EXPORT camera_status_t ACameraCaptureSession_captureV2( ACameraCaptureSession* session, /*optional*/ACameraCaptureSession_captureCallbacksV2* cbs, int numRequests, ACaptureRequest** requests, /*optional*/int* captureSequenceId) { ATRACE_CALL(); return captureTemplate(session, cbs, numRequests, requests, captureSequenceId); } EXPORT Loading @@ -97,22 +92,26 @@ camera_status_t ACameraCaptureSession_logicalCamera_capture( int numRequests, ACaptureRequest** requests, /*optional*/int* captureSequenceId) { ATRACE_CALL(); if (session == nullptr || requests == nullptr || numRequests < 1) { ALOGE("%s: Error: invalid input: session %p, numRequest %d, requests %p", __FUNCTION__, session, numRequests, requests); return ACAMERA_ERROR_INVALID_PARAMETER; return captureTemplate(session, lcbs, numRequests, requests, captureSequenceId); } if (session->isClosed()) { ALOGE("%s: session %p is already closed", __FUNCTION__, session); if (captureSequenceId) { *captureSequenceId = CAPTURE_SEQUENCE_ID_NONE; } return ACAMERA_ERROR_SESSION_CLOSED; EXPORT camera_status_t ACameraCaptureSession_logicalCamera_captureV2( ACameraCaptureSession* session, /*optional*/ACameraCaptureSession_logicalCamera_captureCallbacksV2* lcbs, int numRequests, ACaptureRequest** requests, /*optional*/int* captureSequenceId) { ATRACE_CALL(); return captureTemplate(session, lcbs, numRequests, requests, captureSequenceId); } return session->capture( lcbs, numRequests, requests, captureSequenceId); EXPORT camera_status_t ACameraCaptureSession_setRepeatingRequestV2( ACameraCaptureSession* session, /*optional*/ACameraCaptureSession_captureCallbacksV2* cbs, int numRequests, ACaptureRequest** requests, /*optional*/int* captureSequenceId) { ATRACE_CALL(); return setRepeatingRequestTemplate(session, cbs, numRequests, requests, captureSequenceId); } EXPORT Loading @@ -121,22 +120,9 @@ camera_status_t ACameraCaptureSession_setRepeatingRequest( int numRequests, ACaptureRequest** requests, /*optional*/int* captureSequenceId) { ATRACE_CALL(); if (session == nullptr || requests == nullptr || numRequests < 1) { ALOGE("%s: Error: invalid input: session %p, numRequest %d, requests %p", __FUNCTION__, session, numRequests, requests); return ACAMERA_ERROR_INVALID_PARAMETER; return setRepeatingRequestTemplate(session, cbs, numRequests, requests, captureSequenceId); } if (session->isClosed()) { ALOGE("%s: session %p is already closed", __FUNCTION__, session); if (captureSequenceId) { *captureSequenceId = CAPTURE_SEQUENCE_ID_NONE; } return ACAMERA_ERROR_SESSION_CLOSED; } return session->setRepeatingRequest(cbs, numRequests, requests, captureSequenceId); } EXPORT camera_status_t ACameraCaptureSession_logicalCamera_setRepeatingRequest( Loading @@ -145,21 +131,18 @@ camera_status_t ACameraCaptureSession_logicalCamera_setRepeatingRequest( int numRequests, ACaptureRequest** requests, /*optional*/int* captureSequenceId) { ATRACE_CALL(); if (session == nullptr || requests == nullptr || numRequests < 1) { ALOGE("%s: Error: invalid input: session %p, numRequest %d, requests %p", __FUNCTION__, session, numRequests, requests); return ACAMERA_ERROR_INVALID_PARAMETER; return setRepeatingRequestTemplate(session, lcbs, numRequests, requests, captureSequenceId); } if (session->isClosed()) { ALOGE("%s: session %p is already closed", __FUNCTION__, session); if (captureSequenceId) { *captureSequenceId = CAPTURE_SEQUENCE_ID_NONE; } return ACAMERA_ERROR_SESSION_CLOSED; } return session->setRepeatingRequest(lcbs, numRequests, requests, captureSequenceId); EXPORT camera_status_t ACameraCaptureSession_logicalCamera_setRepeatingRequestV2( ACameraCaptureSession* session, /*optional*/ACameraCaptureSession_logicalCamera_captureCallbacksV2* lcbs, int numRequests, ACaptureRequest** requests, /*optional*/int* captureSequenceId) { ATRACE_CALL(); return setRepeatingRequestTemplate(session, lcbs, numRequests, requests, captureSequenceId); } EXPORT Loading camera/ndk/NdkCameraCaptureSession.inc 0 → 100644 +70 −0 Original line number Diff line number Diff line /* * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "impl/ACameraCaptureSession.h" #include <camera/NdkCameraCaptureSession.h> using namespace android; template <class CallbackType> camera_status_t captureTemplate( ACameraCaptureSession* session, /*optional*/CallbackType* cbs, int numRequests, ACaptureRequest** requests, /*optional*/int* captureSequenceId) { ATRACE_CALL(); if (session == nullptr || requests == nullptr || numRequests < 1) { ALOGE("%s: Error: invalid input: session %p, numRequest %d, requests %p", __FUNCTION__, session, numRequests, requests); return ACAMERA_ERROR_INVALID_PARAMETER; } if (session->isClosed()) { ALOGE("%s: session %p is already closed", __FUNCTION__, session); if (captureSequenceId) { *captureSequenceId = CAPTURE_SEQUENCE_ID_NONE; } return ACAMERA_ERROR_SESSION_CLOSED; } return session->capture( cbs, numRequests, requests, captureSequenceId); } template <class CallbackType> camera_status_t setRepeatingRequestTemplate( ACameraCaptureSession* session, /*optional*/CallbackType* cbs, int numRequests, ACaptureRequest** requests, /*optional*/int* captureSequenceId) { ATRACE_CALL(); if (session == nullptr || requests == nullptr || numRequests < 1) { ALOGE("%s: Error: invalid input: session %p, numRequest %d, requests %p", __FUNCTION__, session, numRequests, requests); return ACAMERA_ERROR_INVALID_PARAMETER; } if (session->isClosed()) { ALOGE("%s: session %p is already closed", __FUNCTION__, session); if (captureSequenceId) { *captureSequenceId = CAPTURE_SEQUENCE_ID_NONE; } return ACAMERA_ERROR_SESSION_CLOSED; } return session->setRepeatingRequest(cbs, numRequests, requests, captureSequenceId); } camera/ndk/impl/ACameraDevice.cpp +82 −7 Original line number Diff line number Diff line Loading @@ -26,8 +26,6 @@ #include "ACaptureRequest.h" #include "ACameraCaptureSession.h" #include "ACameraCaptureSession.inc" ACameraDevice::~ACameraDevice() { mDevice->stopLooperAndDisconnect(); } Loading Loading @@ -913,6 +911,7 @@ void CameraDevice::CallbackHandler::onMessageReceived( case kWhatOnError: case kWhatSessionStateCb: case kWhatCaptureStart: case kWhatCaptureStart2: case kWhatCaptureResult: case kWhatLogicalCaptureResult: case kWhatCaptureFail: Loading Loading @@ -985,6 +984,7 @@ void CameraDevice::CallbackHandler::onMessageReceived( } case kWhatSessionStateCb: case kWhatCaptureStart: case kWhatCaptureStart2: case kWhatCaptureResult: case kWhatLogicalCaptureResult: case kWhatCaptureFail: Loading @@ -1004,6 +1004,7 @@ void CameraDevice::CallbackHandler::onMessageReceived( sp<CaptureRequest> requestSp = nullptr; switch (msg->what()) { case kWhatCaptureStart: case kWhatCaptureStart2: case kWhatCaptureResult: case kWhatLogicalCaptureResult: case kWhatCaptureFail: Loading Loading @@ -1055,6 +1056,35 @@ void CameraDevice::CallbackHandler::onMessageReceived( freeACaptureRequest(request); break; } case kWhatCaptureStart2: { ACameraCaptureSession_captureCallback_startV2 onStart2; found = msg->findPointer(kCallbackFpKey, (void**) &onStart2); if (!found) { ALOGE("%s: Cannot find capture startV2 callback!", __FUNCTION__); return; } if (onStart2 == nullptr) { return; } int64_t timestamp; found = msg->findInt64(kTimeStampKey, ×tamp); if (!found) { ALOGE("%s: Cannot find timestamp!", __FUNCTION__); return; } int64_t frameNumber; found = msg->findInt64(kFrameNumberKey, &frameNumber); if (!found) { ALOGE("%s: Cannot find frame number!", __FUNCTION__); return; } ACaptureRequest* request = allocateACaptureRequest(requestSp, mId); (*onStart2)(context, session.get(), request, timestamp, frameNumber); freeACaptureRequest(request); break; } case kWhatCaptureResult: { ACameraCaptureSession_captureCallback_result onResult; Loading Loading @@ -1285,7 +1315,8 @@ CameraDevice::CallbackHolder::CallbackHolder( ACameraCaptureSession_captureCallbacks* cbs) : mSession(session), mRequests(requests), mIsRepeating(isRepeating), mIsLogicalCameraCallback(false) { mIsLogicalCameraCallback(false), mIs2Callback(false) { initCaptureCallbacks(cbs); if (cbs != nullptr) { Loading @@ -1301,7 +1332,8 @@ CameraDevice::CallbackHolder::CallbackHolder( ACameraCaptureSession_logicalCamera_captureCallbacks* lcbs) : mSession(session), mRequests(requests), mIsRepeating(isRepeating), mIsLogicalCameraCallback(true) { mIsLogicalCameraCallback(true), mIs2Callback(false) { initCaptureCallbacks(lcbs); if (lcbs != nullptr) { Loading @@ -1310,6 +1342,40 @@ CameraDevice::CallbackHolder::CallbackHolder( } } CameraDevice::CallbackHolder::CallbackHolder( sp<ACameraCaptureSession> session, const Vector<sp<CaptureRequest> >& requests, bool isRepeating, ACameraCaptureSession_captureCallbacksV2* cbs) : mSession(session), mRequests(requests), mIsRepeating(isRepeating), mIsLogicalCameraCallback(false), mIs2Callback(true) { initCaptureCallbacksV2(cbs); if (cbs != nullptr) { mOnCaptureCompleted = cbs->onCaptureCompleted; mOnCaptureFailed = cbs->onCaptureFailed; } } CameraDevice::CallbackHolder::CallbackHolder( sp<ACameraCaptureSession> session, const Vector<sp<CaptureRequest> >& requests, bool isRepeating, ACameraCaptureSession_logicalCamera_captureCallbacksV2* lcbs) : mSession(session), mRequests(requests), mIsRepeating(isRepeating), mIsLogicalCameraCallback(true), mIs2Callback(true) { initCaptureCallbacksV2(lcbs); if (lcbs != nullptr) { mOnLogicalCameraCaptureCompleted = lcbs->onLogicalCameraCaptureCompleted; mOnLogicalCameraCaptureFailed = lcbs->onLogicalCameraCaptureFailed; } } void CameraDevice::checkRepeatingSequenceCompleteLocked( const int sequenceId, const int64_t lastFrameNumber) { Loading Loading @@ -1536,7 +1602,6 @@ CameraDevice::ServiceCallback::onCaptureStarted( const CaptureResultExtras& resultExtras, int64_t timestamp) { binder::Status ret = binder::Status::ok(); sp<CameraDevice> dev = mDevice.promote(); if (dev == nullptr) { return ret; // device has been closed Loading @@ -1551,11 +1616,14 @@ CameraDevice::ServiceCallback::onCaptureStarted( int sequenceId = resultExtras.requestId; int32_t burstId = resultExtras.burstId; int64_t frameNumber = resultExtras.frameNumber; auto it = dev->mSequenceCallbackMap.find(sequenceId); if (it != dev->mSequenceCallbackMap.end()) { CallbackHolder cbh = (*it).second; bool v2Callback = cbh.mIs2Callback; ACameraCaptureSession_captureCallback_start onStart = cbh.mOnCaptureStarted; ACameraCaptureSession_captureCallback_startV2 onStart2 = cbh.mOnCaptureStarted2; sp<ACameraCaptureSession> session = cbh.mSession; if ((size_t) burstId >= cbh.mRequests.size()) { ALOGE("%s: Error: request index %d out of bound (size %zu)", Loading @@ -1563,12 +1631,19 @@ CameraDevice::ServiceCallback::onCaptureStarted( dev->setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_SERVICE); } sp<CaptureRequest> request = cbh.mRequests[burstId]; sp<AMessage> msg = new AMessage(kWhatCaptureStart, dev->mHandler); sp<AMessage> msg = nullptr; if (v2Callback) { msg = new AMessage(kWhatCaptureStart2, dev->mHandler); msg->setPointer(kCallbackFpKey, (void*) onStart2); } else { msg = new AMessage(kWhatCaptureStart, dev->mHandler); msg->setPointer(kCallbackFpKey, (void *)onStart); } msg->setPointer(kContextKey, cbh.mContext); msg->setObject(kSessionSpKey, session); msg->setPointer(kCallbackFpKey, (void*) onStart); msg->setObject(kCaptureRequestKey, request); msg->setInt64(kTimeStampKey, timestamp); msg->setInt64(kFrameNumberKey, frameNumber); dev->postSessionMsgAndCleanup(msg); } return ret; Loading camera/ndk/impl/ACameraDevice.h +31 −3 Original line number Diff line number Diff line Loading @@ -215,6 +215,7 @@ class CameraDevice final : public RefBase { kWhatSessionStateCb, // onReady, onActive // Capture callbacks kWhatCaptureStart, // onCaptureStarted kWhatCaptureStart2, // onCaptureStarted kWhatCaptureResult, // onCaptureProgressed, onCaptureCompleted kWhatLogicalCaptureResult, // onLogicalCameraCaptureCompleted kWhatCaptureFail, // onCaptureFailed Loading Loading @@ -294,11 +295,18 @@ class CameraDevice final : public RefBase { const Vector<sp<CaptureRequest> >& requests, bool isRepeating, ACameraCaptureSession_logicalCamera_captureCallbacks* lcbs); template <class T> void initCaptureCallbacks(T* cbs) { CallbackHolder(sp<ACameraCaptureSession> session, const Vector<sp<CaptureRequest> >& requests, bool isRepeating, ACameraCaptureSession_captureCallbacksV2* cbs); CallbackHolder(sp<ACameraCaptureSession> session, const Vector<sp<CaptureRequest> >& requests, bool isRepeating, ACameraCaptureSession_logicalCamera_captureCallbacksV2* lcbs); void clearCallbacks() { mContext = nullptr; mOnCaptureStarted = nullptr; mOnCaptureStarted2 = nullptr; mOnCaptureProgressed = nullptr; mOnCaptureCompleted = nullptr; mOnLogicalCameraCaptureCompleted = nullptr; Loading @@ -307,6 +315,24 @@ class CameraDevice final : public RefBase { mOnCaptureSequenceCompleted = nullptr; mOnCaptureSequenceAborted = nullptr; mOnCaptureBufferLost = nullptr; } template <class T> void initCaptureCallbacksV2(T* cbs) { clearCallbacks(); if (cbs != nullptr) { mContext = cbs->context; mOnCaptureStarted2 = cbs->onCaptureStarted; mOnCaptureProgressed = cbs->onCaptureProgressed; mOnCaptureSequenceCompleted = cbs->onCaptureSequenceCompleted; mOnCaptureSequenceAborted = cbs->onCaptureSequenceAborted; mOnCaptureBufferLost = cbs->onCaptureBufferLost; } } template <class T> void initCaptureCallbacks(T* cbs) { clearCallbacks(); if (cbs != nullptr) { mContext = cbs->context; mOnCaptureStarted = cbs->onCaptureStarted; Loading @@ -320,9 +346,11 @@ class CameraDevice final : public RefBase { Vector<sp<CaptureRequest> > mRequests; const bool mIsRepeating; const bool mIsLogicalCameraCallback; const bool mIs2Callback; void* mContext; ACameraCaptureSession_captureCallback_start mOnCaptureStarted; ACameraCaptureSession_captureCallback_startV2 mOnCaptureStarted2; ACameraCaptureSession_captureCallback_result mOnCaptureProgressed; ACameraCaptureSession_captureCallback_result mOnCaptureCompleted; ACameraCaptureSession_logicalCamera_captureCallback_result mOnLogicalCameraCaptureCompleted; Loading camera/ndk/include/camera/NdkCameraCaptureSession.h +178 −0 Original line number Diff line number Diff line Loading @@ -811,6 +811,184 @@ camera_status_t ACameraCaptureSession_logicalCamera_setRepeatingRequest( int numRequests, ACaptureRequest** requests, /*optional*/int* captureSequenceId) __INTRODUCED_IN(29); /** * The definition of camera capture start callback. The same as * {@link ACameraCaptureSession_captureCallbacks#onCaptureStarted}, except that * it has the frame number of the capture as well. * * @param context The optional application context provided by user in * {@link ACameraCaptureSession_captureCallbacks}. * @param session The camera capture session of interest. * @param request The capture request that is starting. Note that this pointer points to a copy of * capture request sent by application, so the address is different to what * application sent but the content will match. This request will be freed by * framework immediately after this callback returns. * @param timestamp The timestamp when the capture is started. This timestamp will match * {@link ACAMERA_SENSOR_TIMESTAMP} of the {@link ACameraMetadata} in * {@link ACameraCaptureSession_captureCallbacks#onCaptureCompleted} callback. * @param frameNumber the frame number of the capture started */ typedef void (*ACameraCaptureSession_captureCallback_startV2)( void* context, ACameraCaptureSession* session, const ACaptureRequest* request, int64_t timestamp, int64_t frameNumber); /** * This has the same functionality as ACameraCaptureSession_captureCallbacks, * with the exception that captureCallback_startV2 callback is * used, instead of captureCallback_start, to support retrieving the frame number. */ typedef struct ACameraCaptureSession_captureCallbacksV2 { /** * Same as ACameraCaptureSession_captureCallbacks */ void* context; /** * Same as {@link ACameraCaptureSession_captureCallbacks#onCaptureStarted}, * except that it has the frame number of the capture added in the parameter * list. */ ACameraCaptureSession_captureCallback_startV2 onCaptureStarted; /** * Same as {@link ACameraCaptureSession_captureCallbacks#onCaptureProgressed}. */ ACameraCaptureSession_captureCallback_result onCaptureProgressed; /** * Same as {@link ACameraCaptureSession_captureCallbacks#onCaptureCompleted}. */ ACameraCaptureSession_captureCallback_result onCaptureCompleted; /** * Same as {@link ACameraCaptureSession_captureCallbacks#onCaptureFailed}. */ ACameraCaptureSession_captureCallback_failed onCaptureFailed; /** * Same as {@link ACameraCaptureSession_captureCallbacks#onCaptureSequenceCompleted}. */ ACameraCaptureSession_captureCallback_sequenceEnd onCaptureSequenceCompleted; /** * Same as {@link ACameraCaptureSession_captureCallbacks#onCaptureSequenceAborted}. */ ACameraCaptureSession_captureCallback_sequenceAbort onCaptureSequenceAborted; /** * Same as {@link ACameraCaptureSession_captureCallbacks#onCaptureBufferLost}. */ ACameraCaptureSession_captureCallback_bufferLost onCaptureBufferLost; } ACameraCaptureSession_captureCallbacksV2; /** * This has the same functionality as ACameraCaptureSession_logicalCamera_captureCallbacks, * with the exception that an captureCallback_startV2 callback is * used, instead of captureCallback_start, to support retrieving frame number. */ typedef struct ACameraCaptureSession_logicalCamera_captureCallbacksV2 { /** * Same as ACameraCaptureSession_captureCallbacks */ void* context; /** * Same as {@link ACameraCaptureSession_captureCallbacks#onCaptureStarted}, * except that it has the frame number of the capture added in the parameter * list. */ ACameraCaptureSession_captureCallback_startV2 onCaptureStarted; /** * Same as {@link ACameraCaptureSession_captureCallbacks#onCaptureProgressed}. */ ACameraCaptureSession_captureCallback_result onCaptureProgressed; /** * Same as * {@link ACameraCaptureSession_logicalCamera_captureCallbacks#onLogicalCaptureCompleted}. */ ACameraCaptureSession_logicalCamera_captureCallback_result onLogicalCameraCaptureCompleted; /** * This callback is called instead of {@link onLogicalCameraCaptureCompleted} when the * camera device failed to produce a capture result for the * request. * * <p>Other requests are unaffected, and some or all image buffers from * the capture may have been pushed to their respective output * streams.</p> * * <p>Note that the ACaptureRequest pointer in the callback will not match what application has * submitted, but the contents the ACaptureRequest will match what application submitted.</p> * * @see ALogicalCameraCaptureFailure */ ACameraCaptureSession_logicalCamera_captureCallback_failed onLogicalCameraCaptureFailed; /** * Same as {@link ACameraCaptureSession_captureCallbacks#onCaptureSequenceCompleted}. */ ACameraCaptureSession_captureCallback_sequenceEnd onCaptureSequenceCompleted; /** * Same as {@link ACameraCaptureSession_captureCallbacks#onCaptureSequenceAborted}. */ ACameraCaptureSession_captureCallback_sequenceAbort onCaptureSequenceAborted; /** * Same as {@link ACameraCaptureSession_captureCallbacks#onCaptureBufferLost}. */ ACameraCaptureSession_captureCallback_bufferLost onCaptureBufferLost; } ACameraCaptureSession_logicalCamera_captureCallbacksV2; /** * This has the same functionality as ACameraCaptureSession_capture, with added * support for v2 of camera callbacks, where the onCaptureStarted callback * adds frame number in its parameter list. */ camera_status_t ACameraCaptureSession_captureV2( ACameraCaptureSession* session, /*optional*/ACameraCaptureSession_captureCallbacksV2* callbacks, int numRequests, ACaptureRequest** requests, /*optional*/int* captureSequenceId) __INTRODUCED_IN(33); /** * This has the same functionality as ACameraCaptureSession_logical_setRepeatingRequest, with added * support for v2 of logical multi-camera callbacks where the onCaptureStarted * callback adds frame number in its parameter list. */ camera_status_t ACameraCaptureSession_setRepeatingRequestV2( ACameraCaptureSession* session, /*optional*/ACameraCaptureSession_captureCallbacksV2* callbacks, int numRequests, ACaptureRequest** requests, /*optional*/int* captureSequenceId) __INTRODUCED_IN(33); /** * This has the same functionality as ACameraCaptureSession_logical_capture, with added * support for v2 of logical multi-camera callbacks where the onCaptureStarted callback * adds frame number in its parameter list. */ camera_status_t ACameraCaptureSession_logicalCamera_captureV2( ACameraCaptureSession* session, /*optional*/ACameraCaptureSession_logicalCamera_captureCallbacksV2* callbacks, int numRequests, ACaptureRequest** requests, /*optional*/int* captureSequenceId) __INTRODUCED_IN(33); /** * This has the same functionality as ACameraCaptureSession_logical_setRepeatingRequest, with added * support for v2 of logical multi-camera callbacks where the onCaptureStarted * callback adds frame number in its parameter list. */ camera_status_t ACameraCaptureSession_logicalCamera_setRepeatingRequestV2( ACameraCaptureSession* session, /*optional*/ACameraCaptureSession_logicalCamera_captureCallbacksV2* callbacks, int numRequests, ACaptureRequest** requests, /*optional*/int* captureSequenceId) __INTRODUCED_IN(33); __END_DECLS #endif /* _NDK_CAMERA_CAPTURE_SESSION_H */ Loading Loading
camera/ndk/NdkCameraCaptureSession.cpp +40 −57 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ #include "impl/ACameraCaptureSession.h" #include "impl/ACameraCaptureSession.inc" #include "NdkCameraCaptureSession.inc" using namespace android; Loading Loading @@ -72,22 +73,16 @@ camera_status_t ACameraCaptureSession_capture( int numRequests, ACaptureRequest** requests, /*optional*/int* captureSequenceId) { ATRACE_CALL(); if (session == nullptr || requests == nullptr || numRequests < 1) { ALOGE("%s: Error: invalid input: session %p, numRequest %d, requests %p", __FUNCTION__, session, numRequests, requests); return ACAMERA_ERROR_INVALID_PARAMETER; return captureTemplate(session, cbs, numRequests, requests, captureSequenceId); } if (session->isClosed()) { ALOGE("%s: session %p is already closed", __FUNCTION__, session); if (captureSequenceId != nullptr) { *captureSequenceId = CAPTURE_SEQUENCE_ID_NONE; } return ACAMERA_ERROR_SESSION_CLOSED; } return session->capture( cbs, numRequests, requests, captureSequenceId); EXPORT camera_status_t ACameraCaptureSession_captureV2( ACameraCaptureSession* session, /*optional*/ACameraCaptureSession_captureCallbacksV2* cbs, int numRequests, ACaptureRequest** requests, /*optional*/int* captureSequenceId) { ATRACE_CALL(); return captureTemplate(session, cbs, numRequests, requests, captureSequenceId); } EXPORT Loading @@ -97,22 +92,26 @@ camera_status_t ACameraCaptureSession_logicalCamera_capture( int numRequests, ACaptureRequest** requests, /*optional*/int* captureSequenceId) { ATRACE_CALL(); if (session == nullptr || requests == nullptr || numRequests < 1) { ALOGE("%s: Error: invalid input: session %p, numRequest %d, requests %p", __FUNCTION__, session, numRequests, requests); return ACAMERA_ERROR_INVALID_PARAMETER; return captureTemplate(session, lcbs, numRequests, requests, captureSequenceId); } if (session->isClosed()) { ALOGE("%s: session %p is already closed", __FUNCTION__, session); if (captureSequenceId) { *captureSequenceId = CAPTURE_SEQUENCE_ID_NONE; } return ACAMERA_ERROR_SESSION_CLOSED; EXPORT camera_status_t ACameraCaptureSession_logicalCamera_captureV2( ACameraCaptureSession* session, /*optional*/ACameraCaptureSession_logicalCamera_captureCallbacksV2* lcbs, int numRequests, ACaptureRequest** requests, /*optional*/int* captureSequenceId) { ATRACE_CALL(); return captureTemplate(session, lcbs, numRequests, requests, captureSequenceId); } return session->capture( lcbs, numRequests, requests, captureSequenceId); EXPORT camera_status_t ACameraCaptureSession_setRepeatingRequestV2( ACameraCaptureSession* session, /*optional*/ACameraCaptureSession_captureCallbacksV2* cbs, int numRequests, ACaptureRequest** requests, /*optional*/int* captureSequenceId) { ATRACE_CALL(); return setRepeatingRequestTemplate(session, cbs, numRequests, requests, captureSequenceId); } EXPORT Loading @@ -121,22 +120,9 @@ camera_status_t ACameraCaptureSession_setRepeatingRequest( int numRequests, ACaptureRequest** requests, /*optional*/int* captureSequenceId) { ATRACE_CALL(); if (session == nullptr || requests == nullptr || numRequests < 1) { ALOGE("%s: Error: invalid input: session %p, numRequest %d, requests %p", __FUNCTION__, session, numRequests, requests); return ACAMERA_ERROR_INVALID_PARAMETER; return setRepeatingRequestTemplate(session, cbs, numRequests, requests, captureSequenceId); } if (session->isClosed()) { ALOGE("%s: session %p is already closed", __FUNCTION__, session); if (captureSequenceId) { *captureSequenceId = CAPTURE_SEQUENCE_ID_NONE; } return ACAMERA_ERROR_SESSION_CLOSED; } return session->setRepeatingRequest(cbs, numRequests, requests, captureSequenceId); } EXPORT camera_status_t ACameraCaptureSession_logicalCamera_setRepeatingRequest( Loading @@ -145,21 +131,18 @@ camera_status_t ACameraCaptureSession_logicalCamera_setRepeatingRequest( int numRequests, ACaptureRequest** requests, /*optional*/int* captureSequenceId) { ATRACE_CALL(); if (session == nullptr || requests == nullptr || numRequests < 1) { ALOGE("%s: Error: invalid input: session %p, numRequest %d, requests %p", __FUNCTION__, session, numRequests, requests); return ACAMERA_ERROR_INVALID_PARAMETER; return setRepeatingRequestTemplate(session, lcbs, numRequests, requests, captureSequenceId); } if (session->isClosed()) { ALOGE("%s: session %p is already closed", __FUNCTION__, session); if (captureSequenceId) { *captureSequenceId = CAPTURE_SEQUENCE_ID_NONE; } return ACAMERA_ERROR_SESSION_CLOSED; } return session->setRepeatingRequest(lcbs, numRequests, requests, captureSequenceId); EXPORT camera_status_t ACameraCaptureSession_logicalCamera_setRepeatingRequestV2( ACameraCaptureSession* session, /*optional*/ACameraCaptureSession_logicalCamera_captureCallbacksV2* lcbs, int numRequests, ACaptureRequest** requests, /*optional*/int* captureSequenceId) { ATRACE_CALL(); return setRepeatingRequestTemplate(session, lcbs, numRequests, requests, captureSequenceId); } EXPORT Loading
camera/ndk/NdkCameraCaptureSession.inc 0 → 100644 +70 −0 Original line number Diff line number Diff line /* * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "impl/ACameraCaptureSession.h" #include <camera/NdkCameraCaptureSession.h> using namespace android; template <class CallbackType> camera_status_t captureTemplate( ACameraCaptureSession* session, /*optional*/CallbackType* cbs, int numRequests, ACaptureRequest** requests, /*optional*/int* captureSequenceId) { ATRACE_CALL(); if (session == nullptr || requests == nullptr || numRequests < 1) { ALOGE("%s: Error: invalid input: session %p, numRequest %d, requests %p", __FUNCTION__, session, numRequests, requests); return ACAMERA_ERROR_INVALID_PARAMETER; } if (session->isClosed()) { ALOGE("%s: session %p is already closed", __FUNCTION__, session); if (captureSequenceId) { *captureSequenceId = CAPTURE_SEQUENCE_ID_NONE; } return ACAMERA_ERROR_SESSION_CLOSED; } return session->capture( cbs, numRequests, requests, captureSequenceId); } template <class CallbackType> camera_status_t setRepeatingRequestTemplate( ACameraCaptureSession* session, /*optional*/CallbackType* cbs, int numRequests, ACaptureRequest** requests, /*optional*/int* captureSequenceId) { ATRACE_CALL(); if (session == nullptr || requests == nullptr || numRequests < 1) { ALOGE("%s: Error: invalid input: session %p, numRequest %d, requests %p", __FUNCTION__, session, numRequests, requests); return ACAMERA_ERROR_INVALID_PARAMETER; } if (session->isClosed()) { ALOGE("%s: session %p is already closed", __FUNCTION__, session); if (captureSequenceId) { *captureSequenceId = CAPTURE_SEQUENCE_ID_NONE; } return ACAMERA_ERROR_SESSION_CLOSED; } return session->setRepeatingRequest(cbs, numRequests, requests, captureSequenceId); }
camera/ndk/impl/ACameraDevice.cpp +82 −7 Original line number Diff line number Diff line Loading @@ -26,8 +26,6 @@ #include "ACaptureRequest.h" #include "ACameraCaptureSession.h" #include "ACameraCaptureSession.inc" ACameraDevice::~ACameraDevice() { mDevice->stopLooperAndDisconnect(); } Loading Loading @@ -913,6 +911,7 @@ void CameraDevice::CallbackHandler::onMessageReceived( case kWhatOnError: case kWhatSessionStateCb: case kWhatCaptureStart: case kWhatCaptureStart2: case kWhatCaptureResult: case kWhatLogicalCaptureResult: case kWhatCaptureFail: Loading Loading @@ -985,6 +984,7 @@ void CameraDevice::CallbackHandler::onMessageReceived( } case kWhatSessionStateCb: case kWhatCaptureStart: case kWhatCaptureStart2: case kWhatCaptureResult: case kWhatLogicalCaptureResult: case kWhatCaptureFail: Loading @@ -1004,6 +1004,7 @@ void CameraDevice::CallbackHandler::onMessageReceived( sp<CaptureRequest> requestSp = nullptr; switch (msg->what()) { case kWhatCaptureStart: case kWhatCaptureStart2: case kWhatCaptureResult: case kWhatLogicalCaptureResult: case kWhatCaptureFail: Loading Loading @@ -1055,6 +1056,35 @@ void CameraDevice::CallbackHandler::onMessageReceived( freeACaptureRequest(request); break; } case kWhatCaptureStart2: { ACameraCaptureSession_captureCallback_startV2 onStart2; found = msg->findPointer(kCallbackFpKey, (void**) &onStart2); if (!found) { ALOGE("%s: Cannot find capture startV2 callback!", __FUNCTION__); return; } if (onStart2 == nullptr) { return; } int64_t timestamp; found = msg->findInt64(kTimeStampKey, ×tamp); if (!found) { ALOGE("%s: Cannot find timestamp!", __FUNCTION__); return; } int64_t frameNumber; found = msg->findInt64(kFrameNumberKey, &frameNumber); if (!found) { ALOGE("%s: Cannot find frame number!", __FUNCTION__); return; } ACaptureRequest* request = allocateACaptureRequest(requestSp, mId); (*onStart2)(context, session.get(), request, timestamp, frameNumber); freeACaptureRequest(request); break; } case kWhatCaptureResult: { ACameraCaptureSession_captureCallback_result onResult; Loading Loading @@ -1285,7 +1315,8 @@ CameraDevice::CallbackHolder::CallbackHolder( ACameraCaptureSession_captureCallbacks* cbs) : mSession(session), mRequests(requests), mIsRepeating(isRepeating), mIsLogicalCameraCallback(false) { mIsLogicalCameraCallback(false), mIs2Callback(false) { initCaptureCallbacks(cbs); if (cbs != nullptr) { Loading @@ -1301,7 +1332,8 @@ CameraDevice::CallbackHolder::CallbackHolder( ACameraCaptureSession_logicalCamera_captureCallbacks* lcbs) : mSession(session), mRequests(requests), mIsRepeating(isRepeating), mIsLogicalCameraCallback(true) { mIsLogicalCameraCallback(true), mIs2Callback(false) { initCaptureCallbacks(lcbs); if (lcbs != nullptr) { Loading @@ -1310,6 +1342,40 @@ CameraDevice::CallbackHolder::CallbackHolder( } } CameraDevice::CallbackHolder::CallbackHolder( sp<ACameraCaptureSession> session, const Vector<sp<CaptureRequest> >& requests, bool isRepeating, ACameraCaptureSession_captureCallbacksV2* cbs) : mSession(session), mRequests(requests), mIsRepeating(isRepeating), mIsLogicalCameraCallback(false), mIs2Callback(true) { initCaptureCallbacksV2(cbs); if (cbs != nullptr) { mOnCaptureCompleted = cbs->onCaptureCompleted; mOnCaptureFailed = cbs->onCaptureFailed; } } CameraDevice::CallbackHolder::CallbackHolder( sp<ACameraCaptureSession> session, const Vector<sp<CaptureRequest> >& requests, bool isRepeating, ACameraCaptureSession_logicalCamera_captureCallbacksV2* lcbs) : mSession(session), mRequests(requests), mIsRepeating(isRepeating), mIsLogicalCameraCallback(true), mIs2Callback(true) { initCaptureCallbacksV2(lcbs); if (lcbs != nullptr) { mOnLogicalCameraCaptureCompleted = lcbs->onLogicalCameraCaptureCompleted; mOnLogicalCameraCaptureFailed = lcbs->onLogicalCameraCaptureFailed; } } void CameraDevice::checkRepeatingSequenceCompleteLocked( const int sequenceId, const int64_t lastFrameNumber) { Loading Loading @@ -1536,7 +1602,6 @@ CameraDevice::ServiceCallback::onCaptureStarted( const CaptureResultExtras& resultExtras, int64_t timestamp) { binder::Status ret = binder::Status::ok(); sp<CameraDevice> dev = mDevice.promote(); if (dev == nullptr) { return ret; // device has been closed Loading @@ -1551,11 +1616,14 @@ CameraDevice::ServiceCallback::onCaptureStarted( int sequenceId = resultExtras.requestId; int32_t burstId = resultExtras.burstId; int64_t frameNumber = resultExtras.frameNumber; auto it = dev->mSequenceCallbackMap.find(sequenceId); if (it != dev->mSequenceCallbackMap.end()) { CallbackHolder cbh = (*it).second; bool v2Callback = cbh.mIs2Callback; ACameraCaptureSession_captureCallback_start onStart = cbh.mOnCaptureStarted; ACameraCaptureSession_captureCallback_startV2 onStart2 = cbh.mOnCaptureStarted2; sp<ACameraCaptureSession> session = cbh.mSession; if ((size_t) burstId >= cbh.mRequests.size()) { ALOGE("%s: Error: request index %d out of bound (size %zu)", Loading @@ -1563,12 +1631,19 @@ CameraDevice::ServiceCallback::onCaptureStarted( dev->setCameraDeviceErrorLocked(ACAMERA_ERROR_CAMERA_SERVICE); } sp<CaptureRequest> request = cbh.mRequests[burstId]; sp<AMessage> msg = new AMessage(kWhatCaptureStart, dev->mHandler); sp<AMessage> msg = nullptr; if (v2Callback) { msg = new AMessage(kWhatCaptureStart2, dev->mHandler); msg->setPointer(kCallbackFpKey, (void*) onStart2); } else { msg = new AMessage(kWhatCaptureStart, dev->mHandler); msg->setPointer(kCallbackFpKey, (void *)onStart); } msg->setPointer(kContextKey, cbh.mContext); msg->setObject(kSessionSpKey, session); msg->setPointer(kCallbackFpKey, (void*) onStart); msg->setObject(kCaptureRequestKey, request); msg->setInt64(kTimeStampKey, timestamp); msg->setInt64(kFrameNumberKey, frameNumber); dev->postSessionMsgAndCleanup(msg); } return ret; Loading
camera/ndk/impl/ACameraDevice.h +31 −3 Original line number Diff line number Diff line Loading @@ -215,6 +215,7 @@ class CameraDevice final : public RefBase { kWhatSessionStateCb, // onReady, onActive // Capture callbacks kWhatCaptureStart, // onCaptureStarted kWhatCaptureStart2, // onCaptureStarted kWhatCaptureResult, // onCaptureProgressed, onCaptureCompleted kWhatLogicalCaptureResult, // onLogicalCameraCaptureCompleted kWhatCaptureFail, // onCaptureFailed Loading Loading @@ -294,11 +295,18 @@ class CameraDevice final : public RefBase { const Vector<sp<CaptureRequest> >& requests, bool isRepeating, ACameraCaptureSession_logicalCamera_captureCallbacks* lcbs); template <class T> void initCaptureCallbacks(T* cbs) { CallbackHolder(sp<ACameraCaptureSession> session, const Vector<sp<CaptureRequest> >& requests, bool isRepeating, ACameraCaptureSession_captureCallbacksV2* cbs); CallbackHolder(sp<ACameraCaptureSession> session, const Vector<sp<CaptureRequest> >& requests, bool isRepeating, ACameraCaptureSession_logicalCamera_captureCallbacksV2* lcbs); void clearCallbacks() { mContext = nullptr; mOnCaptureStarted = nullptr; mOnCaptureStarted2 = nullptr; mOnCaptureProgressed = nullptr; mOnCaptureCompleted = nullptr; mOnLogicalCameraCaptureCompleted = nullptr; Loading @@ -307,6 +315,24 @@ class CameraDevice final : public RefBase { mOnCaptureSequenceCompleted = nullptr; mOnCaptureSequenceAborted = nullptr; mOnCaptureBufferLost = nullptr; } template <class T> void initCaptureCallbacksV2(T* cbs) { clearCallbacks(); if (cbs != nullptr) { mContext = cbs->context; mOnCaptureStarted2 = cbs->onCaptureStarted; mOnCaptureProgressed = cbs->onCaptureProgressed; mOnCaptureSequenceCompleted = cbs->onCaptureSequenceCompleted; mOnCaptureSequenceAborted = cbs->onCaptureSequenceAborted; mOnCaptureBufferLost = cbs->onCaptureBufferLost; } } template <class T> void initCaptureCallbacks(T* cbs) { clearCallbacks(); if (cbs != nullptr) { mContext = cbs->context; mOnCaptureStarted = cbs->onCaptureStarted; Loading @@ -320,9 +346,11 @@ class CameraDevice final : public RefBase { Vector<sp<CaptureRequest> > mRequests; const bool mIsRepeating; const bool mIsLogicalCameraCallback; const bool mIs2Callback; void* mContext; ACameraCaptureSession_captureCallback_start mOnCaptureStarted; ACameraCaptureSession_captureCallback_startV2 mOnCaptureStarted2; ACameraCaptureSession_captureCallback_result mOnCaptureProgressed; ACameraCaptureSession_captureCallback_result mOnCaptureCompleted; ACameraCaptureSession_logicalCamera_captureCallback_result mOnLogicalCameraCaptureCompleted; Loading
camera/ndk/include/camera/NdkCameraCaptureSession.h +178 −0 Original line number Diff line number Diff line Loading @@ -811,6 +811,184 @@ camera_status_t ACameraCaptureSession_logicalCamera_setRepeatingRequest( int numRequests, ACaptureRequest** requests, /*optional*/int* captureSequenceId) __INTRODUCED_IN(29); /** * The definition of camera capture start callback. The same as * {@link ACameraCaptureSession_captureCallbacks#onCaptureStarted}, except that * it has the frame number of the capture as well. * * @param context The optional application context provided by user in * {@link ACameraCaptureSession_captureCallbacks}. * @param session The camera capture session of interest. * @param request The capture request that is starting. Note that this pointer points to a copy of * capture request sent by application, so the address is different to what * application sent but the content will match. This request will be freed by * framework immediately after this callback returns. * @param timestamp The timestamp when the capture is started. This timestamp will match * {@link ACAMERA_SENSOR_TIMESTAMP} of the {@link ACameraMetadata} in * {@link ACameraCaptureSession_captureCallbacks#onCaptureCompleted} callback. * @param frameNumber the frame number of the capture started */ typedef void (*ACameraCaptureSession_captureCallback_startV2)( void* context, ACameraCaptureSession* session, const ACaptureRequest* request, int64_t timestamp, int64_t frameNumber); /** * This has the same functionality as ACameraCaptureSession_captureCallbacks, * with the exception that captureCallback_startV2 callback is * used, instead of captureCallback_start, to support retrieving the frame number. */ typedef struct ACameraCaptureSession_captureCallbacksV2 { /** * Same as ACameraCaptureSession_captureCallbacks */ void* context; /** * Same as {@link ACameraCaptureSession_captureCallbacks#onCaptureStarted}, * except that it has the frame number of the capture added in the parameter * list. */ ACameraCaptureSession_captureCallback_startV2 onCaptureStarted; /** * Same as {@link ACameraCaptureSession_captureCallbacks#onCaptureProgressed}. */ ACameraCaptureSession_captureCallback_result onCaptureProgressed; /** * Same as {@link ACameraCaptureSession_captureCallbacks#onCaptureCompleted}. */ ACameraCaptureSession_captureCallback_result onCaptureCompleted; /** * Same as {@link ACameraCaptureSession_captureCallbacks#onCaptureFailed}. */ ACameraCaptureSession_captureCallback_failed onCaptureFailed; /** * Same as {@link ACameraCaptureSession_captureCallbacks#onCaptureSequenceCompleted}. */ ACameraCaptureSession_captureCallback_sequenceEnd onCaptureSequenceCompleted; /** * Same as {@link ACameraCaptureSession_captureCallbacks#onCaptureSequenceAborted}. */ ACameraCaptureSession_captureCallback_sequenceAbort onCaptureSequenceAborted; /** * Same as {@link ACameraCaptureSession_captureCallbacks#onCaptureBufferLost}. */ ACameraCaptureSession_captureCallback_bufferLost onCaptureBufferLost; } ACameraCaptureSession_captureCallbacksV2; /** * This has the same functionality as ACameraCaptureSession_logicalCamera_captureCallbacks, * with the exception that an captureCallback_startV2 callback is * used, instead of captureCallback_start, to support retrieving frame number. */ typedef struct ACameraCaptureSession_logicalCamera_captureCallbacksV2 { /** * Same as ACameraCaptureSession_captureCallbacks */ void* context; /** * Same as {@link ACameraCaptureSession_captureCallbacks#onCaptureStarted}, * except that it has the frame number of the capture added in the parameter * list. */ ACameraCaptureSession_captureCallback_startV2 onCaptureStarted; /** * Same as {@link ACameraCaptureSession_captureCallbacks#onCaptureProgressed}. */ ACameraCaptureSession_captureCallback_result onCaptureProgressed; /** * Same as * {@link ACameraCaptureSession_logicalCamera_captureCallbacks#onLogicalCaptureCompleted}. */ ACameraCaptureSession_logicalCamera_captureCallback_result onLogicalCameraCaptureCompleted; /** * This callback is called instead of {@link onLogicalCameraCaptureCompleted} when the * camera device failed to produce a capture result for the * request. * * <p>Other requests are unaffected, and some or all image buffers from * the capture may have been pushed to their respective output * streams.</p> * * <p>Note that the ACaptureRequest pointer in the callback will not match what application has * submitted, but the contents the ACaptureRequest will match what application submitted.</p> * * @see ALogicalCameraCaptureFailure */ ACameraCaptureSession_logicalCamera_captureCallback_failed onLogicalCameraCaptureFailed; /** * Same as {@link ACameraCaptureSession_captureCallbacks#onCaptureSequenceCompleted}. */ ACameraCaptureSession_captureCallback_sequenceEnd onCaptureSequenceCompleted; /** * Same as {@link ACameraCaptureSession_captureCallbacks#onCaptureSequenceAborted}. */ ACameraCaptureSession_captureCallback_sequenceAbort onCaptureSequenceAborted; /** * Same as {@link ACameraCaptureSession_captureCallbacks#onCaptureBufferLost}. */ ACameraCaptureSession_captureCallback_bufferLost onCaptureBufferLost; } ACameraCaptureSession_logicalCamera_captureCallbacksV2; /** * This has the same functionality as ACameraCaptureSession_capture, with added * support for v2 of camera callbacks, where the onCaptureStarted callback * adds frame number in its parameter list. */ camera_status_t ACameraCaptureSession_captureV2( ACameraCaptureSession* session, /*optional*/ACameraCaptureSession_captureCallbacksV2* callbacks, int numRequests, ACaptureRequest** requests, /*optional*/int* captureSequenceId) __INTRODUCED_IN(33); /** * This has the same functionality as ACameraCaptureSession_logical_setRepeatingRequest, with added * support for v2 of logical multi-camera callbacks where the onCaptureStarted * callback adds frame number in its parameter list. */ camera_status_t ACameraCaptureSession_setRepeatingRequestV2( ACameraCaptureSession* session, /*optional*/ACameraCaptureSession_captureCallbacksV2* callbacks, int numRequests, ACaptureRequest** requests, /*optional*/int* captureSequenceId) __INTRODUCED_IN(33); /** * This has the same functionality as ACameraCaptureSession_logical_capture, with added * support for v2 of logical multi-camera callbacks where the onCaptureStarted callback * adds frame number in its parameter list. */ camera_status_t ACameraCaptureSession_logicalCamera_captureV2( ACameraCaptureSession* session, /*optional*/ACameraCaptureSession_logicalCamera_captureCallbacksV2* callbacks, int numRequests, ACaptureRequest** requests, /*optional*/int* captureSequenceId) __INTRODUCED_IN(33); /** * This has the same functionality as ACameraCaptureSession_logical_setRepeatingRequest, with added * support for v2 of logical multi-camera callbacks where the onCaptureStarted * callback adds frame number in its parameter list. */ camera_status_t ACameraCaptureSession_logicalCamera_setRepeatingRequestV2( ACameraCaptureSession* session, /*optional*/ACameraCaptureSession_logicalCamera_captureCallbacksV2* callbacks, int numRequests, ACaptureRequest** requests, /*optional*/int* captureSequenceId) __INTRODUCED_IN(33); __END_DECLS #endif /* _NDK_CAMERA_CAPTURE_SESSION_H */ Loading