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

Commit 7a22cf99 authored by Yin-Chia Yeh's avatar Yin-Chia Yeh Committed by Android (Google) Code Review
Browse files

Merge "Camera NDK library: capture session implementation"

parents 8aa17d0c ead9146f
Loading
Loading
Loading
Loading
+11 −9
Original line number Diff line number Diff line
@@ -29,6 +29,7 @@ LOCAL_SRC_FILES:= \
    impl/ACameraManager.cpp        \
    impl/ACameraMetadata.cpp       \
    impl/ACameraDevice.cpp         \
    impl/ACameraCaptureSession.cpp

LOCAL_MODULE:= libcamera2ndk

@@ -41,6 +42,7 @@ LOCAL_CFLAGS += -fvisibility=hidden -D EXPORT='__attribute__ ((visibility ("defa
LOCAL_SHARED_LIBRARIES := \
    libbinder \
    liblog \
    libgui \
    libutils \
    libandroid_runtime \
    libcamera_client \
+70 −12
Original line number Diff line number Diff line
@@ -24,43 +24,101 @@
#include <utils/Trace.h>

#include "NdkCameraDevice.h"
#include <NdkCaptureRequest.h>
#include <NdkCameraCaptureSession.h>
#include "impl/ACameraCaptureSession.h"

using namespace android;

EXPORT
camera_status_t ACameraCaptureSession_close(ACameraCaptureSession*) {
void ACameraCaptureSession_close(ACameraCaptureSession* session) {
    ATRACE_CALL();
    return ACAMERA_OK;
    if (session != nullptr) {
        session->closeByApp();
    }
    return;
}

EXPORT
camera_status_t ACameraCaptureSession_getDevice(
        ACameraCaptureSession*, ACameraDevice **device) {
        ACameraCaptureSession* session, ACameraDevice **device) {
    ATRACE_CALL();
    // Make sure don't do return garbage if device has been closed
    if (session == nullptr || device == nullptr) {
        ALOGE("%s: Error: invalid input: session %p, device %p",
                __FUNCTION__, session, device);
        return ACAMERA_ERROR_INVALID_PARAMETER;
    }

    if (session->isClosed()) {
        ALOGE("%s: session %p is already closed", __FUNCTION__, session);
        *device = nullptr;
        return ACAMERA_ERROR_SESSION_CLOSED;
    }

    *device = session->getDevice();
    if (*device == nullptr) {
        // Should not reach here
        ALOGE("%s: unknown failure: device is null", __FUNCTION__);
        return ACAMERA_ERROR_UNKNOWN;
    }
    return ACAMERA_OK;
}

EXPORT
camera_status_t ACameraCaptureSession_capture(
        ACameraCaptureSession*, /*optional*/ACameraCaptureSession_captureCallbacks*,
        int numRequests, const ACaptureRequest* requests) {
        ACameraCaptureSession* session, /*optional*/ACameraCaptureSession_captureCallbacks* cbs,
        int numRequests, ACaptureRequest** requests,
        /*optional*/int* captureSequenceId) {
    ATRACE_CALL();
    return ACAMERA_OK;
    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);
        *captureSequenceId = CAPTURE_SEQUENCE_ID_NONE;
        return ACAMERA_ERROR_SESSION_CLOSED;
    }

    return session->capture(cbs, numRequests, requests, captureSequenceId);
}

EXPORT
camera_status_t ACameraCaptureSession_setRepeatingRequest(
        ACameraCaptureSession*, /*optional*/ACameraCaptureSession_captureCallbacks*,
        int numRequests, const ACaptureRequest* requests) {
        ACameraCaptureSession* session, /*optional*/ACameraCaptureSession_captureCallbacks* cbs,
        int numRequests, ACaptureRequest** requests,
        /*optional*/int* captureSequenceId) {
    ATRACE_CALL();
    return ACAMERA_OK;
    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);
        *captureSequenceId = CAPTURE_SEQUENCE_ID_NONE;
        return ACAMERA_ERROR_SESSION_CLOSED;
    }

    return session->setRepeatingRequest(cbs, numRequests, requests, captureSequenceId);
}

EXPORT
camera_status_t ACameraCaptureSession_stopRepeating(ACameraCaptureSession*) {
camera_status_t ACameraCaptureSession_stopRepeating(ACameraCaptureSession* session) {
    ATRACE_CALL();
    return ACAMERA_OK;
    if (session == nullptr) {
        ALOGE("%s: Error: session is null", __FUNCTION__);
        return ACAMERA_ERROR_INVALID_PARAMETER;
    }

    if (session->isClosed()) {
        ALOGE("%s: session %p is already closed", __FUNCTION__, session);
        return ACAMERA_ERROR_SESSION_CLOSED;
    }
    return session->stopRepeating();
}

EXPORT
+51 −15
Original line number Diff line number Diff line
@@ -22,7 +22,7 @@
#include <utils/Trace.h>

#include <NdkCameraDevice.h>
#include "impl/ACameraDevice.h"
#include "impl/ACameraCaptureSession.h"

using namespace android;

@@ -54,7 +54,7 @@ camera_status_t ACameraDevice_createCaptureRequest(
        ACaptureRequest** request) {
    ATRACE_CALL();
    if (device == nullptr || request == nullptr) {
        ALOGE("%s: invalid argument! device 0x%p request 0x%p",
        ALOGE("%s: invalid argument! device %p request %p",
                __FUNCTION__, device, request);
        return ACAMERA_ERROR_INVALID_PARAMETER;
    }
@@ -73,53 +73,89 @@ camera_status_t ACameraDevice_createCaptureRequest(
    return device->createCaptureRequest(templateId, request);
}

struct ACaptureSessionOutputContainer;

struct ACaptureSessionOutput;

EXPORT
camera_status_t ACaptureSessionOutputContainer_create(/*out*/ACaptureSessionOutputContainer**) {
camera_status_t ACaptureSessionOutputContainer_create(
        /*out*/ACaptureSessionOutputContainer** out) {
    ATRACE_CALL();
    if (out == nullptr) {
        ALOGE("%s: Error: out null", __FUNCTION__);
        return ACAMERA_ERROR_INVALID_PARAMETER;
    }
    *out = new ACaptureSessionOutputContainer();
    return ACAMERA_OK;
}

EXPORT
void ACaptureSessionOutputContainer_free(ACaptureSessionOutputContainer*) {
void ACaptureSessionOutputContainer_free(ACaptureSessionOutputContainer* container) {
    ATRACE_CALL();
    if (container != nullptr) {
        delete container;
    }
    return;
}

EXPORT
camera_status_t ACaptureSessionOutput_create(ANativeWindow*, /*out*/ACaptureSessionOutput**) {
camera_status_t ACaptureSessionOutput_create(
        ANativeWindow* window, /*out*/ACaptureSessionOutput** out) {
    ATRACE_CALL();
    if (window == nullptr || out == nullptr) {
        ALOGE("%s: Error: bad argument. window %p, out %p",
                __FUNCTION__, window, out);
        return ACAMERA_ERROR_INVALID_PARAMETER;
    }
    *out = new ACaptureSessionOutput(window);
    return ACAMERA_OK;
}

EXPORT
void ACaptureSessionOutput_free(ACaptureSessionOutput*) {
void ACaptureSessionOutput_free(ACaptureSessionOutput* output) {
    ATRACE_CALL();
    if (output != nullptr) {
        delete output;
    }
    return;
}

EXPORT
camera_status_t ACaptureSessionOutputContainer_add(
        ACaptureSessionOutputContainer*, const ACaptureSessionOutput*) {
        ACaptureSessionOutputContainer* container, const ACaptureSessionOutput* output) {
    ATRACE_CALL();
    if (container == nullptr || output == nullptr) {
        ALOGE("%s: Error: invalid input: container %p, output %p",
                __FUNCTION__, container, output);
        return ACAMERA_ERROR_INVALID_PARAMETER;
    }
    auto pair = container->mOutputs.insert(*output);
    if (!pair.second) {
        ALOGW("%s: output %p already exists!", __FUNCTION__, output);
    }
    return ACAMERA_OK;
}

EXPORT
camera_status_t ACaptureSessionOutputContainer_remove(
        ACaptureSessionOutputContainer*, const ACaptureSessionOutput*) {
        ACaptureSessionOutputContainer* container, const ACaptureSessionOutput* output) {
    ATRACE_CALL();
    if (container == nullptr || output == nullptr) {
        ALOGE("%s: Error: invalid input: container %p, output %p",
                __FUNCTION__, container, output);
        return ACAMERA_ERROR_INVALID_PARAMETER;
    }
    container->mOutputs.erase(*output);
    return ACAMERA_OK;
}

EXPORT
camera_status_t ACameraDevice_createCaptureSession(
        ACameraDevice*,
        ACameraDevice* device,
        const ACaptureSessionOutputContainer*       outputs,
        const ACameraCaptureSession_stateCallbacks* callbacks) {
        const ACameraCaptureSession_stateCallbacks* callbacks,
        /*out*/ACameraCaptureSession** session) {
    ATRACE_CALL();
    return ACAMERA_OK;
    if (device == nullptr || outputs == nullptr || callbacks == nullptr || session == nullptr) {
        ALOGE("%s: Error: invalid input: device %p, outputs %p, callbacks %p, session %p",
                __FUNCTION__, device, outputs, callbacks, session);
        return ACAMERA_ERROR_INVALID_PARAMETER;
    }
    return device->createCaptureSession(outputs, callbacks, session);
}
+7 −7
Original line number Diff line number Diff line
@@ -43,7 +43,7 @@ camera_status_t ACameraManager_getCameraIdList(
        ACameraManager* manager, ACameraIdList** cameraIdList) {
    ATRACE_CALL();
    if (manager == nullptr || cameraIdList == nullptr) {
        ALOGE("%s: invalid argument! manager 0x%p, cameraIdList 0x%p",
        ALOGE("%s: invalid argument! manager %p, cameraIdList %p",
              __FUNCTION__, manager, cameraIdList);
        return ACAMERA_ERROR_INVALID_PARAMETER;
    }
@@ -67,8 +67,8 @@ camera_status_t ACameraManager_registerAvailabilityCallback(
        return ACAMERA_ERROR_INVALID_PARAMETER;
    }
    if (callback->onCameraAvailable == nullptr || callback->onCameraUnavailable == nullptr) {
        ALOGE("%s: invalid argument! callback 0x%p, "
                "onCameraAvailable 0x%p, onCameraUnavailable 0x%p",
        ALOGE("%s: invalid argument! callback %p, "
                "onCameraAvailable %p, onCameraUnavailable %p",
               __FUNCTION__, callback,
               callback->onCameraAvailable, callback->onCameraUnavailable);
        return ACAMERA_ERROR_INVALID_PARAMETER;
@@ -86,8 +86,8 @@ camera_status_t ACameraManager_unregisterAvailabilityCallback(
        return ACAMERA_ERROR_INVALID_PARAMETER;
    }
    if (callback->onCameraAvailable == nullptr || callback->onCameraUnavailable == nullptr) {
        ALOGE("%s: invalid argument! callback 0x%p, "
                "onCameraAvailable 0x%p, onCameraUnavailable 0x%p",
        ALOGE("%s: invalid argument! callback %p, "
                "onCameraAvailable %p, onCameraUnavailable %p",
               __FUNCTION__, callback,
               callback->onCameraAvailable, callback->onCameraUnavailable);
        return ACAMERA_ERROR_INVALID_PARAMETER;
@@ -101,7 +101,7 @@ camera_status_t ACameraManager_getCameraCharacteristics(
        ACameraManager* mgr, const char* cameraId, ACameraMetadata** chars){
    ATRACE_CALL();
    if (mgr == nullptr || cameraId == nullptr || chars == nullptr) {
        ALOGE("%s: invalid argument! mgr 0x%p cameraId 0x%p chars 0x%p",
        ALOGE("%s: invalid argument! mgr %p cameraId %p chars %p",
                __FUNCTION__, mgr, cameraId, chars);
        return ACAMERA_ERROR_INVALID_PARAMETER;
    }
@@ -115,7 +115,7 @@ camera_status_t ACameraManager_openCamera(
        /*out*/ACameraDevice** device) {
    ATRACE_CALL();
    if (mgr == nullptr || cameraId == nullptr || callback == nullptr || device == nullptr) {
        ALOGE("%s: invalid argument! mgr 0x%p cameraId 0x%p callback 0x%p device 0x%p",
        ALOGE("%s: invalid argument! mgr %p cameraId %p callback %p device %p",
                __FUNCTION__, mgr, cameraId, callback, device);
        return ACAMERA_ERROR_INVALID_PARAMETER;
    }
+1 −1
Original line number Diff line number Diff line
@@ -31,7 +31,7 @@ camera_status_t ACameraMetadata_getConstEntry(
        const ACameraMetadata* acm, uint32_t tag, ACameraMetadata_const_entry* entry) {
    ATRACE_CALL();
    if (acm == nullptr || entry == nullptr) {
        ALOGE("%s: invalid argument! metadata 0x%p, tag 0x%x, entry 0x%p",
        ALOGE("%s: invalid argument! metadata %p, tag 0x%x, entry %p",
               __FUNCTION__, acm, tag, entry);
        return ACAMERA_ERROR_INVALID_PARAMETER;
    }
Loading