停止拍照后等待一段时间,确保session停止

heatbeat
Matthew 3 months ago
parent ce96fcb46c
commit 15fd93a73a

@ -226,6 +226,7 @@ NdkCamera::NdkCamera(int32_t width, int32_t height, const NdkCamera::CAMERA_PARA
NdkCamera::~NdkCamera()
{
XYLOG(XYLOG_SEVERITY_DEBUG, "NdkCamera::~NdkCamera %s", mCameraId.c_str());
close();
}
@ -1000,6 +1001,8 @@ void NdkCamera::close()
}
*/
mPreviewResults.reset();
mCaptureResults.clear();
mCaptureFrames.clear();
if ((ACameraManager *)camera_manager != NULL)
@ -1009,7 +1012,8 @@ void NdkCamera::close()
if (capture_session)
{
// res = ACameraCaptureSession_stopRepeating(capture_session);
res = ACameraCaptureSession_stopRepeating(capture_session);
std::this_thread::sleep_for(std::chrono::milliseconds(512));
ACameraCaptureSession_close(capture_session);
capture_session = 0;
}
@ -1051,11 +1055,24 @@ void NdkCamera::close()
if (mPreviewImageReader != NULL)
{
#ifdef _DEBUG
ALOGD("Will Free mPreviewImageReader");
#endif
AImage* image = NULL;
media_status_t mstatus;
while ((mstatus = AImageReader_acquireNextImage(mPreviewImageReader, &image)) == AMEDIA_OK)
{
AImage_delete(image);
image = NULL;
}
AImageReader_setImageListener(mPreviewImageReader, NULL);
//XYLOG(XYLOG_SEVERITY_DEBUG, "CameraStatus::AImageReader_delete %s", mCameraId.c_str());
AImageReader_delete(mPreviewImageReader);
//XYLOG(XYLOG_SEVERITY_DEBUG, "CameraStatus::End AImageReader_delete %s", mCameraId.c_str());
mPreviewImageReader = 0;
#ifdef _DEBUG
ALOGD("After Free mPreviewImageReader");
#endif
}
if (mOutputTarget != NULL)
@ -1072,9 +1089,13 @@ void NdkCamera::close()
if (mImageReader != NULL)
{
#ifdef _DEBUG
ALOGD("Will Free mImageReader");
#endif
AImage* image = NULL;
int32_t status;
while ((status = AImageReader_acquireNextImage(mImageReader, &image)) == AMEDIA_OK) {
media_status_t mstatus;
while ((mstatus = AImageReader_acquireNextImage(mImageReader, &image)) == AMEDIA_OK)
{
AImage_delete(image);
image = NULL;
}
@ -1085,6 +1106,9 @@ void NdkCamera::close()
//XYLOG(XYLOG_SEVERITY_DEBUG, "CameraStatus::End AImageReader_delete %s", mCameraId.c_str());
mImageReader = 0;
#ifdef _DEBUG
ALOGD("After Free mImageReader");
#endif
}
if (mOutputTarget2 != NULL)
{
@ -1318,6 +1342,7 @@ void NdkCamera::onImageAvailable(AImageReader* reader)
if (captureCompleted && captureDispatchable)
{
XYLOG(XYLOG_SEVERITY_INFO,"onOneCapture from onImageAvailable");
camera_status_t status = ACameraCaptureSession_stopRepeating(capture_session);
onOneCapture(mCharacteristics, result, mFinalLdr, ts - m_startTime, mOneFrame);
}
}
@ -1798,6 +1823,7 @@ void NdkCamera::onCaptureCompleted(ACameraCaptureSession* session, ACaptureReque
if (captureCompleted && captureDispatchable)
{
XYLOG(XYLOG_SEVERITY_INFO,"onOneCapture from onCaptureCompleted");
camera_status_t status = ACameraCaptureSession_stopRepeating(capture_session);
onOneCapture(mCharacteristics, captureResult, mFinalLdr, ts - m_startTime, mOneFrame);
}
}
@ -1824,6 +1850,8 @@ void NdkCamera::onCaptureCompleted(ACameraCaptureSession* session, ACaptureReque
void NdkCamera::FireBurstCapture()
{
camera_status_t status = ACameraCaptureSession_stopRepeating(capture_session);
unsigned long long ts = GetMicroTimeStamp();
size_t expectedTimes = mCaptureRequests.size() - 1;

@ -268,6 +268,8 @@ protected:
std::shared_ptr<ACameraMetadata> mCharacteristics;
std::vector<CaptureRequest*> mCaptureRequests;
ACameraCaptureSession* capture_session;
std::shared_ptr<ACameraMetadata> mPreviewResults;
std::vector<std::shared_ptr<ACameraMetadata> > mCaptureResults;
uint32_t mLdr;
@ -279,8 +281,6 @@ protected:
cv::Mat mOneFrame;
std::vector<std::vector<uint8_t> > mRawFrames;
ACameraCaptureSession* capture_session;
// AImageReader* image_reader;
// ANativeWindow* image_reader_surface;
// ACameraOutputTarget* image_reader_target;

Loading…
Cancel
Save