Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 04ba13ff authored by Jayant Chowdhary's avatar Jayant Chowdhary
Browse files

Add v2 onCaptureStartedCallback: adds frame number to callback.



Bug: 214261327

Test: camera CTS native tests
Test: ACameraNdkVendorTest

Change-Id: I1b249a9b16cc9256a1604aacde6baa25b3b01fcb
Signed-off-by: default avatarJayant Chowdhary <jchowdhary@google.com>
parent 14929832
Loading
Loading
Loading
Loading
+40 −57
Original line number Diff line number Diff line
@@ -29,6 +29,7 @@
#include "impl/ACameraCaptureSession.h"

#include "impl/ACameraCaptureSession.inc"
#include "NdkCameraCaptureSession.inc"

using namespace android;

@@ -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
@@ -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
@@ -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(
@@ -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
+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);
}
+82 −7
Original line number Diff line number Diff line
@@ -26,8 +26,6 @@
#include "ACaptureRequest.h"
#include "ACameraCaptureSession.h"

#include "ACameraCaptureSession.inc"

ACameraDevice::~ACameraDevice() {
    mDevice->stopLooperAndDisconnect();
}
@@ -913,6 +911,7 @@ void CameraDevice::CallbackHandler::onMessageReceived(
        case kWhatOnError:
        case kWhatSessionStateCb:
        case kWhatCaptureStart:
        case kWhatCaptureStart2:
        case kWhatCaptureResult:
        case kWhatLogicalCaptureResult:
        case kWhatCaptureFail:
@@ -985,6 +984,7 @@ void CameraDevice::CallbackHandler::onMessageReceived(
        }
        case kWhatSessionStateCb:
        case kWhatCaptureStart:
        case kWhatCaptureStart2:
        case kWhatCaptureResult:
        case kWhatLogicalCaptureResult:
        case kWhatCaptureFail:
@@ -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:
@@ -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, &timestamp);
                    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;
@@ -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) {
@@ -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) {
@@ -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) {
@@ -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
@@ -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)",
@@ -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;
+31 −3
Original line number Diff line number Diff line
@@ -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
@@ -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;
@@ -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;
@@ -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;
+178 −0
Original line number Diff line number Diff line
@@ -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