改为单个请求连拍4帧

PtzNew
Matthew 3 months ago
parent 6a80e97a43
commit 5cf252b12f

@ -1004,6 +1004,7 @@ void NdkCamera::close()
mPreviewResults.reset(); mPreviewResults.reset();
mCaptureResults.clear(); mCaptureResults.clear();
mCaptureFrames.clear(); mCaptureFrames.clear();
mCaptureResultMap.clear();
if ((ACameraManager *)camera_manager != NULL) if ((ACameraManager *)camera_manager != NULL)
{ {
@ -1324,6 +1325,8 @@ void NdkCamera::onImageAvailable(AImageReader* reader)
} }
m_photoTaken = true; m_photoTaken = true;
int64_t frameTs = 0;
mstatus = AImage_getTimestamp(image, &frameTs);
AImage_delete(image); AImage_delete(image);
bool captureCompleted = false; bool captureCompleted = false;
@ -1331,13 +1334,26 @@ void NdkCamera::onImageAvailable(AImageReader* reader)
m_locker.lock(); m_locker.lock();
if (!frame.empty()) if (!frame.empty())
{ {
mOneFrame.push_back(frame); mOneFrame.push_back(std::make_pair<>(frameTs, frame));
} }
if (mCaptureResults.size() == expectedTimes && mOneFrame.size() == expectedTimes) if (mOneFrame.size() >= expectedTimes)
{ {
captureCompleted = true; bool allExisted = true;
} for (auto itFrame = mOneFrame.cbegin(); itFrame != mOneFrame.cend(); ++itFrame)
if (captureCompleted && !mCaptureDispatched) {
if (mCaptureResultMap.find(itFrame->first) == mCaptureResultMap.cend())
{
allExisted = false;
break;
}
}
if (allExisted)
{
captureCompleted = true;
}
}
if (captureCompleted && !mCaptureDispatched)
{ {
mCaptureDispatched = true; mCaptureDispatched = true;
captureDispatchable = true; captureDispatchable = true;
@ -1814,12 +1830,32 @@ void NdkCamera::onCaptureCompleted(ACameraCaptureSession* session, ACaptureReque
bool captureDispatchable = false; bool captureDispatchable = false;
size_t expectedTimes = mCaptureRequests.size() - 1; size_t expectedTimes = mCaptureRequests.size() - 1;
int64_t resultTimestamp = GetTimestamp(result);
std::shared_ptr<ACameraMetadata> captureResult(pCopy, ACameraMetadata_free); std::shared_ptr<ACameraMetadata> captureResult(pCopy, ACameraMetadata_free);
if (m_params.burstRawCapture == 0) if (m_params.burstRawCapture == 0)
{ {
m_locker.lock(); m_locker.lock();
mCaptureResults.push_back(captureResult); mCaptureResults.push_back(captureResult);
captureCompleted = mCaptureFrames.size() >= expectedTimes && mCaptureResults.size() >= expectedTimes; mCaptureResultMap[resultTimestamp] = captureResult;
if (mOneFrame.size() >= expectedTimes)
{
bool allExisted = true;
for (auto itFrame = mOneFrame.cbegin(); itFrame != mOneFrame.cend(); ++itFrame)
{
if (mCaptureResultMap.find(itFrame->first) == mCaptureResultMap.cend())
{
allExisted = false;
break;
}
}
if (allExisted)
{
captureCompleted = true;
}
}
if (captureCompleted && !mCaptureDispatched) if (captureCompleted && !mCaptureDispatched)
{ {
mCaptureDispatched = true; mCaptureDispatched = true;
@ -1856,6 +1892,18 @@ void NdkCamera::onCaptureCompleted(ACameraCaptureSession* session, ACaptureReque
} }
} }
int64_t NdkCamera::GetTimestamp(const ACameraMetadata* result)
{
ACameraMetadata_const_entry entry;
camera_status_t status = ACameraMetadata_getConstEntry(result, ACAMERA_SENSOR_TIMESTAMP, &entry);
if (status == ACAMERA_OK && entry.count > 0) {
return entry.data.i64[0];
}
return 0;
}
void NdkCamera::FireOneCapture(uint64_t ts) void NdkCamera::FireOneCapture(uint64_t ts)
{ {
#ifdef OUTPUT_DBG_INFO #ifdef OUTPUT_DBG_INFO
@ -1866,7 +1914,6 @@ void NdkCamera::FireOneCapture(uint64_t ts)
params.push_back(cv::IMWRITE_JPEG_QUALITY); params.push_back(cv::IMWRITE_JPEG_QUALITY);
params.push_back(50); params.push_back(50);
for (auto it = mOneFrame.cbegin(); it != mOneFrame.cend(); ++it) for (auto it = mOneFrame.cbegin(); it != mOneFrame.cend(); ++it)
{ {
std::string fileName = "/sdcard/com.xypower.mpapp/tmp/" + dt; std::string fileName = "/sdcard/com.xypower.mpapp/tmp/" + dt;
@ -1876,11 +1923,11 @@ void NdkCamera::FireOneCapture(uint64_t ts)
EnumCameraResult(result.get(), captureResult); EnumCameraResult(result.get(), captureResult);
fileName += "_" + mCameraId + "_" + std::to_string(captureResult.aeState) + "_" + std::to_string(idx) + ".jpg"; fileName += "_" + mCameraId + "_" + std::to_string(captureResult.aeState) + "_" + std::to_string(idx) + ".jpg";
cv::imwrite(fileName, *it, params); cv::imwrite(fileName, it->second, params);
} }
} }
#endif #endif
onOneCapture(mCharacteristics, mCaptureResults.back(), mFinalLdr, ts - m_startTime, mOneFrame.back()); onOneCapture(mCharacteristics, mCaptureResults.back(), mFinalLdr, ts - m_startTime, mOneFrame.back().second);
} }
void NdkCamera::FireBurstCapture() void NdkCamera::FireBurstCapture()

@ -23,6 +23,7 @@
#include <opencv2/core/core.hpp> #include <opencv2/core/core.hpp>
#include "Camera2Helper.h" #include "Camera2Helper.h"
#include <mutex> #include <mutex>
#include <map>
#include <set> #include <set>
/** /**
@ -196,6 +197,7 @@ public:
} }
bool IsCameraAvailable(const std::string& cameraId); bool IsCameraAvailable(const std::string& cameraId);
int64_t GetTimestamp(const ACameraMetadata* result);
static bool convertAImageToNv21(AImage* image, uint8_t** nv21, int32_t& width, int32_t& height); static bool convertAImageToNv21(AImage* image, uint8_t** nv21, int32_t& width, int32_t& height);
static void EnumCameraResult(ACameraMetadata* result, CAPTURE_RESULT& captureResult); static void EnumCameraResult(ACameraMetadata* result, CAPTURE_RESULT& captureResult);
@ -273,6 +275,7 @@ protected:
std::shared_ptr<ACameraMetadata> mPreviewResults; std::shared_ptr<ACameraMetadata> mPreviewResults;
std::vector<std::shared_ptr<ACameraMetadata> > mCaptureResults; std::vector<std::shared_ptr<ACameraMetadata> > mCaptureResults;
std::map<int64_t, std::shared_ptr<ACameraMetadata> > mCaptureResultMap;
uint32_t mLdr; uint32_t mLdr;
uint32_t mFinalLdr; uint32_t mFinalLdr;
uint32_t mFinalBurstCaptures; uint32_t mFinalBurstCaptures;
@ -280,7 +283,7 @@ protected:
std::vector<std::shared_ptr<AImage> > mCaptureFrames; std::vector<std::shared_ptr<AImage> > mCaptureFrames;
// cv::Mat mOneFrame; // cv::Mat mOneFrame;
std::vector<cv::Mat> mOneFrame; std::vector<std::pair<int64_t, cv::Mat> > mOneFrame;
std::vector<std::vector<uint8_t> > mRawFrames; std::vector<std::vector<uint8_t> > mRawFrames;
// AImageReader* image_reader; // AImageReader* image_reader;

Loading…
Cancel
Save