From b5b24d7d19370636d577239685529675cb2ed118 Mon Sep 17 00:00:00 2001 From: BlueMatthew Date: Thu, 11 Jan 2024 14:41:49 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=B5=84=E6=BA=90=E7=9A=84?= =?UTF-8?q?=E9=87=8A=E6=94=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/cpp/PhoneDevice.cpp | 33 +++-------- app/src/main/cpp/PhoneDevice.h | 1 + app/src/main/cpp/camera2/ndkcamera.cpp | 77 +++++++++++++++++++------- app/src/main/cpp/camera2/ndkcamera.h | 3 + 4 files changed, 70 insertions(+), 44 deletions(-) diff --git a/app/src/main/cpp/PhoneDevice.cpp b/app/src/main/cpp/PhoneDevice.cpp index 70c31522..fb0373ae 100644 --- a/app/src/main/cpp/PhoneDevice.cpp +++ b/app/src/main/cpp/PhoneDevice.cpp @@ -130,6 +130,11 @@ CPhoneDevice::CPhoneCamera::CPhoneCamera(CPhoneDevice* dev, int32_t width, int32 { } +CPhoneDevice::CPhoneCamera::~CPhoneCamera() +{ + m_dev = NULL; +} + bool CPhoneDevice::CPhoneCamera::on_image(cv::Mat& rgb) { if (m_dev != NULL) @@ -834,26 +839,11 @@ void CPhoneDevice::CloseCamera2(CPhoneDevice::CPhoneCamera* camera, bool turnOff delete camera; } - // GpioControl::EnableGpio(CMD_SET_CAM_3V3_EN_STATE, true); - JNIEnv* env = NULL; - bool didAttachThread = false; - bool res = GetJniEnv(m_vm, &env, didAttachThread); - if (!res) - { - ALOGE("Failed to get JNI Env"); - return; - } - if (turnOffOtg) { - TurnOffOtg(env); - } - TurnOffCameraPower(env); - - if (didAttachThread) - { - m_vm->DetachCurrentThread(); + TurnOffOtg(NULL); } + TurnOffCameraPower(NULL); } void visualize(const char* filename, const ncnn::Mat& m) @@ -983,19 +973,14 @@ bool CPhoneDevice::OnImageReady(cv::Mat& mat) } } - - - - - int thickness2 = 8 * ratio; + int thickness2 = 6 * ratio; if (thickness2 < 2) thickness2 = 2; - int thickness1 = 1 * ratio; + int thickness1 = 2 * ratio; if (thickness1 < 1) thickness1 = 1; cv::Scalar scalar1(0, 0, 0); // black cv::Scalar scalar2(255, 255, 255); // white - #ifdef _DEBUG cv::Scalar scalar(0, 0, 255); // white diff --git a/app/src/main/cpp/PhoneDevice.h b/app/src/main/cpp/PhoneDevice.h index 9ea0a387..fb528ec3 100644 --- a/app/src/main/cpp/PhoneDevice.h +++ b/app/src/main/cpp/PhoneDevice.h @@ -155,6 +155,7 @@ public: class CPhoneCamera : public NdkCamera { public: CPhoneCamera(CPhoneDevice* dev, int32_t width, int32_t height, const NdkCamera::CAMERA_PARAMS& params); + virtual ~CPhoneCamera(); virtual bool on_image(cv::Mat& rgb); virtual void on_error(const std::string& msg); diff --git a/app/src/main/cpp/camera2/ndkcamera.cpp b/app/src/main/cpp/camera2/ndkcamera.cpp index d9b9dcdb..4c5e43a0 100644 --- a/app/src/main/cpp/camera2/ndkcamera.cpp +++ b/app/src/main/cpp/camera2/ndkcamera.cpp @@ -23,9 +23,19 @@ #include "Camera2Helper.h" #include +static void onAvailabilityCallback(void* context, const char* cameraId) +{ + ALOGW("CameraStatus::onAvailability CameraId: %s", cameraId); +} + +static void onUnavailabilityCallback(void* context, const char* cameraId) +{ + ALOGW("CameraStatus::onUnavailability CameraId: %s", cameraId); +} + static void onDisconnected(void* context, ACameraDevice* device) { - ALOGW("onDisconnected %p", device); + ALOGW("CameraStatus::onDisconnected CameraId: %s", ACameraDevice_getId(device)); } static void onError(void* context, ACameraDevice* device, int error) @@ -34,6 +44,8 @@ static void onError(void* context, ACameraDevice* device, int error) { } + + ALOGW("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); @@ -111,6 +123,12 @@ NdkCamera::NdkCamera(int32_t width, int32_t height, const NdkCamera::CAMERA_PARA nightModeSupported = false; nightPortraitModeSupported = false; +#ifdef _DEBUG + camera_manager_cb.context = this; + camera_manager_cb.onCameraAvailable = onAvailabilityCallback; + camera_manager_cb.onCameraUnavailable = onUnavailabilityCallback; +#endif + camera_manager = 0; camera_device = 0; image_reader = 0; @@ -131,11 +149,14 @@ NdkCamera::~NdkCamera() } int NdkCamera::open(const std::string& cameraId) { - ALOGW("DBG::open %s", cameraId.c_str()); + ALOGW("DBG::try open %s", cameraId.c_str()); // camera_facing = _camera_facing; camera_manager = ACameraManager_create(); +#ifdef _DEBUG + ACameraManager_registerAvailabilityCallback(camera_manager, &camera_manager_cb); +#endif // find front camera std::string camera_id; @@ -337,7 +358,9 @@ int NdkCamera::open(const std::string& cameraId) { } if (camera_id == "1") { +#if 0 camera_facing = 1; +#endif } if (camera_id == "2") { @@ -364,8 +387,6 @@ int NdkCamera::open(const std::string& cameraId) { // ANativeWindow_acquire(image_reader_surface); } - ALOGW("open %s %d", camera_id.c_str(), camera_orientation); - // open camera { ACameraDevice_StateCallbacks camera_device_state_callbacks; @@ -376,10 +397,13 @@ int NdkCamera::open(const std::string& cameraId) { res = ACameraManager_openCamera(camera_manager, camera_id.c_str(), &camera_device_state_callbacks, &camera_device); if (res != ACAMERA_OK) { + ALOGE("Failed to open camera res=%d", res); return 1; } } + ALOGW("CameraStatus::Open %s %d", camera_id.c_str(), camera_orientation); + // std::this_thread::sleep_for(std::chrono::milliseconds(128)); // capture request { @@ -438,8 +462,8 @@ int NdkCamera::open(const std::string& cameraId) { if (m_params.nightMode) { if (nightModeSupported) { - uint8_t modeEnabled = 1; // ACAMERA_CONTROL_SCENE_MODE_HDR - // res = ACaptureRequest_setEntry_u8(capture_request, ACAMERA_CONTROL_SCENE_MODE_NIGHT, 1, &modeEnabled); + uint8_t sceneMode = ACAMERA_CONTROL_SCENE_MODE_NIGHT; + res = ACaptureRequest_setEntry_u8(capture_request, ACAMERA_CONTROL_SCENE_MODE, 1, &sceneMode); } if (nightPortraitModeSupported) { uint8_t modeEnabled = 1; // ACAMERA_CONTROL_SCENE_MODE_HDR @@ -490,7 +514,7 @@ void NdkCamera::close() if (capture_session) { - ACameraCaptureSession_stopRepeating(capture_session); + res = ACameraCaptureSession_stopRepeating(capture_session); ACameraCaptureSession_close(capture_session); capture_session = 0; } @@ -511,18 +535,6 @@ void NdkCamera::close() capture_request = 0; } - if (image_reader_surface) - { - // ANativeWindow_release(image_reader_surface); - image_reader_surface = 0; - } - - if (image_reader) - { - AImageReader_delete(image_reader); - image_reader = 0; - } - if (capture_session_output) { if (capture_session_output_container) @@ -541,15 +553,31 @@ void NdkCamera::close() if (camera_device) { + ALOGW("CameraStatus::try close %s", mCameraId.c_str()); ACameraDevice_close(camera_device); camera_device = 0; } + if (image_reader_surface) + { + // ANativeWindow_release(image_reader_surface); + image_reader_surface = 0; + } + + if (image_reader) + { + AImageReader_setImageListener(image_reader, NULL); + AImageReader_delete(image_reader); + image_reader = 0; + } + if (camera_manager) { +#ifdef _DEBUG + ACameraManager_unregisterAvailabilityCallback(camera_manager, &camera_manager_cb); +#endif ACameraManager_delete(camera_manager); camera_manager = 0; - ALOGW("DBG::close %s", mCameraId.c_str()); } } @@ -661,6 +689,15 @@ void NdkCamera::onImageAvailable(AImageReader* reader) AImage_delete(image); m_imagesCaptured ++; + + if (capture_session != 0) + { + camera_status_t cs = ACameraCaptureSession_stopRepeating(capture_session); + if (cs != ACAMERA_OK) + { + int aa = 0; + } + } } void NdkCamera::on_error(const std::string& msg) diff --git a/app/src/main/cpp/camera2/ndkcamera.h b/app/src/main/cpp/camera2/ndkcamera.h index 9f8aab4d..19152bd9 100644 --- a/app/src/main/cpp/camera2/ndkcamera.h +++ b/app/src/main/cpp/camera2/ndkcamera.h @@ -105,6 +105,9 @@ public: CAPTURE_RESULT mResult; private: +#ifdef _DEBUG + ACameraManager_AvailabilityCallbacks camera_manager_cb; +#endif ACameraManager* camera_manager; ACameraDevice* camera_device; AImageReader* image_reader;