优化照片保存处理

streaming
Matthew 4 months ago
parent 2d90f18220
commit d6dc5729fe

@ -450,6 +450,7 @@ void CPhoneDevice::CJpegCamera::onImageAvailable(AImageReader* reader)
if (!(status == AMEDIA_OK && planeCount == 1))
{
// LOGE("Error: getNumberOfPlanes() planeCount = %d", planeCount);
AImage_delete(image);
return;
}
@ -1740,6 +1741,7 @@ bool CPhoneDevice::TakePhoto(const IDevice::PHOTO_INFO& photoInfo, const vector<
}
else if (photoInfo.cameraType == CAM_TYPE_PLZ)
{
XYLOG(XYLOG_SEVERITY_DEBUG, "PTZ PWR turned ON");
if(mPhotoInfo.scheduleTime == 0)
powerCtrlPtr = std::shared_ptr<PowerControl>(new PlzCameraPowerCtrl(mPhotoInfo.closeDelayTime));
else
@ -2246,7 +2248,7 @@ bool CPhoneDevice::onOneCapture(std::shared_ptr<ACameraMetadata> characteristics
}
CPhoneDevice* pThis = this;
std::thread th([pThis, characteristics, result, photoInfo, osds, path, rgb, facing, sensorOrientation, ldr, duration, takingTime]()mutable
std::thread th([pThis, characteristics, result, photoInfo, osds, path, rgb, facing, sensorOrientation, ldr, duration, takingTime]()
{
std::string cameraInfo;
if (photoInfo.outputDbgInfo != 0)
@ -3332,6 +3334,7 @@ bool CPhoneDevice::OnImageReady(cv::Mat mat)
#endif // OUTPUT_CAMERA_DBG_INFO
if (!std::filesystem::exists(std::filesystem::path(fullPath)) || getFileSize(fullPath) == 0)
{
bool res = cv::imwrite(fullPath.c_str(), mat, params);
if (!res)
@ -3590,27 +3593,61 @@ bool CPhoneDevice::PostProcessPhoto(const PHOTO_INFO& photoInfo, const vector<ID
bool res = false;
std::string fullPath = endsWith(path, ".jpg") ? path : (path + CTerminal::BuildPhotoFileName(photoInfo));
if (!std::filesystem::exists(std::filesystem::path(fullPath)))
if (!std::filesystem::exists(std::filesystem::path(fullPath)) || getFileSize(fullPath) == 0)
{
#ifdef _DEBUG
char log[256] = { 0 };
strcpy(log, fullPath.c_str());
#endif
bool res = cv::imwrite(fullPath.c_str(), mat, params);
#ifdef _DEBUG
if (getFileSize(fullPath.c_str()) == 0)
std::string tmpPath = fullPath;
replaceAll(tmpPath, "/photos/", "/tmp/");
#if 1
bool res = cv::imwrite(tmpPath.c_str(), mat, params);
size_t imgFileSize = getFileSize(tmpPath);
if (res && imgFileSize > 0)
{
int aa = 0;
res = (rename(tmpPath.c_str(), fullPath.c_str()) == 0);
}
else
{
remove(tmpPath.c_str());
res = false;
}
#else
bool res = cv::imwrite(fullPath.c_str(), mat, params);
size_t imgFileSize = getFileSize(fullPath);
#endif
#if 0
std::string bakPath = fullPath;
replaceAll(bakPath, "/photos/", "/backup/");
// cv::imwrite(bakPath.c_str(), mat, params);
vector<unsigned char> inImage;
imencode(".jpg", mat, inImage);
size_t bytesWrtten = 0;
if (!inImage.empty())
writeFile((bakPath + ".dat"), (const unsigned char*)&inImage[0], inImage.size());
bytesWrtten = getFileSize(bakPath + ".dat");
// #ifdef _DEBUG
size_t photoFileSize = getFileSize(fullPath);
XYLOG(XYLOG_SEVERITY_ERROR, "Photo File %s Size=%u BufSize=%u DataFileSize=%u", fullPath.c_str() + m_appPath.size(), (uint32_t)photoFileSize,
(uint32_t)inImage.size(), (uint32_t)bytesWrtten);
// #endif
#endif
if (!res)
{
XYLOG(XYLOG_SEVERITY_ERROR, "Failed to Write File: %s", fullPath.c_str() + m_appPath.size());
}
else
{
XYLOG(XYLOG_SEVERITY_INFO, "Succeeded to Write File: %s", fullPath.c_str() + m_appPath.size());
XYLOG(XYLOG_SEVERITY_INFO, "Succeeded to Write File: %s, FileSize=%u", fullPath.c_str() + m_appPath.size(), (uint32_t)imgFileSize);
}
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
TakePhotoCb(res ? 2 : 0, photoInfo, fullPath, photoInfo.photoTime, objs);
}
else

Loading…
Cancel
Save