diff options
Diffstat (limited to 'camera/OMXCameraAdapter')
-rw-r--r-- | camera/OMXCameraAdapter/OMXCameraAdapter.cpp | 60 | ||||
-rw-r--r-- | camera/OMXCameraAdapter/OMXCapture.cpp | 20 |
2 files changed, 75 insertions, 5 deletions
diff --git a/camera/OMXCameraAdapter/OMXCameraAdapter.cpp b/camera/OMXCameraAdapter/OMXCameraAdapter.cpp index 267ef67..3e00286 100644 --- a/camera/OMXCameraAdapter/OMXCameraAdapter.cpp +++ b/camera/OMXCameraAdapter/OMXCameraAdapter.cpp @@ -33,7 +33,6 @@ static int mDebugFps = 0; static int mDebugFcs = 0; - #define HERE(Msg) {CAMHAL_LOGEB("--===line %d, %s===--\n", __LINE__, Msg);} namespace android { @@ -658,6 +657,29 @@ void saveFile(unsigned char *buff, int width, int height, int format) { LOG_FUNCTION_NAME_EXIT; } +#ifdef CAMERAHAL_USE_RAW_IMAGE_SAVING +static status_t saveRaw(const void *buf, unsigned int size, const char *filename) +{ + status_t ret = NO_ERROR; + + const int fd = open(filename, O_CREAT | O_WRONLY | O_SYNC | O_TRUNC, 0644); + if (fd < 0) { + CAMHAL_LOGE("ERROR: %s, Unable to save raw file", strerror(fd)); + return BAD_VALUE; + } + + if (write(fd, buf, size) != (signed)size) { + CAMHAL_LOGE("ERROR: Unable to write to raw file"); + ret = NO_MEMORY; + } else { + CAMHAL_LOGD("buffer=%p, size=%d stored at %s", buf, size, filename); + } + + close(fd); + return ret; +} +#endif + void OMXCameraAdapter::getParameters(CameraParameters& params) { status_t ret = NO_ERROR; @@ -3226,11 +3248,43 @@ OMX_ERRORTYPE OMXCameraAdapter::OMXCameraAdapterFillBufferDone(OMX_IN OMX_HANDLE } } - CAMHAL_LOGEB ("RAW buffer done on video port, length = %d", pBuffHeader->nFilledLen); + CAMHAL_LOGD("RAW buffer done on video port, length = %d", pBuffHeader->nFilledLen); mask = (unsigned int) CameraFrame::RAW_FRAME; - stat = sendCallBacks(cameraFrame, pBuffHeader, mask, pPortParam); +#ifdef CAMERAHAL_USE_RAW_IMAGE_SAVING + time_t rawSaveTime; + struct tm * rawTimeStamp; + struct timeval rawTimeStampUsec; + + char rawFilename[256]; + + time ( &rawSaveTime ); + gettimeofday(&rawTimeStampUsec, NULL); + rawTimeStamp = gmtime ( &rawSaveTime ); + + snprintf(rawFilename,256, "%s/raw_%d_%d_%d_%lu.raw", + kRawImagesOutputDirPath, + rawTimeStamp->tm_hour, + rawTimeStamp->tm_min, + rawTimeStamp->tm_sec, + rawTimeStampUsec.tv_usec); + + status_t statRaw = saveRaw(pBuffHeader->pBuffer, pBuffHeader->nFilledLen, rawFilename); + + if(NO_ERROR == statRaw) { + + CAMHAL_LOGD("raw_%d_%d_%d_%lu.raw successfully saved in %s", + rawTimeStamp->tm_hour, + rawTimeStamp->tm_min, + rawTimeStamp->tm_sec, + rawTimeStampUsec.tv_usec, + kRawImagesOutputDirPath); + stat = sendCallBacks(cameraFrame, pBuffHeader, mask, pPortParam); + } else { + CAMHAL_LOGE("ERROR: %d , while saving raw!", statRaw); + } +#endif } else { CAMHAL_LOGEA("Frame received for non-(preview/capture/measure) port. This is yet to be supported"); goto EXIT; diff --git a/camera/OMXCameraAdapter/OMXCapture.cpp b/camera/OMXCameraAdapter/OMXCapture.cpp index d201351..d9a4228 100644 --- a/camera/OMXCameraAdapter/OMXCapture.cpp +++ b/camera/OMXCameraAdapter/OMXCapture.cpp @@ -67,8 +67,17 @@ status_t OMXCameraAdapter::setParametersCapture(const CameraParameters ¶ms, CAMHAL_LOGVB("Image: cap.mWidth = %d", (int)cap->mWidth); CAMHAL_LOGVB("Image: cap.mHeight = %d", (int)cap->mHeight); + mRawCapture = false; + +#ifdef CAMERAHAL_USE_RAW_IMAGE_SAVING + valstr = params.get(TICameraParameters::KEY_CAP_MODE); + if ( (!valstr || strcmp(valstr, TICameraParameters::HIGH_QUALITY_MODE) == 0) && + access(kRawImagesOutputDirPath, F_OK) != -1 ) { + mRawCapture = true; + } +#endif + if ((valstr = params.getPictureFormat()) != NULL) { - mRawCapture = false; if (strcmp(valstr, (const char *) CameraParameters::PIXEL_FORMAT_YUV422I) == 0) { CAMHAL_LOGDA("CbYCrY format selected"); pixFormat = OMX_COLOR_FormatCbYCrY; @@ -1294,7 +1303,10 @@ status_t OMXCameraAdapter::UseBuffersCapture(void* bufArr, int num) } mCapturedFrames = mBurstFrames; - mCaptureConfigured = true; + + if (!mRawCapture) { + mCaptureConfigured = true; + } return (ret | ErrorUtils::omxToAndroidError(eError)); @@ -1321,6 +1333,10 @@ status_t OMXCameraAdapter::UseBuffersRawCapture(void* bufArr, int num) imgRawCaptureData = &mCameraAdapterParameters.mCameraPortParams[mCameraAdapterParameters.mVideoPortIndex]; + if (mCaptureConfigured) { + return NO_ERROR; + } + camSem.Create(); // mWaitingForSnapshot is true only when we're in the process of capturing |