|
|
|
@ -111,8 +111,6 @@ NdkCamera::NdkCamera(int32_t width, int32_t height, const NdkCamera::CAMERA_PARA
|
|
|
|
|
mWidth = width;
|
|
|
|
|
mHeight = height;
|
|
|
|
|
|
|
|
|
|
mFrameNumber.store(1);
|
|
|
|
|
|
|
|
|
|
mCaptureTriggered = false;
|
|
|
|
|
|
|
|
|
|
maxFrameDuration = 0;
|
|
|
|
@ -585,7 +583,7 @@ int NdkCamera::open(const std::string& cameraId) {
|
|
|
|
|
ANativeWindow_acquire(mPreviewImageWindow);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
mstatus = AImageReader_new(foundRes.org_width(), foundRes.org_height(), getOutputFormat(), burstCaptures, &mImageReader);
|
|
|
|
|
mstatus = AImageReader_new(foundRes.org_width(), foundRes.org_height(), getOutputFormat(), burstCaptures + 2, &mImageReader);
|
|
|
|
|
if (mstatus == AMEDIA_OK)
|
|
|
|
|
{
|
|
|
|
|
AImageReader_ImageListener listener;
|
|
|
|
@ -599,19 +597,18 @@ int NdkCamera::open(const std::string& cameraId) {
|
|
|
|
|
status = ACameraOutputTarget_create(mPreviewImageWindow, &mPreviewOutputTarget);
|
|
|
|
|
status = ACameraOutputTarget_create(mImageWindow, &mOutputTarget);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
for (int idx = 0; idx <= burstCaptures; idx++)
|
|
|
|
|
{
|
|
|
|
|
CaptureRequest *request = new CaptureRequest();
|
|
|
|
|
std::memset(request, 0, sizeof(CaptureRequest));
|
|
|
|
|
|
|
|
|
|
bool isPreviewReqest = (idx == PREVIEW_REQUEST_IDX);
|
|
|
|
|
bool isPreviewRequest = (idx == PREVIEW_REQUEST_IDX);
|
|
|
|
|
|
|
|
|
|
request->pThis = this;
|
|
|
|
|
request->imageReader = isPreviewReqest ? mPreviewImageReader : mImageReader;
|
|
|
|
|
request->imageWindow = isPreviewReqest ? mPreviewImageWindow : mImageWindow;
|
|
|
|
|
request->imageTarget = isPreviewReqest ? mPreviewOutputTarget : mOutputTarget;
|
|
|
|
|
request->templateId = isPreviewReqest ? TEMPLATE_PREVIEW : (ACameraDevice_request_template)m_params.requestTemplate;
|
|
|
|
|
request->imageReader = isPreviewRequest ? mPreviewImageReader : mImageReader;
|
|
|
|
|
request->imageWindow = isPreviewRequest ? mPreviewImageWindow : mImageWindow;
|
|
|
|
|
request->imageTarget = isPreviewRequest ? mPreviewOutputTarget : mOutputTarget;
|
|
|
|
|
request->templateId = isPreviewRequest ? TEMPLATE_PREVIEW : (ACameraDevice_request_template)m_params.requestTemplate;
|
|
|
|
|
|
|
|
|
|
mCaptureRequests.push_back(request);
|
|
|
|
|
|
|
|
|
@ -623,7 +620,7 @@ int NdkCamera::open(const std::string& cameraId) {
|
|
|
|
|
uint8_t ctrlMode = ACAMERA_CONTROL_MODE_AUTO;
|
|
|
|
|
status = ACaptureRequest_setEntry_u8(request->request, ACAMERA_CONTROL_MODE, 1, &ctrlMode);
|
|
|
|
|
|
|
|
|
|
uint8_t captureIntent = request->templateId == TEMPLATE_PREVIEW ? ACAMERA_CONTROL_CAPTURE_INTENT_PREVIEW : ACAMERA_CONTROL_CAPTURE_INTENT_STILL_CAPTURE;
|
|
|
|
|
uint8_t captureIntent = isPreviewRequest ? ACAMERA_CONTROL_CAPTURE_INTENT_PREVIEW : ACAMERA_CONTROL_CAPTURE_INTENT_STILL_CAPTURE;
|
|
|
|
|
status = ACaptureRequest_setEntry_u8(request->request, ACAMERA_CONTROL_CAPTURE_INTENT, 1, &captureIntent);
|
|
|
|
|
|
|
|
|
|
uint8_t flashMode = ACAMERA_FLASH_MODE_OFF;
|
|
|
|
@ -718,7 +715,7 @@ int NdkCamera::open(const std::string& cameraId) {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (isPreviewReqest)
|
|
|
|
|
if (isPreviewRequest)
|
|
|
|
|
{
|
|
|
|
|
if (aeLockAvailable && (m_params.wait3ALocked & WAIT_AE_LOCKED))
|
|
|
|
|
{
|
|
|
|
@ -994,8 +991,23 @@ void NdkCamera::onImageAvailable(AImageReader* reader)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
m_photoTaken = true;
|
|
|
|
|
m_locker.lock();
|
|
|
|
|
mCaptureFrames.push_back(std::shared_ptr<AImage>(image, AImage_delete));
|
|
|
|
|
m_locker.unlock();
|
|
|
|
|
|
|
|
|
|
ALOGD("Capture Image Received");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool captureCompleted = false;
|
|
|
|
|
size_t expectedTimes = mCaptureRequests.size() - 1;
|
|
|
|
|
m_locker.lock();
|
|
|
|
|
captureCompleted = mCaptureResults.size() >= expectedTimes && mCaptureFrames.size() >= expectedTimes;
|
|
|
|
|
m_locker.unlock();
|
|
|
|
|
|
|
|
|
|
if (captureCompleted)
|
|
|
|
|
{
|
|
|
|
|
onBurstCapture(mCharacteristics, mCaptureResults, mLdr, mCaptureFrames);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -1137,21 +1149,6 @@ void NdkCamera::on_image(const unsigned char* nv21, int nv21_width, int nv21_hei
|
|
|
|
|
|
|
|
|
|
void NdkCamera::onSessionReady(ACameraCaptureSession *session)
|
|
|
|
|
{
|
|
|
|
|
if (m_photoTaken)
|
|
|
|
|
{
|
|
|
|
|
for (int idx = 0; idx < 10; idx++)
|
|
|
|
|
{
|
|
|
|
|
if (mCaptureFrames.size() >= m_params.burstCaptures && mCaptureResults.size() >= m_params.burstCaptures)
|
|
|
|
|
{
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
std::this_thread::sleep_for(std::chrono::milliseconds(16));
|
|
|
|
|
}
|
|
|
|
|
AASSERT(mCaptureFrames.size() == mCaptureResults.size(), "Frame size %u doesn't equal to result size %u",
|
|
|
|
|
(uint32_t)mCaptureFrames.size(), (uint32_t)mCaptureResults.size());
|
|
|
|
|
|
|
|
|
|
onBurstCapture(mCharacteristics, mCaptureResults, mLdr, mCaptureFrames);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void NdkCamera::onCaptureProgressed(ACameraCaptureSession* session, ACaptureRequest* request, const ACameraMetadata* result)
|
|
|
|
@ -1313,21 +1310,19 @@ void NdkCamera::onCaptureCompleted(ACameraCaptureSession* session, ACaptureReque
|
|
|
|
|
(unsigned int)afState, (unsigned int)aeState, (unsigned int)awbState, (unsigned int)(ts - m_startTime));
|
|
|
|
|
|
|
|
|
|
std::vector<ACaptureRequest*> requests;
|
|
|
|
|
std::vector<int> sequenceIds;
|
|
|
|
|
int sequenceId = 0;
|
|
|
|
|
|
|
|
|
|
requests.reserve(mCaptureRequests.size() - 1);
|
|
|
|
|
sequenceIds.resize(mCaptureRequests.size() - 1, 0);
|
|
|
|
|
|
|
|
|
|
for (int idx = 1; idx < mCaptureRequests.size(); idx++)
|
|
|
|
|
{
|
|
|
|
|
CopyPreviewRequest(mCaptureRequests[idx]->request, result);
|
|
|
|
|
requests.push_back(mCaptureRequests[idx]->request);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ALOGW("Will Stop Repeating Request");
|
|
|
|
|
|
|
|
|
|
// ALOGW("Will Stop Repeating Request");
|
|
|
|
|
status = ACameraCaptureSession_stopRepeating(capture_session);
|
|
|
|
|
|
|
|
|
|
ALOGW("Finished Repeating Request");
|
|
|
|
|
// ALOGW("Finished Repeating Request");
|
|
|
|
|
|
|
|
|
|
ACameraCaptureSession_captureCallbacks capture_session_capture_cb;
|
|
|
|
|
capture_session_capture_cb.context = this;
|
|
|
|
@ -1341,14 +1336,12 @@ void NdkCamera::onCaptureCompleted(ACameraCaptureSession* session, ACaptureReque
|
|
|
|
|
|
|
|
|
|
int numberOfRequests = requests.size();
|
|
|
|
|
status = ACameraCaptureSession_capture(capture_session, &capture_session_capture_cb,
|
|
|
|
|
numberOfRequests, &requests[0], &sequenceIds[0]);
|
|
|
|
|
numberOfRequests, &requests[0], &sequenceId);
|
|
|
|
|
|
|
|
|
|
ALOGW("Capture num = %d ", numberOfRequests);
|
|
|
|
|
for (int idx = 0; idx < sequenceIds.size(); idx++)
|
|
|
|
|
ALOGW("Capture num = %d sequenceId=%d", numberOfRequests, sequenceId);
|
|
|
|
|
for (int idx = 1; idx < mCaptureRequests.size(); idx++)
|
|
|
|
|
{
|
|
|
|
|
// mCaptureRequests[idx + 1]->request = requests[idx];
|
|
|
|
|
mCaptureRequests[idx + 1]->sessionSequenceId = sequenceIds[idx];
|
|
|
|
|
ALOGW("Capture Request idx=%d sequenceId=%d", idx, sequenceIds[idx]);
|
|
|
|
|
mCaptureRequests[idx]->sessionSequenceId = sequenceId;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
mCaptureTriggered = true;
|
|
|
|
@ -1360,8 +1353,48 @@ void NdkCamera::onCaptureCompleted(ACameraCaptureSession* session, ACaptureReque
|
|
|
|
|
ALOGW("Capture Result sequenceId=%d TID=%lld", pCaptureRequest->sessionSequenceId, (long long)tid);
|
|
|
|
|
|
|
|
|
|
ACameraMetadata* pCopy = ACameraMetadata_copy(result);
|
|
|
|
|
bool captureCompleted = false;
|
|
|
|
|
size_t expectedTimes = mCaptureRequests.size() - 1;
|
|
|
|
|
|
|
|
|
|
m_locker.lock();
|
|
|
|
|
mCaptureResults.push_back(std::shared_ptr<ACameraMetadata>(pCopy, ACameraMetadata_free));
|
|
|
|
|
captureCompleted = mCaptureResults.size() >= expectedTimes && mCaptureFrames.size() >= expectedTimes;
|
|
|
|
|
m_locker.unlock();
|
|
|
|
|
if (captureCompleted)
|
|
|
|
|
{
|
|
|
|
|
onBurstCapture(mCharacteristics, mCaptureResults, mLdr, mCaptureFrames);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void NdkCamera::CopyPreviewRequest(ACaptureRequest* request, const ACameraMetadata* previewResult)
|
|
|
|
|
{
|
|
|
|
|
camera_status_t status = ACAMERA_ERROR_BASE;
|
|
|
|
|
|
|
|
|
|
ACameraMetadata_const_entry val = { 0 };
|
|
|
|
|
status = ACameraMetadata_getConstEntry(previewResult, ACAMERA_SENSOR_EXPOSURE_TIME, &val);
|
|
|
|
|
int64_t exTime = (status == ACAMERA_OK) ? val.data.i64[0] : -1;
|
|
|
|
|
val = {0};
|
|
|
|
|
status = ACameraMetadata_getConstEntry(previewResult, ACAMERA_SENSOR_SENSITIVITY, &val);
|
|
|
|
|
int32_t sensitivity = (status == ACAMERA_OK) ? *(val.data.i32) : 0;
|
|
|
|
|
|
|
|
|
|
if (exTime != -1 && sensitivity != 0)
|
|
|
|
|
{
|
|
|
|
|
uint8_t aeModeOff = ACAMERA_CONTROL_AE_MODE_OFF;
|
|
|
|
|
ACaptureRequest_setEntry_u8(request, ACAMERA_CONTROL_AE_MODE, 1, &aeModeOff);
|
|
|
|
|
ACaptureRequest_setEntry_i64(request, ACAMERA_SENSOR_EXPOSURE_TIME, 1, &exTime);
|
|
|
|
|
ACaptureRequest_setEntry_i32(request, ACAMERA_SENSOR_SENSITIVITY, 1, &sensitivity);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
val = { 0 };
|
|
|
|
|
float focusDistance = NAN;
|
|
|
|
|
status = ACameraMetadata_getConstEntry(result, ACAMERA_LENS_FOCUS_DISTANCE, &val);
|
|
|
|
|
if (status == ACAMERA_OK)
|
|
|
|
|
{
|
|
|
|
|
focusDistance = *val.data.f;
|
|
|
|
|
}
|
|
|
|
|
*/
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void NdkCamera::onCaptureFailed(ACameraCaptureSession* session, ACaptureRequest* request, ACameraCaptureFailure* failure)
|
|
|
|
|