优化资源的释放

serial
BlueMatthew 1 year ago
parent 7129373681
commit b5b24d7d19

@ -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) bool CPhoneDevice::CPhoneCamera::on_image(cv::Mat& rgb)
{ {
if (m_dev != NULL) if (m_dev != NULL)
@ -834,26 +839,11 @@ void CPhoneDevice::CloseCamera2(CPhoneDevice::CPhoneCamera* camera, bool turnOff
delete camera; 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) if (turnOffOtg)
{ {
TurnOffOtg(env); TurnOffOtg(NULL);
}
TurnOffCameraPower(env);
if (didAttachThread)
{
m_vm->DetachCurrentThread();
} }
TurnOffCameraPower(NULL);
} }
void visualize(const char* filename, const ncnn::Mat& m) void visualize(const char* filename, const ncnn::Mat& m)
@ -983,19 +973,14 @@ bool CPhoneDevice::OnImageReady(cv::Mat& mat)
} }
} }
int thickness2 = 6 * ratio;
int thickness2 = 8 * ratio;
if (thickness2 < 2) thickness2 = 2; if (thickness2 < 2) thickness2 = 2;
int thickness1 = 1 * ratio; int thickness1 = 2 * ratio;
if (thickness1 < 1) thickness1 = 1; if (thickness1 < 1) thickness1 = 1;
cv::Scalar scalar1(0, 0, 0); // black cv::Scalar scalar1(0, 0, 0); // black
cv::Scalar scalar2(255, 255, 255); // white cv::Scalar scalar2(255, 255, 255); // white
#ifdef _DEBUG #ifdef _DEBUG
cv::Scalar scalar(0, 0, 255); // white cv::Scalar scalar(0, 0, 255); // white

@ -155,6 +155,7 @@ public:
class CPhoneCamera : public NdkCamera { class CPhoneCamera : public NdkCamera {
public: public:
CPhoneCamera(CPhoneDevice* dev, int32_t width, int32_t height, const NdkCamera::CAMERA_PARAMS& params); CPhoneCamera(CPhoneDevice* dev, int32_t width, int32_t height, const NdkCamera::CAMERA_PARAMS& params);
virtual ~CPhoneCamera();
virtual bool on_image(cv::Mat& rgb); virtual bool on_image(cv::Mat& rgb);
virtual void on_error(const std::string& msg); virtual void on_error(const std::string& msg);

@ -23,9 +23,19 @@
#include "Camera2Helper.h" #include "Camera2Helper.h"
#include <AndroidHelper.h> #include <AndroidHelper.h>
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) 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) 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); std::string msg = "NdkCamera error code=" + std::to_string(error);
((NdkCamera*)context)->on_error(msg); ((NdkCamera*)context)->on_error(msg);
// __android_log_print(ANDROID_LOG_WARN, "NdkCamera", "onError %p %d", device, error); // __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; nightModeSupported = false;
nightPortraitModeSupported = 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_manager = 0;
camera_device = 0; camera_device = 0;
image_reader = 0; image_reader = 0;
@ -131,11 +149,14 @@ NdkCamera::~NdkCamera()
} }
int NdkCamera::open(const std::string& cameraId) { 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_facing = _camera_facing;
camera_manager = ACameraManager_create(); camera_manager = ACameraManager_create();
#ifdef _DEBUG
ACameraManager_registerAvailabilityCallback(camera_manager, &camera_manager_cb);
#endif
// find front camera // find front camera
std::string camera_id; std::string camera_id;
@ -337,7 +358,9 @@ int NdkCamera::open(const std::string& cameraId) {
} }
if (camera_id == "1") if (camera_id == "1")
{ {
#if 0
camera_facing = 1; camera_facing = 1;
#endif
} }
if (camera_id == "2") if (camera_id == "2")
{ {
@ -364,8 +387,6 @@ int NdkCamera::open(const std::string& cameraId) {
// ANativeWindow_acquire(image_reader_surface); // ANativeWindow_acquire(image_reader_surface);
} }
ALOGW("open %s %d", camera_id.c_str(), camera_orientation);
// open camera // open camera
{ {
ACameraDevice_StateCallbacks camera_device_state_callbacks; 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); res = ACameraManager_openCamera(camera_manager, camera_id.c_str(), &camera_device_state_callbacks, &camera_device);
if (res != ACAMERA_OK) if (res != ACAMERA_OK)
{ {
ALOGE("Failed to open camera res=%d", res);
return 1; return 1;
} }
} }
ALOGW("CameraStatus::Open %s %d", camera_id.c_str(), camera_orientation);
// std::this_thread::sleep_for(std::chrono::milliseconds(128)); // std::this_thread::sleep_for(std::chrono::milliseconds(128));
// capture request // capture request
{ {
@ -438,8 +462,8 @@ int NdkCamera::open(const std::string& cameraId) {
if (m_params.nightMode) { if (m_params.nightMode) {
if (nightModeSupported) { if (nightModeSupported) {
uint8_t modeEnabled = 1; // ACAMERA_CONTROL_SCENE_MODE_HDR uint8_t sceneMode = ACAMERA_CONTROL_SCENE_MODE_NIGHT;
// res = ACaptureRequest_setEntry_u8(capture_request, ACAMERA_CONTROL_SCENE_MODE_NIGHT, 1, &modeEnabled); res = ACaptureRequest_setEntry_u8(capture_request, ACAMERA_CONTROL_SCENE_MODE, 1, &sceneMode);
} }
if (nightPortraitModeSupported) { if (nightPortraitModeSupported) {
uint8_t modeEnabled = 1; // ACAMERA_CONTROL_SCENE_MODE_HDR uint8_t modeEnabled = 1; // ACAMERA_CONTROL_SCENE_MODE_HDR
@ -490,7 +514,7 @@ void NdkCamera::close()
if (capture_session) if (capture_session)
{ {
ACameraCaptureSession_stopRepeating(capture_session); res = ACameraCaptureSession_stopRepeating(capture_session);
ACameraCaptureSession_close(capture_session); ACameraCaptureSession_close(capture_session);
capture_session = 0; capture_session = 0;
} }
@ -511,18 +535,6 @@ void NdkCamera::close()
capture_request = 0; 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)
{ {
if (capture_session_output_container) if (capture_session_output_container)
@ -541,15 +553,31 @@ void NdkCamera::close()
if (camera_device) if (camera_device)
{ {
ALOGW("CameraStatus::try close %s", mCameraId.c_str());
ACameraDevice_close(camera_device); ACameraDevice_close(camera_device);
camera_device = 0; 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) if (camera_manager)
{ {
#ifdef _DEBUG
ACameraManager_unregisterAvailabilityCallback(camera_manager, &camera_manager_cb);
#endif
ACameraManager_delete(camera_manager); ACameraManager_delete(camera_manager);
camera_manager = 0; camera_manager = 0;
ALOGW("DBG::close %s", mCameraId.c_str());
} }
} }
@ -661,6 +689,15 @@ void NdkCamera::onImageAvailable(AImageReader* reader)
AImage_delete(image); AImage_delete(image);
m_imagesCaptured ++; 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) void NdkCamera::on_error(const std::string& msg)

@ -105,6 +105,9 @@ public:
CAPTURE_RESULT mResult; CAPTURE_RESULT mResult;
private: private:
#ifdef _DEBUG
ACameraManager_AvailabilityCallbacks camera_manager_cb;
#endif
ACameraManager* camera_manager; ACameraManager* camera_manager;
ACameraDevice* camera_device; ACameraDevice* camera_device;
AImageReader* image_reader; AImageReader* image_reader;

Loading…
Cancel
Save