From f838cdc8d769de2e61685a2c699ece49c6d19915 Mon Sep 17 00:00:00 2001 From: BlueMatthew Date: Fri, 2 Feb 2024 12:14:52 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=E5=AF=B9=E7=84=A6=E7=9A=84?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/cpp/camera2/ndkcamera.cpp | 59 ++++++++++++++++++++------ app/src/main/cpp/camera2/ndkcamera.h | 1 + 2 files changed, 46 insertions(+), 14 deletions(-) diff --git a/app/src/main/cpp/camera2/ndkcamera.cpp b/app/src/main/cpp/camera2/ndkcamera.cpp index b48d6046..bf16eed2 100644 --- a/app/src/main/cpp/camera2/ndkcamera.cpp +++ b/app/src/main/cpp/camera2/ndkcamera.cpp @@ -68,6 +68,7 @@ static void onSessionActive(void* context, ACameraCaptureSession *session) static void onSessionReady(void* context, ACameraCaptureSession *session) { ALOGW("onSessionReady %p", session); + ((NdkCamera*)context)->onSessionReady(session); } static void onSessionClosed(void* context, ACameraCaptureSession *session) @@ -97,11 +98,14 @@ void onCaptureProgressed(void* context, ACameraCaptureSession* session, ACapture val = { 0 }; status = ACameraMetadata_getConstEntry(result, ACAMERA_CONTROL_AF_STATE, &val); - uint8_t afState = *(val.data.u8); + if (status == ACAMERA_OK) + { + uint8_t afState = *(val.data.u8); - ALOGW("onCaptureProgressed AF_STATE=%u", (unsigned int)afState); + ALOGW("onCaptureProgressed AF_STATE=%u", (unsigned int)afState); - // ((NdkCamera*)context)->onCaptureProgressed(session, request, result); + // ((NdkCamera*)context)->onCaptureProgressed(session, request, result); + } } void onCaptureCompleted(void* context, ACameraCaptureSession* session, ACaptureRequest* request, const ACameraMetadata* result) @@ -413,10 +417,10 @@ int NdkCamera::open(const std::string& cameraId) { // std::this_thread::sleep_for(std::chrono::milliseconds(128)); // capture request { - // res = ACameraDevice_createCaptureRequest(camera_device, TEMPLATE_PREVIEW, &capture_request); - status = ACameraDevice_createCaptureRequest(camera_device, TEMPLATE_STILL_CAPTURE, &capture_request); + ACameraDevice_request_template templateId = (afSupported && m_params.autoFocus) ? TEMPLATE_PREVIEW : TEMPLATE_STILL_CAPTURE; + status = ACameraDevice_createCaptureRequest(camera_device, templateId, &capture_request); - int32_t fpsRange[2] = {10,30}; + int32_t fpsRange[2] = {1,1}; status = ACaptureRequest_setEntry_i32(capture_request, ACAMERA_CONTROL_AE_TARGET_FPS_RANGE,2,fpsRange); if (m_params.autoExposure) { @@ -435,15 +439,15 @@ int NdkCamera::open(const std::string& cameraId) { status = ACaptureRequest_setEntry_i32(capture_request, ACAMERA_SENSOR_SENSITIVITY, 1, &sensitivity); } if (m_params.exposureTime > 0) { - int64_t exposureTime = m_params.exposureTime * 1000000; + int64_t exposureTime = ((int64_t)m_params.exposureTime) * 1000000; status = ACaptureRequest_setEntry_i64(capture_request, ACAMERA_SENSOR_EXPOSURE_TIME, 1, &exposureTime); } } if (afSupported && m_params.autoFocus) { // uint8_t afMode = ACAMERA_CONTROL_AF_MODE_CONTINUOUS_VIDEO; - // uint8_t afMode = ACAMERA_CONTROL_AF_MODE_CONTINUOUS_PICTURE; - uint8_t afMode = ACAMERA_CONTROL_AF_MODE_AUTO; + uint8_t afMode = ACAMERA_CONTROL_AF_MODE_CONTINUOUS_PICTURE; + // uint8_t afMode = ACAMERA_CONTROL_AF_MODE_AUTO; status = ACaptureRequest_setEntry_u8(capture_request, ACAMERA_CONTROL_AF_MODE, 1, &afMode); uint8_t trig = ACAMERA_CONTROL_AF_TRIGGER_START; @@ -453,13 +457,13 @@ int NdkCamera::open(const std::string& cameraId) { else { uint8_t trig = ACAMERA_CONTROL_AF_TRIGGER_START; - status = ACaptureRequest_setEntry_u8(capture_request, ACAMERA_CONTROL_AF_TRIGGER, 1, &trig); + // status = ACaptureRequest_setEntry_u8(capture_request, ACAMERA_CONTROL_AF_TRIGGER, 1, &trig); m_imagesCaptured = (status == ACAMERA_OK) ? ~0 : 0; } // TODO: - m_imagesCaptured = 0; + // m_imagesCaptured = 0; uint8_t awbMode = ACAMERA_CONTROL_AWB_MODE_AUTO; // res = ACaptureRequest_setEntry_u8(capture_request, ACAMERA_CONTROL_AWB_MODE, 1, &awbMode); @@ -489,7 +493,7 @@ int NdkCamera::open(const std::string& cameraId) { ACameraCaptureSession_stateCallbacks camera_capture_session_state_callbacks; camera_capture_session_state_callbacks.context = this; camera_capture_session_state_callbacks.onActive = onSessionActive; - camera_capture_session_state_callbacks.onReady = onSessionReady; + camera_capture_session_state_callbacks.onReady = ::onSessionReady; camera_capture_session_state_callbacks.onClosed = onSessionClosed; status = ACaptureSessionOutputContainer_create(&capture_session_output_container); @@ -612,7 +616,7 @@ void NdkCamera::onImageAvailable(AImageReader* reader) if (m_imagesCaptured == ~0 || m_imagesCaptured >= 1) { - XYLOG(XYLOG_SEVERITY_ERROR, "m_imagesCaptured=%u wait for next image", m_imagesCaptured); + // XYLOG(XYLOG_SEVERITY_DEBUG, "m_imagesCaptured=%u wait for next image", m_imagesCaptured); // Not Ready Or Taken AImage_delete(image); return; @@ -801,6 +805,32 @@ void NdkCamera::on_image(const unsigned char* nv21, int nv21_width, int nv21_hei on_image(rgb); } +void NdkCamera::onSessionReady(ACameraCaptureSession *session) +{ + return; + + camera_status_t status = ACAMERA_OK; + + ACameraCaptureSession_captureCallbacks camera_capture_session_capture_callbacks; + camera_capture_session_capture_callbacks.context = this; + camera_capture_session_capture_callbacks.onCaptureStarted = 0; + camera_capture_session_capture_callbacks.onCaptureProgressed = ::onCaptureProgressed; + camera_capture_session_capture_callbacks.onCaptureCompleted = ::onCaptureCompleted; + camera_capture_session_capture_callbacks.onCaptureFailed = onCaptureFailed; + camera_capture_session_capture_callbacks.onCaptureSequenceCompleted = onCaptureSequenceCompleted; + camera_capture_session_capture_callbacks.onCaptureSequenceAborted = onCaptureSequenceAborted; + camera_capture_session_capture_callbacks.onCaptureBufferLost = 0; + + if (m_imagesCaptured != 0) + { + status = ACameraCaptureSession_setRepeatingRequest(capture_session, &camera_capture_session_capture_callbacks, 1, &capture_request, &captureSequenceId); + } + else + { + status = ACameraCaptureSession_capture(capture_session, &camera_capture_session_capture_callbacks, 1, &capture_request, &captureSequenceId); + } +} + void NdkCamera::onCaptureCompleted(ACameraCaptureSession* session, ACaptureRequest* request, const ACameraMetadata* result) { // CALL_REQUEST(setEntry_i64(requests_[PREVIEW_REQUEST_IDX].request_, @@ -818,6 +848,7 @@ void NdkCamera::onCaptureCompleted(ACameraCaptureSession* session, ACaptureReque val = { 0 }; status = ACameraMetadata_getConstEntry(result, ACAMERA_CONTROL_AF_STATE, &val); afState = *(val.data.u8); + ALOGW("onCaptureCompleted AF_STATE=%u", (unsigned int)afState); if (afState == ACAMERA_CONTROL_AF_STATE_PASSIVE_FOCUSED || afState == ACAMERA_CONTROL_AF_STATE_FOCUSED_LOCKED) // if (afState != ACAMERA_CONTROL_AF_STATE_INACTIVE) { @@ -862,7 +893,7 @@ void NdkCamera::onCaptureCompleted(ACameraCaptureSession* session, ACaptureReque status = ACameraMetadata_getConstEntry(result, ACAMERA_CONTROL_AF_STATE, &val); mResult.afState = *(val.data.u8); - ALOGW("onCaptureProgressed AF_STATE=%u", (unsigned int)afState); + ALOGW("onCaptureCompleted AF_STATE=%u", (unsigned int)afState); val = {0}; status = ACameraMetadata_getConstEntry(result, ACAMERA_SENSOR_SENSITIVITY, &val); diff --git a/app/src/main/cpp/camera2/ndkcamera.h b/app/src/main/cpp/camera2/ndkcamera.h index adc5b26f..0c7a21be 100644 --- a/app/src/main/cpp/camera2/ndkcamera.h +++ b/app/src/main/cpp/camera2/ndkcamera.h @@ -106,6 +106,7 @@ public: virtual void on_image(const unsigned char* nv21, int nv21_width, int nv21_height); void onCaptureCompleted(ACameraCaptureSession* session, ACaptureRequest* request, const ACameraMetadata* result); + void onSessionReady(ACameraCaptureSession *session); const CAPTURE_RESULT& getCaptureResult() const {