diff options
Diffstat (limited to 'camera')
-rw-r--r-- | camera/Android.mk | 5 | ||||
-rw-r--r-- | camera/CameraHal.cpp | 23 | ||||
-rw-r--r-- | camera/OMXCameraAdapter/OMXCameraAdapter.cpp | 60 | ||||
-rw-r--r-- | camera/OMXCameraAdapter/OMXCapture.cpp | 20 | ||||
-rw-r--r-- | camera/inc/CameraHal.h | 4 |
5 files changed, 101 insertions, 11 deletions
diff --git a/camera/Android.mk b/camera/Android.mk index 5759855..4f5d977 100644 --- a/camera/Android.mk +++ b/camera/Android.mk @@ -25,6 +25,11 @@ ifdef TI_CAMERAHAL_DEBUG_TIMESTAMPS CAMERAHAL_CFLAGS += -DTI_UTILS_DEBUG_USE_TIMESTAMPS endif +ifndef TI_CAMERAHAL_DONT_USE_RAW_IMAGE_SAVING + # Enabled saving RAW images to file + CAMERAHAL_CFLAGS += -DCAMERAHAL_USE_RAW_IMAGE_SAVING +endif + CAMERAHAL_CFLAGS += -DLOG_TAG=\"CameraHal\" OMAP4_CAMERA_HAL_SRC := \ diff --git a/camera/CameraHal.cpp b/camera/CameraHal.cpp index 1a67939..68a623b 100644 --- a/camera/CameraHal.cpp +++ b/camera/CameraHal.cpp @@ -47,6 +47,14 @@ const int CameraHal::SW_SCALING_FPS_LIMIT = 15; const uint32_t MessageNotifier::EVENT_BIT_FIELD_POSITION = 16; const uint32_t MessageNotifier::FRAME_BIT_FIELD_POSITION = 0; +#ifdef CAMERAHAL_USE_RAW_IMAGE_SAVING +// HACK: Default path to directory where RAW images coming from video port will be saved to. +// If directory not exists the saving is skipped and video port frame is ignored. +// The directory name is choosed in so weird way to enable RAW images saving only when +// directory has been created explicitly by user. +extern const char * const kRawImagesOutputDirPath = "/data/misc/camera/RaW_PiCtUrEs"; +#endif + /******************************************************************************/ #if PPM_INSTRUMENTATION || PPM_INSTRUMENTATION_ABS @@ -451,18 +459,20 @@ int CameraHal::setParameters(const CameraParameters& params) } } - if ( 0 == strcmp (valstr, TICameraParameters::PIXEL_FORMAT_RAW) ) { + mRawCapture = false; - mRawCapture = true; // RawCapture flag +#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; if ( (valstr = params.get(TICameraParameters::KEY_FILENAME_TIMESTAMP)) != NULL ) { - CAMHAL_LOGEB("FILENAME TIMESTAMP Value = %s", valstr); + CAMHAL_LOGD("FILENAME TIMESTAMP Value = %s", valstr); mParameters.set(TICameraParameters::KEY_FILENAME_TIMESTAMP, valstr); } - - } else { - mRawCapture = false; } +#endif if ( (valstr = params.get(TICameraParameters::KEY_S3D_CAP_FRAME_LAYOUT)) != NULL ) { @@ -2996,6 +3006,7 @@ CameraHal::~CameraHal() } freeImageBufs(); + freeRawBufs(); /// Free the memory manager mMemoryManager.clear(); 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 diff --git a/camera/inc/CameraHal.h b/camera/inc/CameraHal.h index 38dd802..53f5ade 100644 --- a/camera/inc/CameraHal.h +++ b/camera/inc/CameraHal.h @@ -120,6 +120,10 @@ namespace android { +#ifdef CAMERAHAL_USE_RAW_IMAGE_SAVING +extern const char * const kRawImagesOutputDirPath; +#endif + ///Forward declarations class CameraHal; class CameraFrame; |