summaryrefslogtreecommitdiffstats
path: root/camera
diff options
context:
space:
mode:
Diffstat (limited to 'camera')
-rw-r--r--camera/Android.mk5
-rw-r--r--camera/CameraHal.cpp23
-rw-r--r--camera/OMXCameraAdapter/OMXCameraAdapter.cpp60
-rw-r--r--camera/OMXCameraAdapter/OMXCapture.cpp20
-rw-r--r--camera/inc/CameraHal.h4
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 &params,
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;