调整拍照的实现

利用双Request来实现预览和拍摄。后期可以支持Burst Capture
TempBranch
Matthew 9 months ago
parent a068cf6815
commit f95a79ba89

@ -159,7 +159,7 @@ static inline uint32_t YUV2RGB(int nY, int nU, int nV) {
return 0xff000000 | (nR << 16) | (nG << 8) | nB;
}
CPhoneDevice::CPhoneCamera::CPhoneCamera(CPhoneDevice* dev, int32_t width, int32_t height, const NdkCamera::CAMERA_PARAMS& params) : NdkCamera(width, height, params), m_dev(dev)
CPhoneDevice::CPhoneCamera::CPhoneCamera(CPhoneDevice* dev, int32_t width, int32_t height, const NdkCamera::CAMERA_PARAMS& params, int burstCaptures) : NdkCamera(width, height, params, burstCaptures), m_dev(dev)
{
}
@ -258,19 +258,6 @@ void CPhoneDevice::CJpegCamera::onImageAvailable(AImageReader* reader)
}
#endif
if (m_imagesCaptured == ~0 || m_imagesCaptured != EXPECTED_CAPTURE_IDX)
{
// XYLOG(XYLOG_SEVERITY_DEBUG, "m_imagesCaptured=%u wait for next image", m_imagesCaptured);
// Not Ready Or Taken
AImage_delete(image);
if (m_imagesCaptured != ~0)
{
XYLOG(XYLOG_SEVERITY_DEBUG, "Skip Image index=%u", m_imagesCaptured);
m_imagesCaptured++;
}
return;
}
XYLOG(XYLOG_SEVERITY_INFO, "Photo Taken: AES=%u AFS=%u AWBS=%u", (uint32_t)mFinalResult.aeState, (uint32_t)mFinalResult.awbState, (uint32_t)mFinalResult.afState);
mFinalResult.duration = GetMicroTimeStamp() - m_startTime;
@ -308,7 +295,6 @@ void CPhoneDevice::CJpegCamera::onImageAvailable(AImageReader* reader)
}
AImage_delete(image);
m_imagesCaptured ++;
}
int32_t CPhoneDevice::CJpegCamera::getOutputFormat() const
@ -1779,7 +1765,7 @@ bool CPhoneDevice::OnImageReady(cv::Mat& mat)
XYLOG(XYLOG_SEVERITY_ERROR, "Photo is TOO dark or light(LDR=%u), will RETRY it",
(uint32_t) captureResult.avgY);
mPhotoInfo.usingRawFormat = 1;
// mPhotoInfo.usingRawFormat = 1;
}
}
else if (captureResult.avgY > MAX_LIGHT_Y)

@ -156,7 +156,7 @@ public:
class CPhoneCamera : public NdkCamera
{
public:
CPhoneCamera(CPhoneDevice* dev, int32_t width, int32_t height, const NdkCamera::CAMERA_PARAMS& params);
CPhoneCamera(CPhoneDevice* dev, int32_t width, int32_t height, const NdkCamera::CAMERA_PARAMS& params, int burstCaptures = 1);
virtual ~CPhoneCamera();
virtual bool on_image(cv::Mat& rgb);
virtual void on_error(const std::string& msg);

File diff suppressed because it is too large Load Diff

@ -38,8 +38,7 @@ static const uint64_t kMaxExposureTime = static_cast<uint64_t>(250000000);
#define WAIT_AWB_LOCKED 2
#define WAIT_AF_LOCKED 4
// #define EXPECTED_CAPTURE_IDX 0
#define EXPECTED_CAPTURE_IDX 1
#define PREVIEW_REQUEST_IDX 0
class CameraManager
{
@ -105,8 +104,8 @@ public:
int32_t compensation;
uint8_t sceneMode;
uint8_t awbMode;
uint16_t avgY;
float zoomRatio;
uint8_t avgY;
uint64_t duration;
int64_t frameDuration;
@ -115,7 +114,28 @@ public:
uint8_t afLockSetted : 1;
};
NdkCamera(int32_t width, int32_t height, const CAMERA_PARAMS& params);
struct CaptureRequest
{
/* For image capture */
NdkCamera* pThis;
AImageReader* imageReader;
ANativeWindow* imageWindow;
ACameraOutputTarget* imageTarget;
ACaptureSessionOutput* sessionOutput;
ACaptureRequest* request;
ACameraDevice_request_template templateId;
int sessionSequenceId;
};
struct CaptureResult
{
ACameraMetadata* result;
AImage* image;
int sequenceId;
};
NdkCamera(int32_t width, int32_t height, const CAMERA_PARAMS& params, int burstCaptures = 1);
virtual ~NdkCamera();
// facing 0=front 1=back
@ -123,12 +143,19 @@ public:
void close();
int selfTest(const std::string& cameraId, int32_t& maxResolutionX, int32_t& maxResolutionY);
void writeJpegFile(AImage *image, const char* path);
void writeRawFile(AImage *image, const char* path);
void onAvailabilityCallback(const char* cameraId);
void onUnavailabilityCallback(const char* cameraId);
virtual void onImageAvailable(AImageReader* reader);
virtual int32_t getOutputFormat() const;
void CreateSession(ANativeWindow* previewWindow, ANativeWindow* jpgWindow, bool manaulPreview, int32_t imageRotation, int32_t width, int32_t height);
void CreateSession(ANativeWindow* previewWindow);
void DestroySession();
virtual bool on_image(cv::Mat& rgb);
virtual void on_error(const std::string& msg);
virtual void on_image(const unsigned char* nv21, int nv21_width, int nv21_height);
@ -151,8 +178,12 @@ protected:
std::mutex m_locker;
std::set<std::string> m_availableCameras;
std::atomic<uint32_t> mFrameNumber;
protected:
CAMERA_PARAMS m_params;
int mBurstCaptures;
int camera_facing;
int camera_orientation;
bool m_firstFrame;
@ -181,7 +212,7 @@ protected:
int32_t activeArraySize[2];
int32_t maxRegions[3];
unsigned int m_imagesCaptured;
bool mCaptureTriggered;
CAPTURE_RESULT mResult;
CAPTURE_RESULT mFinalResult;
@ -193,15 +224,29 @@ protected:
CameraManager camera_manager;
ACameraDevice* camera_device;
AImageReader* image_reader;
ANativeWindow* image_reader_surface;
ACameraOutputTarget* image_reader_target;
ACaptureRequest* capture_request;
ACaptureSessionOutputContainer* capture_session_output_container;
ACaptureSessionOutput* capture_session_output;
AImageReader* mPreviewImageReader;
ANativeWindow* mPreviewImageWindow;
ACameraOutputTarget* mPreviewOutputTarget;
AImageReader* mImageReader;
ANativeWindow* mImageWindow;
ACameraOutputTarget* mOutputTarget;
std::vector<CaptureRequest*> mCaptureRequests;
std::vector<CaptureResult> mCaptureResults;
ACameraCaptureSession* capture_session;
int captureSequenceId;
// AImageReader* image_reader;
// ANativeWindow* image_reader_surface;
// ACameraOutputTarget* image_reader_target;
// ACaptureRequest* capture_request;
// ACaptureSessionOutput* capture_session_output;
};
#endif // NDKCAMERA_H

@ -21,7 +21,7 @@ android.enableJetifier=true
BUILD_TOOLS_VERSION=33.0.3
COMPILE_SDK_VERSION=33
TARGET_SDK_VERSION=28
COMPILE_MIN_SDK_VERSION=25
COMPILE_MIN_SDK_VERSION=28
opencvsdk=D:/Workspace/deps/opencv-mobile-4.9.0-android
coreroot=D:/Workspace/Github/xymp/xymp/Core

Loading…
Cancel
Save