diff --git a/app/src/main/cpp/DngCreator.cpp b/app/src/main/cpp/DngCreator.cpp index cdb90d66..0c1727fb 100644 --- a/app/src/main/cpp/DngCreator.cpp +++ b/app/src/main/cpp/DngCreator.cpp @@ -116,6 +116,7 @@ ssize_t ByteVectorInput::skip(size_t count) */ status_t ByteVectorInput::close() { + return OK; } @@ -175,6 +176,7 @@ ssize_t ByteBufferInput::skip(size_t count) status_t ByteBufferInput::close() { + return OK; } diff --git a/app/src/main/cpp/PhoneDevice.cpp b/app/src/main/cpp/PhoneDevice.cpp index 944d806b..09b89386 100644 --- a/app/src/main/cpp/PhoneDevice.cpp +++ b/app/src/main/cpp/PhoneDevice.cpp @@ -1557,7 +1557,7 @@ bool CPhoneDevice::onBurstCapture(std::shared_ptr characteristi CPhoneCamera* pCamera = mCamera; mCamera = NULL; - std::thread th([=] + std::thread th([=]()mutable { cv::Mat rgb; std::vector > rawFiles; @@ -1704,6 +1704,7 @@ bool CPhoneDevice::onBurstCapture(std::shared_ptr characteristi } } + frames.clear(); std::thread closeThread(&CPhoneDevice::CloseCamera2, this, pCamera, photoInfo.photoId, turnOffOtg); m_threadClose.swap(closeThread); if (closeThread.joinable()) @@ -1758,7 +1759,7 @@ bool CPhoneDevice::onBurstCapture(std::shared_ptr characteristi std::vector rawFilePaths; for (auto it = rawFiles.cbegin(); it != rawFiles.cend(); ++it) { - std::string dngFilePath = tmpPath + std::to_string(std::distance(rawFiles.cbegin(), it)) + ".dng"; + std::string dngFilePath = tmpPath + "-" + std::to_string(std::distance(rawFiles.cbegin(), it)) + ".dng"; #ifdef _DEBUG char log[256] = { 0 }; strcpy(log, dngFilePath.c_str()); @@ -2369,6 +2370,10 @@ bool CPhoneDevice::PostProcessPhoto(const PHOTO_INFO& photoInfo, const vectorpThis = 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(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 requests; - std::vector 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(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) diff --git a/app/src/main/cpp/camera2/ndkcamera.h b/app/src/main/cpp/camera2/ndkcamera.h index 0298e64b..42df938e 100644 --- a/app/src/main/cpp/camera2/ndkcamera.h +++ b/app/src/main/cpp/camera2/ndkcamera.h @@ -171,6 +171,8 @@ public: void onSessionReady(ACameraCaptureSession *session); void onError(ACameraDevice* device, int error); + void CopyPreviewRequest(ACaptureRequest* request, const ACameraMetadata* previewResult); + uint32_t GetLdr() const { return mLdr; @@ -185,9 +187,6 @@ protected: std::mutex m_locker; std::set m_availableCameras; - std::atomic mFrameNumber; - -protected: CAMERA_PARAMS m_params; int camera_facing; int camera_orientation;