|
|
|
@ -23,9 +23,19 @@
|
|
|
|
|
#include "Camera2Helper.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)
|
|
|
|
|
{
|
|
|
|
|
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)
|
|
|
|
|