diff --git a/app/src/main/cpp/camera2/ndkcamera.cpp b/app/src/main/cpp/camera2/ndkcamera.cpp index 247c8314..f7f5fa7d 100644 --- a/app/src/main/cpp/camera2/ndkcamera.cpp +++ b/app/src/main/cpp/camera2/ndkcamera.cpp @@ -48,15 +48,7 @@ static void onDisconnected(void* context, ACameraDevice* device) static void onError(void* context, ACameraDevice* device, int error) { - if (ACAMERA_ERROR_CAMERA_DEVICE == error) - { - - } - - XYLOG(XYLOG_SEVERITY_ERROR, "CameraStatus::onError CameraId: %s err=%d", ACameraDevice_getId(device), error); - std::string msg = "NdkCamera error code=" + std::to_string(error); - ((NdkCamera*)context)->on_error(msg); - // __android_log_print(ANDROID_LOG_WARN, "NdkCamera", "onError %p %d", device, error); + ((NdkCamera*)context)->onError(device, error); } static void onImageAvailable(void* context, AImageReader* reader) @@ -113,6 +105,7 @@ NdkCamera::NdkCamera(int32_t width, int32_t height, const NdkCamera::CAMERA_PARA m_params = params; m_firstFrame = true; + m_photoTaken = false; mWidth = width; mHeight = height; @@ -551,7 +544,7 @@ int NdkCamera::open(const std::string& cameraId) { ACameraDevice_StateCallbacks camera_device_state_callbacks; camera_device_state_callbacks.context = this; camera_device_state_callbacks.onDisconnected = ::onDisconnected; - camera_device_state_callbacks.onError = onError; + camera_device_state_callbacks.onError = ::onError; status = ACameraManager_openCamera(camera_manager, cameraId.c_str(), &camera_device_state_callbacks, &camera_device); if (status != ACAMERA_OK) @@ -979,6 +972,7 @@ void NdkCamera::onImageAvailable(AImageReader* reader) return; } + m_photoTaken = true; XYLOG(XYLOG_SEVERITY_INFO, "Photo Taken: AES=%u AFS=%u AWBS=%u", (uint32_t)mFinalResult.aeState, (uint32_t)mFinalResult.awbState, (uint32_t)mFinalResult.afState); mFinalResult.duration = GetMicroTimeStamp() - m_startTime; @@ -1524,8 +1518,25 @@ void NdkCamera::onCaptureFailed(ACameraCaptureSession* session, ACaptureRequest* XYLOG(XYLOG_SEVERITY_WARNING, "onCaptureFailed session=%p request=%p reason=%d", session, request, failure->reason); char msg[32] = { 0 }; - snprintf(msg, sizeof(msg), "CaptureFailed reason=%d", failure->reason); - on_error(msg); + snprintf(msg, sizeof(msg), "CaptureFailed reason=%d PhotoTaken=%d", failure->reason, m_photoTaken ? 1 : 0); + if (!m_photoTaken) + { + on_error(msg); + } +} + +void NdkCamera::onError(ACameraDevice* device, int error) +{ + if (ACAMERA_ERROR_CAMERA_DEVICE == error) + { + } + + XYLOG(XYLOG_SEVERITY_ERROR, "CameraStatus::onError CameraId: %s err=%d PhotoTaken=%d", ACameraDevice_getId(device), error, m_photoTaken ? 1 : 0); + if (!m_photoTaken) + { + std::string msg = "NdkCamera error code=" + std::to_string(error); + on_error(msg); + } } void NdkCamera::onAvailabilityCallback(const char* cameraId) diff --git a/app/src/main/cpp/camera2/ndkcamera.h b/app/src/main/cpp/camera2/ndkcamera.h index 36f8c4e5..2b211336 100644 --- a/app/src/main/cpp/camera2/ndkcamera.h +++ b/app/src/main/cpp/camera2/ndkcamera.h @@ -128,6 +128,7 @@ public: void onUnavailabilityCallback(const char* cameraId); virtual void onImageAvailable(AImageReader* reader); virtual int32_t getOutputFormat() const; + virtual bool on_image(cv::Mat& rgb); virtual void on_error(const std::string& msg); virtual void on_image(const unsigned char* nv21, int nv21_width, int nv21_height); @@ -137,6 +138,7 @@ public: void onCaptureCompleted(ACameraCaptureSession* session, ACaptureRequest* request, const ACameraMetadata* result); void onCaptureFailed(ACameraCaptureSession* session, ACaptureRequest* request, ACameraCaptureFailure* failure); void onSessionReady(ACameraCaptureSession *session); + void onError(ACameraDevice* device, int error); const CAPTURE_RESULT& getCaptureResult() const { @@ -154,6 +156,7 @@ protected: int camera_facing; int camera_orientation; bool m_firstFrame; + bool m_photoTaken; int32_t mWidth; int32_t mHeight; std::string mCameraId;