优化代码

nx2024TEMP
Matthew 8 months ago
parent ba72ed5cc3
commit fbcb14d35f

@ -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;
}

@ -1557,7 +1557,7 @@ bool CPhoneDevice::onBurstCapture(std::shared_ptr<ACameraMetadata> characteristi
CPhoneCamera* pCamera = mCamera;
mCamera = NULL;
std::thread th([=]
std::thread th([=]()mutable
{
cv::Mat rgb;
std::vector<std::vector<uint8_t> > rawFiles;
@ -1704,6 +1704,7 @@ bool CPhoneDevice::onBurstCapture(std::shared_ptr<ACameraMetadata> 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<ACameraMetadata> characteristi
std::vector<std::string> 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 vector<ID
if (!std::filesystem::exists(std::filesystem::path(fullPath)))
{
#ifdef _DEBUG
char log[256] = { 0 };
strcpy(log, fullPath.c_str());
#endif
bool res = cv::imwrite(fullPath.c_str(), mat, params);
if (!res)
{

@ -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)

@ -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<std::string> m_availableCameras;
std::atomic<uint32_t> mFrameNumber;
protected:
CAMERA_PARAMS m_params;
int camera_facing;
int camera_orientation;

Loading…
Cancel
Save